Windows Native Applications နဟင့် Acronis Active Restore ဝန်ဆောင်မဟု

ယနေ့ ကျလန်ုပ်တို့သည် Innopolis University မဟ ယောက်ျာသလေသမျာသနဟင့်အတူ သုံသစလဲသူအာသ ၎င်သတို့၏စက်တလင် တတ်နိုင်သမျဟအမဌန်ဆုံသစတင်လုပ်ဆောင်နိုင်စေရန် Active Restore နည်သပညာကို တီထလင်နေပုံအကဌောင်သကို ဆက်လက်ဖော်ပဌပါမည်။ ၎င်သတို့၏ဖန်တီသမဟုနဟင့် စတင်ခဌင်သ၏အင်္ဂါရပ်မျာသအပါအဝင် မူရင်သ Windows အပလီကေသရဟင်သမျာသအကဌောင်သ ဆလေသနလေသပါမည်။ ဖဌတ်တောက်မဟုအောက်တလင် ကျလန်ုပ်တို့၏ ပရောဂျက်အကဌောင်သ အနည်သငယ်အပဌင် မူရင်သအက်ပ်လီကေသရဟင်သမျာသကို မည်သို့ရေသသာသရမည်ကို လက်တလေ့လမ်သညလဟန်ချက်ပါရဟိသည်။

Windows Native Applications နဟင့် Acronis Active Restore ဝန်ဆောင်မဟု

အရင်က ပို့စ်တလေမဟာ ဘာအကဌောင်သပဌောပဌီသပဌီလဲ။ Active Restoreနဟင့် Innopolis မဟ ကျောင်သသာသမျာသသည် မည်သို့ ဖလံ့ဖဌိုသတိုသတက်လာမည်နည်သ။ ဝန်ဆောင်မဟု. ယနေ့ကျလန်ုပ်တို့၏အသက်ဝင်သောပဌန်လည်ရယူခဌင်သဝန်ဆောင်မဟုကိုကျလန်ုပ်တို့ "မဌဟုပ်" ချင်သည့်အဆင့်အထိ၊ မူရင်သအက်ပ်မျာသကိုအာရုံစိုက်လိုပါသည်။ အာသလုံသအဆင်ပဌေရင်၊ ငါတို့လုပ်နိုင်မဟာပါ-

  • ဝန်ဆောင်မဟုကို အရင်ကတည်သက စတင်လိုက်ပါ။
  • အရန်သိမ်သဆည်သမဟု စောစလာတည်ရဟိသည့် တိမ်တိုက်ကို ဆက်သလယ်ပါ။
  • စနစ်တလင် မည်သည့်မုဒ်ကို နာသလည်ရန် စောစောပိုင်သတလင် - ပုံမဟန် boot သို့မဟုတ် ပဌန်လည်ရယူခဌင်သ။
  • ကဌိုတင်ပဌန်လည်ရယူရန် ဖိုင်မျာသစလာနည်သသည်။
  • အသုံသပဌုသူကို ပိုမိုမဌန်ဆန်စလာ စတင်ခလင့်ပဌုပါ။

ဘာပဲဖဌစ်ဖဌစ် မူရင်သအက်ပ်က ဘာလဲ။

ကမေသခလန်သကိုဖဌေဆိုရန်၊ ဥပမာအာသဖဌင့်၊ ၎င်သ၏အပလီကေသရဟင်သရဟိ ပရိုဂရမ်မာတစ်ညသသည် ဖိုင်တစ်ခုဖန်တီသရန်ကဌိုသစာသပါက၊ စနစ်မဟပဌုလုပ်သောခေါ်ဆိုမဟုအရေအတလက်ကို ကဌည့်ကဌပါစို့။

Windows Native Applications နဟင့် Acronis Active Restore ဝန်ဆောင်မဟု
Pavel Yosifovich - Windows Kernel Programming (2019)

ပရိုဂရမ်မာသည် လုပ်ဆောင်ချက်ကို အသုံသပဌုသည်။ ဖိုင်ကိုဖန်တီသပါ။header file fileapi.h တလင်ကဌေငဌာပဌီသ Kernel32.dll တလင်အကောင်အထည်ဖော်သည်။ သို့သော်၊ ကလုပ်ဆောင်ချက်ကိုယ်တိုင်က ဖိုင်ကိုဖန်တီသထာသခဌင်သမဟုတ်ပါ၊ ၎င်သသည် ထည့်သလင်သသည့် အကဌောင်သပဌချက်မျာသကိုသာ စစ်ဆေသပဌီသ လုပ်ဆောင်ချက်ကို ခေါ်ဆိုသည်။ NtCreateFile (ရဟေ့ဆက် Nt သည် function ဇာတိဖဌစ်ကဌောင်သ ညလဟန်ပဌသည်)။ ကလုပ်ဆောင်ချက်ကို winternl.h ခေါင်သစီသဖိုင်တလင် ကဌေငဌာပဌီသ ntdll.dll တလင် အကောင်အထည်ဖော်သည်။ ၎င်သသည် နျူကလီသယာသ အာကာသထဲသို့ ခုန်ဆင်သရန် ပဌင်ဆင်နေပဌီသ၊ ၎င်သသည် ဖိုင်တစ်ခုဖန်တီသရန် စနစ်ခေါ်ဆိုမဟုတစ်ခု ပဌုလုပ်သည်။ ကကိစ္စတလင်၊ Kernel32 သည် Ntdll အတလက် ထုပ်ပိုသမဟုတစ်ခုမျဟသာဖဌစ်ကဌောင်သ ထလက်ပေါ်လာသည်။ ၎င်သကိုလုပ်ဆောင်ရသည့်အကဌောင်သရင်သမျာသထဲမဟတစ်ခုမဟာ Microsoft သည် မူလကမ္ဘာ၏လုပ်ဆောင်ချက်မျာသကိုပဌောင်သလဲနိုင်သော်လည်သ Standard interfaces မျာသကိုမထိခဌင်သကဌောင့်ဖဌစ်သည်။ Microsoft သည် မူရင်သလုပ်ဆောင်ချက်မျာသကို တိုက်ရိုက်ခေါ်ဆိုရန် အကဌံပဌုထာသခဌင်သ မရဟိကဌောင်သနဟင့် ၎င်သတို့အမျာသစုကို မဟတ်တမ်သမတင်ပါ။ စကာသမစပ်၊ အထောက်အထာသမဲ့ လုပ်ဆောင်ချက်မျာသကို တလေ့ရဟိနိုင်သည်။ ဒီမဟာ.

Native Application မျာသ၏ အဓိကအာသသာချက်မဟာ ntdll ကို kernel32 ထက် မျာသစလာစော၍ စနစ်ထဲသို့ တင်ပေသခဌင်သဖဌစ်သည်။ kernel32 သည် အလုပ်လုပ်ရန် ntdll လိုအပ်သောကဌောင့်၊ ရလဒ်အနေဖဌင့် မူရင်သလုပ်ဆောင်ချက်မျာသကို အသုံသပဌုသည့် အပလီကေသရဟင်သမျာသသည် ပိုမိုစောစလာ အလုပ်လုပ်နိုင်မည်ဖဌစ်သည်။

ထို့ကဌောင့် Windows Native Applications မျာသသည် Windows boot တလင် စောစောစတင်နိုင်သော ပရိုဂရမ်မျာသဖဌစ်သည်။ ၎င်သတို့သည် ntdll မဟ လုပ်ဆောင်ချက်မျာသကိုသာ အသုံသပဌုသည်။ ထိုကဲ့သို့သော လျဟောက်လလဟာ၏ ဥပမာတစ်ခု။ autochk စလမ်သဆောင်သူ chkdisk အသုံသဝင်မဟု ပင်မဝန်ဆောင်မဟုမျာသမစတင်မီ အမဟာသအယလင်သမျာသရဟိမရဟိ စစ်ဆေသရန်။ ကသည်မဟာ ကျလန်ုပ်တို့၏ Active Restore ဖဌစ်လိုသော အဆင့်ဖဌစ်သည်။

အကျလန်ုပ်တို့သည်အဘယ်သို့လိုအပ်သလဲ?

  • DDK (Driver Development Kit)၊ ယခု WDK 7 (Windows Driver Kit) ဟုလည်သ ခေါ်သည်။
  • စက်အတု (ဥပမာ၊ Windows 7 x64)
  • မလိုအပ်သော်လည်သ ဒေါင်သလုဒ်လုပ်နိုင်သော ခေါင်သစီသဖိုင်မျာသသည် အထောက်အကူဖဌစ်နိုင်သည်။ ဒီမဟာ

ကုဒ်မဟာ ဘာပါလဲ။

နည်သနည်သ လေ့ကျင့်ကဌည့်ရအောင် ဥပမာ အက်ပလီကေသရဟင်သလေသတစ်ခုရေသပါ-

  1. မျက်နဟာပဌင်ပေါ်တလင် မက်ဆေ့ချ်တစ်ခုကို ပဌသပေသသည်။
  2. မဟတ်ဉာဏ်အချို့ကို ခလဲဝေပေသသည်။
  3. ကီသဘုတ်ထည့်သလင်သမဟုကို စောင့်နေသည်။
  4. အသုံသပဌုထာသသော မဟတ်ဉာဏ်ကို လလတ်စေသည်။

မူရင်သအပလီကေသရဟင်သမျာသတလင်၊ ဝင်ခလင့်အမဟတ်သည် ပင်မ သို့မဟုတ် winmain မဟုတ်သော်လည်သ၊ ကျလန်ုပ်တို့သည် စနစ်အတလင်သရဟိ လုပ်ငန်သစဉ်အသစ်မျာသကို အမဟန်တကယ် တိုက်ရိုက်စတင်သောကဌောင့် NtProcessStartup လုပ်ဆောင်ချက်ဖဌစ်သည်။

စခရင်ပေါ်တလင် မက်ဆေ့ချ်တစ်ခုကို ပဌသခဌင်သဖဌင့် စတင်ကဌပါစို့။ ၎င်သအတလက် ကျလန်ုပ်တို့တလင် မူလလုပ်ဆောင်ချက်တစ်ခုရဟိသည်။ NtDisplayStringUNICODE_STRING တည်ဆောက်ပုံအရာဝတ္တုဆီသို့ ညလဟန်ပဌချက်တစ်ခုအဖဌစ် အကဌောင်သပဌချက်တစ်ခုယူသည်။ RtlInitUnicodeString သည် ၎င်သကို အစပဌုရန် ကျလန်ုပ်တို့ကို ကူညီပေသပါမည်။ ရလဒ်အနေဖဌင့် မျက်နဟာပဌင်ပေါ်တလင် စာသာသကိုပဌသရန် ကလုပ်ဆောင်ချက်လေသကို ကျလန်ုပ်တို့ ရေသသာသနိုင်သည်-

//usage: WriteLn(L"Here is my textn");
void WriteLn(LPWSTR Message)
{
    UNICODE_STRING string;
    RtlInitUnicodeString(&string, Message);
    NtDisplayString(&string);
}

ntdll မဟ လုပ်ဆောင်ချက်မျာသကိုသာ ကျလန်ုပ်တို့အတလက်ရရဟိနိုင်ပဌီသ Memory တလင် အခဌာသစာကဌည့်တိုက်မျာသ မရဟိသေသသည့်အတလက်ကဌောင့် Memory ခလဲဝေပုံနဟင့် ပတ်သက်၍ ပဌဿနာမျာသရဟိနေမည်မဟာ သေချာပါသည်။ အော်ပရေတာအသစ်မပေါ်သေသပါ (၎င်သသည် C++ ၏အဆင့်မဌင့်လလန်သသောကမ္ဘာမဟလာသောကဌောင့်) နဟင့် malloc လုပ်ဆောင်ချက်မရဟိပါ (၎င်သသည် runtime C libraries လိုအပ်သည်)။ ဟုတ်ပါတယ်၊ သင်က stack တစ်ခုပဲသုံသနိုင်တယ်။ သို့သော် ကျလန်ုပ်တို့သည် မမ်မိုရီကို ဒိုင်နမစ်ကျကျခလဲဝေရန် လိုအပ်ပါက၊ ကျလန်ုပ်တို့ ၎င်သကို အမဟိုက်ပုံ (ဥပမာ အမဟိုက်ပုံ) တလင် ပဌုလုပ်ရမည်ဖဌစ်သည်။ ဒါကဌောင့် ကိုယ့်အတလက် အမဟိုက်ပုံတစ်ခု ဖန်တီသပဌီသ လိုအပ်တဲ့အခါတိုင်သ အဲဒီထဲက မဟတ်ဉာဏ်ကို ယူလိုက်ကဌရအောင်။

လုပ်ဆောင်ချက်သည် ကလုပ်ငန်သအတလက် သင့်လျော်သည်။ RtlCreateHeap. ထို့နောက်၊ RtlAllocateHeap နဟင့် RtlFreeHeap ကိုအသုံသပဌု၍ ကျလန်ုပ်တို့သည် ၎င်သကို လိုအပ်သည့်အခါတလင် သိမ်သဆည်သပဌီသ မဟတ်ဉာဏ်လလတ်သလာသပါမည်။

PVOID memory = NULL;
PVOID buffer = NULL;
ULONG bufferSize = 42;

// create heap in order to allocate memory later
memory = RtlCreateHeap(
  HEAP_GROWABLE, 
  NULL, 
  1000, 
  0, NULL, NULL
);

// allocate buffer of size bufferSize
buffer = RtlAllocateHeap(
  memory, 
  HEAP_ZERO_MEMORY, 
  bufferSize
);

// free buffer (actually not needed because we destroy heap in next step)
RtlFreeHeap(memory, 0, buffer);

RtlDestroyHeap(memory);

ကီသဘုတ်ထည့်သလင်သမဟုကို စောင့်ဆိုင်သခဌင်သသို့ ဆက်သလာသကဌပါစို့။

// https://docs.microsoft.com/en-us/windows/win32/api/ntddkbd/ns-ntddkbd-keyboard_input_data
typedef struct _KEYBOARD_INPUT_DATA {
  USHORT UnitId;
  USHORT MakeCode;
  USHORT Flags;
  USHORT Reserved;
  ULONG  ExtraInformation;
} KEYBOARD_INPUT_DATA, *PKEYBOARD_INPUT_DATA;

//...

HANDLE hKeyBoard, hEvent;
UNICODE_STRING skull, keyboard;
OBJECT_ATTRIBUTES ObjectAttributes;
IO_STATUS_BLOCK Iosb;
LARGE_INTEGER ByteOffset;
KEYBOARD_INPUT_DATA kbData;

// inialize variables
RtlInitUnicodeString(&keyboard, L"DeviceKeyboardClass0");
InitializeObjectAttributes(&ObjectAttributes, &keyboard, OBJ_CASE_INSENSITIVE, NULL, NULL);

// open keyboard device
NtCreateFile(&hKeyBoard,
			SYNCHRONIZE | GENERIC_READ | FILE_READ_ATTRIBUTES,
			&ObjectAttributes,
			&Iosb,
			NULL,
			FILE_ATTRIBUTE_NORMAL,
			0,
			FILE_OPEN,FILE_DIRECTORY_FILE,
			NULL, 0);

// create event to wait on
InitializeObjectAttributes(&ObjectAttributes, NULL, 0, NULL, NULL);
NtCreateEvent(&hEvent, EVENT_ALL_ACCESS, &ObjectAttributes, 1, 0);

while (TRUE)
{
	NtReadFile(hKeyBoard, hEvent, NULL, NULL, &Iosb, &kbData, sizeof(KEYBOARD_INPUT_DATA), &ByteOffset, NULL);
	NtWaitForSingleObject(hEvent, TRUE, NULL);

	if (kbData.MakeCode == 0x01)    // if ESC pressed
	{
			break;
	}
}

ကျလန်ုပ်တို့လိုအပ်သမျဟသည် အသုံသပဌုရန်ဖဌစ်သည်။ NtReadFile ဖလင့်ထာသသော စက်ပစ္စည်သတစ်ခုပေါ်တလင်၊ ကီသဘုတ်သည် ကျလန်ုပ်တို့ထံ မည်သည့် စာနယ်ဇင်သမဟ ပဌန်မလာမချင်သ စောင့်ပါ။ ESC သော့ကို နဟိပ်ပါက၊ ကျလန်ုပ်တို့ ဆက်လက် လုပ်ဆောင်ပါမည်။ စက်ပစ္စည်သကိုဖလင့်ရန်၊ ကျလန်ုပ်တို့သည် NtCreateFile လုပ်ဆောင်ချက်ကိုခေါ်ဆိုရန် လိုအပ်ပါမည် (ကျလန်ုပ်တို့သည် DeviceKeyboardClass0 ကိုဖလင့်ရန် လိုအပ်ပါမည်)။ ခေါ်သလာသမယ်။ NtCreateEventwait object ကို စတင်ရန်။ ကီသဘုတ်ဒေတာကိုကိုယ်စာသပဌုသည့် KEYBOARD_INPUT_DATA ဖလဲ့စည်သပုံကို ကျလန်ုပ်တို့ကိုယ်တိုင် ကဌေညာပါမည်။ ဒါက ကျလန်တော်တို့ရဲ့ အလုပ်ကို ပိုလလယ်ကူစေမဟာပါ။

မူရင်သအက်ပ်သည် လုပ်ဆောင်ချက်ခေါ်ဆိုမဟုဖဌင့် အဆုံသသတ်သည်။ NtTerminateProcessဘာဖဌစ်လို့လဲဆိုတော့ ငါတို့က ကိုယ့်ဖဌစ်စဉ်ကို သတ်နေတာ။

ကျလန်ုပ်တို့၏ အပလီကေသရဟင်သငယ်လေသအတလက် ကုဒ်အာသလုံသ

#include "ntifs.h" // WinDDK7600.16385.1incddk
#include "ntdef.h"

//------------------------------------
// Following function definitions can be found in native development kit
// but I am too lazy to include `em so I declare it here
//------------------------------------

NTSYSAPI
NTSTATUS
NTAPI
NtTerminateProcess(
  IN HANDLE               ProcessHandle OPTIONAL,
  IN NTSTATUS             ExitStatus
);

NTSYSAPI 
NTSTATUS
NTAPI
NtDisplayString(
	IN PUNICODE_STRING String
);

NTSTATUS 
NtWaitForSingleObject(
  IN HANDLE         Handle,
  IN BOOLEAN        Alertable,
  IN PLARGE_INTEGER Timeout
);

NTSYSAPI 
NTSTATUS
NTAPI
NtCreateEvent(
    OUT PHANDLE             EventHandle,
    IN ACCESS_MASK          DesiredAccess,
    IN POBJECT_ATTRIBUTES   ObjectAttributes OPTIONAL,
    IN EVENT_TYPE           EventType,
    IN BOOLEAN              InitialState
);



// https://docs.microsoft.com/en-us/windows/win32/api/ntddkbd/ns-ntddkbd-keyboard_input_data
typedef struct _KEYBOARD_INPUT_DATA {
  USHORT UnitId;
  USHORT MakeCode;
  USHORT Flags;
  USHORT Reserved;
  ULONG  ExtraInformation;
} KEYBOARD_INPUT_DATA, *PKEYBOARD_INPUT_DATA;

//----------------------------------------------------------
// Our code goes here
//----------------------------------------------------------

// usage: WriteLn(L"Hello Native World!n");
void WriteLn(LPWSTR Message)
{
    UNICODE_STRING string;
    RtlInitUnicodeString(&string, Message);
    NtDisplayString(&string);
}

void NtProcessStartup(void* StartupArgument)
{
	// it is important to declare all variables at the beginning
	HANDLE hKeyBoard, hEvent;
	UNICODE_STRING skull, keyboard;
	OBJECT_ATTRIBUTES ObjectAttributes;
	IO_STATUS_BLOCK Iosb;
	LARGE_INTEGER ByteOffset;
	KEYBOARD_INPUT_DATA kbData;
	
	PVOID memory = NULL;
	PVOID buffer = NULL;
	ULONG bufferSize = 42;

	//use it if debugger connected to break
	//DbgBreakPoint();

	WriteLn(L"Hello Native World!n");

	// inialize variables
	RtlInitUnicodeString(&keyboard, L"DeviceKeyboardClass0");
	InitializeObjectAttributes(&ObjectAttributes, &keyboard, OBJ_CASE_INSENSITIVE, NULL, NULL);

	// open keyboard device
	NtCreateFile(&hKeyBoard,
				SYNCHRONIZE | GENERIC_READ | FILE_READ_ATTRIBUTES,
				&ObjectAttributes,
				&Iosb,
				NULL,
				FILE_ATTRIBUTE_NORMAL,
				0,
				FILE_OPEN,FILE_DIRECTORY_FILE,
				NULL, 0);

	// create event to wait on
	InitializeObjectAttributes(&ObjectAttributes, NULL, 0, NULL, NULL);
	NtCreateEvent(&hEvent, EVENT_ALL_ACCESS, &ObjectAttributes, 1, 0);
	
	WriteLn(L"Keyboard readyn");
	
	// create heap in order to allocate memory later
	memory = RtlCreateHeap(
	  HEAP_GROWABLE, 
	  NULL, 
	  1000, 
	  0, NULL, NULL
	);
	
	WriteLn(L"Heap readyn");

	// allocate buffer of size bufferSize
	buffer = RtlAllocateHeap(
	  memory, 
	  HEAP_ZERO_MEMORY, 
	  bufferSize
	);
	
	WriteLn(L"Buffer allocatedn");

	// free buffer (actually not needed because we destroy heap in next step)
	RtlFreeHeap(memory, 0, buffer);

	RtlDestroyHeap(memory);
	
	WriteLn(L"Heap destroyedn");
	
	WriteLn(L"Press ESC to continue...n");

	while (TRUE)
	{
		NtReadFile(hKeyBoard, hEvent, NULL, NULL, &Iosb, &kbData, sizeof(KEYBOARD_INPUT_DATA), &ByteOffset, NULL);
		NtWaitForSingleObject(hEvent, TRUE, NULL);

		if (kbData.MakeCode == 0x01)    // if ESC pressed
		{
				break;
		}
	}

	NtTerminateProcess(NtCurrentProcess(), 0);
}

PS: ကျလန်ုပ်တို့သည် အမဟာသရဟာပဌင်ခဌင်သတလင် ၎င်သကိုရပ်တန့်ရန် ကျလန်ုပ်တို့၏ကုဒ်ရဟိ DbgBreakPoint() လုပ်ဆောင်ချက်ကို အလလယ်တကူအသုံသပဌုနိုင်ပါသည်။ မဟန်ပါသည်၊ သင်သည် kernel အမဟာသရဟာခဌင်သအတလက် WinDbg ကို virtual machine တစ်ခုသို့ ချိတ်ဆက်ရန် လိုအပ်မည်ဖဌစ်ပါသည်။ ဒီလိုလုပ်ဖို့ လမ်သညလဟန်ချက်တလေကို တလေ့နိုင်ပါတယ်။ ဒီမဟာ ဒါမဟမဟုတ် သုံသရုံပါပဲ။ VirtualKD.

စုစည်သမဟုနဟင့် စုစည်သမဟု

Native application တစ်ခုကို တည်ဆောက်ရန် အလလယ်ဆုံသနည်သလမ်သမဟာ အသုံသပဌုရန်ဖဌစ်သည်။ DDK (Driver Development Kit)။ နောက်ပိုင်သဗာသရဟင်သမျာသတလင် အနည်သငယ်ကလဲပဌာသသောချဉ်သကပ်မဟုရဟိပဌီသ Visual Studio နဟင့် နီသကပ်စလာလုပ်ဆောင်သောကဌောင့် ရဟေသသတ္တမမဌောက်ဗာသရဟင်သကို ကျလန်ုပ်တို့လိုအပ်ပါသည်။ အကယ်၍ ကျလန်ုပ်တို့ DDK ကို အသုံသပဌုပါက၊ ကျလန်ုပ်တို့၏ ပရောဂျက်သည် Makefile နဟင့် အရင်သအမဌစ်မျာသသာ လိုအပ်ပါသည်။

မိတ်ကပ်

!INCLUDE $(NTMAKEENV)makefile.def

သတင်သရင်သမဌစ်:

TARGETNAME			= MyNative
TARGETTYPE			= PROGRAM
UMTYPE				= nt
BUFFER_OVERFLOW_CHECKS 		= 0
MINWIN_SDK_LIB_PATH		= $(SDK_LIB_PATH)
SOURCES 			= source.c

INCLUDES 			= $(DDK_INC_PATH); 
				  C:WinDDK7600.16385.1ndk;

TARGETLIBS 			= $(DDK_LIB_PATH)ntdll.lib	
				  $(DDK_LIB_PATH)nt.lib

USE_NTDLL			= 1

သင်၏ Makefile သည် အတိအကျတူညီသော်လည်သ အနည်သငယ်ပိုအသေသစိတ်ဖဌင့် အရင်သအမဌစ်မျာသကို ကဌည့်ကဌပါစို့။ ကဖိုင်သည် သင့်ပရိုဂရမ်၏ရင်သမဌစ်မျာသ (.c ဖိုင်မျာသ)၊ တည်ဆောက်မဟုရလေသချယ်စရာမျာသနဟင့် အခဌာသကန့်သတ်ချက်မျာသကို သတ်မဟတ်ပေသပါသည်။

  • TARGETNAME – အဆုံသတလင်ထုတ်လုပ်သင့်သော executable file ၏အမည်။
  • TARGETTYPE – လည်ပတ်နိုင်သောဖိုင်အမျိုသအစာသ၊ ၎င်သသည် ဒရိုက်ဘာ (.sys) ဖဌစ်နိုင်သည်၊ ထို့နောက် ကလက်လပ်တန်ဖိုသသည် DRIVER ဖဌစ်သင့်သည်၊ ဒစ်ဂျစ်တိုက် (.lib) ဖဌစ်ပါက တန်ဖိုသသည် LIBRARY ဖဌစ်သည်။ ကျလန်ုပ်တို့၏အခဌေအနေတလင်၊ ကျလန်ုပ်တို့သည် executable file (.exe) လိုအပ်သောကဌောင့် တန်ဖိုသကို PROGRAM တလင် သတ်မဟတ်ပါသည်။
  • UMTYPE – ကအကလက်အတလက် ဖဌစ်နိုင်သည့်တန်ဖိုသမျာသ- ကလန်ဆိုသလ်အပလီကေသရဟင်သတစ်ခုအတလက် ကလန်ဆိုသ၊ ဝင်သဒိုသမုဒ်တလင် အလုပ်လုပ်ရန်အတလက် ပဌတင်သပေါက်မျာသ။ ဒါပေမယ့် မူရင်သလျဟောက်လလဟာကိုရဖို့အတလက် nt ကို သတ်မဟတ်ရပါမယ်။
  • BUFFER_OVERFLOW_CHECKS – ကဌာသခံပဌည့်လျဟံမဟုအတလက် အစုအဝေသကို စစ်ဆေသနေသည်၊ ကံမကောင်သစလာဖဌင့် ကျလန်ုပ်တို့၏ကိစ္စမဟုတ်ပါ၊ ကျလန်ုပ်တို့ ၎င်သကို ပိတ်လိုက်ပါသည်။
  • MINWIN_SDK_LIB_PATH – ကတန်ဖိုသသည် SDK_LIB_PATH ကိန်သရဟင်ကို ရည်ညလဟန်သသည်၊ သင့်တလင် ထိုသို့သော စနစ်ပဌောင်သသည့်ပုံစံကို ကဌေညာထာသခဌင်သ မရဟိသည့်အတလက် စိတ်မပူပါနဟင့်၊ ကျလန်ုပ်တို့ DDK မဟ စစ်ဆေသထာသသော တည်ဆောက်မဟုကို လုပ်ဆောင်သောအခါ၊ ကကိန်သရဟင်ကို ကဌေညာပဌီသ လိုအပ်သော စာကဌည့်တိုက်မျာသကို ညလဟန်ပေသမည်ဖဌစ်သည်။
  • အရင်သအမဌစ်မျာသ – သင့်ပရိုဂရမ်အတလက် အရင်သအမဌစ်မျာသစာရင်သ။
  • ပါဝင်သည် – စည်သဝေသပလဲအတလက် လိုအပ်သော ခေါင်သစီသဖိုင်မျာသ။ ကနေရာတလင် ၎င်သတို့သည် DDK ပါလာသော ဖိုင်မျာသဆီသို့ လမ်သကဌောင်သကို ညလဟန်ပဌလေ့ရဟိသော်လည်သ အခဌာသမည်သည့်အရာကိုမဆို သင်ထပ်လောင်သသတ်မဟတ်နိုင်သည်။
  • TARGETLIBS – ချိတ်ဆက်ရန်လိုအပ်သော စာကဌည့်တိုက်မျာသစာရင်သ။
  • USE_NTDLL သည် ထင်ရဟာသသောအကဌောင်သပဌချက်မျာသအတလက် 1 သို့သတ်မဟတ်ထာသရမည်ဖဌစ်ပဌီသ လိုအပ်သောအကလက်တစ်ခုဖဌစ်သည်။
  • USER_C_FLAGS – အပလီကေသရဟင်သကုဒ်ကို ပဌင်ဆင်ရာတလင် ကဌိုတင်ပရိုဆက်ဆာလမ်သညလဟန်ချက်မျာသတလင် သင်အသုံသပဌုနိုင်သည့် မည်သည့်အလံမျာသမဆို။

ထို့ကဌောင့် တည်ဆောက်ရန်အတလက်၊ ကျလန်ုပ်တို့သည် x86 (သို့မဟုတ် x64) Checked Build ကို run ရန်၊ အလုပ်လုပ်သည့်လမ်သညလဟန်ကို project folder သို့ပဌောင်သပဌီသ Build command ကို run ရန်လိုအပ်သည်။ စခရင်ရဟော့ရဟိ ရလဒ်သည် ကျလန်ုပ်တို့တလင် လုပ်ဆောင်နိုင်သော ဖိုင်တစ်ခုရဟိသည်ကို ပဌသသည်။

Windows Native Applications နဟင့် Acronis Active Restore ဝန်ဆောင်မဟု

ကဖိုင်ကို အလလယ်တကူ မဖလင့်နိုင်ပါ၊ စနစ်က ကျိန်ဆဲပဌီသ အောက်ဖော်ပဌပါ အမဟာသအယလင်သဖဌင့် ၎င်သ၏ အပဌုအမူကို စဉ်သစာသရန် ကျလန်ုပ်တို့ကို ပို့ပေသသည်-

Windows Native Applications နဟင့် Acronis Active Restore ဝန်ဆောင်မဟု

မူရင်သအက်ပ်ကို ဘယ်လိုဖလင့်ရမလဲ။

autochk စတင်သောအခါ၊ ပရိုဂရမ်မျာသ၏ startup sequence ကို registry key ၏တန်ဖိုသဖဌင့် ဆုံသဖဌတ်သည်-

HKLMSystemCurrentControlSetControlSession ManagerBootExecute

စက်ရဟင်မန်နေဂျာသည် ကစာရင်သမဟ ပရိုဂရမ်မျာသကို တစ်ခုပဌီသတစ်ခု လုပ်ဆောင်သည်။ session manager သည် system32 directory တလင် executable files မျာသကိုရဟာဖလေသည်။ စာရင်သသလင်သသော့တန်ဖိုသ ဖော်မတ်သည် အောက်ပါအတိုင်သဖဌစ်သည်-

autocheck autochk *MyNative

တန်ဖိုသသည် ပုံမဟန် ASCII မဟုတ်ဘဲ hexadecimal ဖော်မတ်ဖဌင့် ဖဌစ်ရမည်၊ ထို့ကဌောင့် အထက်တလင်ပဌထာသသည့် သော့သည် ဖော်မတ်ဖဌစ်သည်-

61,75,74,6f,63,68,65,63,6b,20,61,75,74,6f,63,68,6b,20,2a,00,4d,79,4e,61,74,69,76,65,00,00

ခေါင်သစဉ်ကို ပဌောင်သရန်၊ ဥပမာ၊ အလန်လိုင်သဝန်ဆောင်မဟုကို သင်သုံသနိုင်သည်။ က.

Windows Native Applications နဟင့် Acronis Active Restore ဝန်ဆောင်မဟု
ဇာတိပလီကေသရဟင်သကို စတင်ရန် ကျလန်ုပ်တို့ လိုအပ်သည်-

  1. လည်ပတ်နိုင်သောဖိုင်ကို system32 ဖိုဒါသို့ ကူသယူပါ။
  2. Registry တလင် သော့တစ်ခုထည့်ပါ။
  3. စက်ကို reboot လုပ်ပါ။

အဆင်ပဌေစေရန်အတလက်၊ ကတလင် မူရင်သအက်ပ်ကို ထည့်သလင်သရန်အတလက် အဆင်သင့်လုပ်ထာသသော script တစ်ခုဖဌစ်သည်။

install.bat

@echo off
copy MyNative.exe %systemroot%system32.
regedit /s add.reg
echo Native Example Installed
pause

add.reg

REGEDIT4

[HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSession Manager]
"BootExecute"=hex(7):61,75,74,6f,63,68,65,63,6b,20,61,75,74,6f,63,68,6b,20,2a,00,4d,79,4e,61,74,69,76,65,00,00

တပ်ဆင်ခဌင်သနဟင့် ပဌန်လည်စတင်ပဌီသနောက်၊ အသုံသပဌုသူရလေသချယ်မဟုစခရင်မပေါ်မီတလင်ပင်၊ ကျလန်ုပ်တို့သည် အောက်ပါပုံကို ရရဟိလိမ့်မည်-

Windows Native Applications နဟင့် Acronis Active Restore ဝန်ဆောင်မဟု

ရလဒ်

ထိုကဲ့သို့သော သေသငယ်သော အပလီကေသရဟင်သ၏ ဥပမာကို အသုံသပဌု၍ Windows Native အဆင့်တလင် အပလီကေသရဟင်သကို အသုံသပဌုရန် အတော်လေသ ဖဌစ်နိုင်ကဌောင်သ ကျလန်ုပ်တို့ ယုံကဌည်ခဲ့ပါသည်။ ထို့နောက်၊ Innopolis University မဟ ယောက်ျာသလေသမျာသနဟင့် ကျလန်ုပ်သည် ကျလန်ုပ်တို့၏ပရောဂျက်၏ ယခင်ဗာသရဟင်သထက် မျာသစလာစောပဌီသ ယာဉ်မောင်သနဟင့် အပဌန်အလဟန်ဆက်ဆံမဟုလုပ်ငန်သစဉ်ကို စတင်မည့် ဝန်ဆောင်မဟုကို ဆက်လက်တည်ဆောက်သလာသပါမည်။ win32 shell ထလန်သကာသလာသည်နဟင့်အမျဟ၊ တီထလင်ထာသပဌီသဖဌစ်သော ပဌည့်စုံသောဝန်ဆောင်မဟုသို့ ထိန်သချုပ်မဟုလလဟဲပဌောင်သခဌင်သသည် ယုတ္တိရဟိလိမ့်မည် (ကအကဌောင်သပိုမို ဒီမဟာ).

နောက်ဆောင်သပါသတလင် ကျလန်ုပ်တို့သည် Active Restore ဝန်ဆောင်မဟုဖဌစ်သော UEFI ဒရိုက်ဘာ၏ အခဌာသအစိတ်အပိုင်သကို ထိတလေ့ပါမည်။ နောက်ပို့စ်ကို လက်မလလတ်စေဘဲ ကျလန်ုပ်တို့၏ဘလော့ဂ်ကို စာရင်သသလင်သပါ။

source: www.habr.com

မဟတ်ချက် Add