Тестирование проходило на Windows XP (x86) и на Windows 7 SP1 (x86), на первом код отработал, на втором же возвращает STATUS_INVALID_PARAMETER. Я что-то делаю не так?
C++:
const unsigned char x86sc[] = {
0xB8, 0xB3, 0x00, 0x00, 0x00, 0x33, 0xC9, 0x8D, 0x54, 0x24, 0x08, 0xCD, 0x2E, 0xC3
};
/* ->
mov eax, 0xB3 (NtOpenFile ID (WIN7 SP1))
xor ecx ecx
lea edx, dword ptr ss:[esp+8]
int 2E
ret
*/
HANDLE hFile = NULL;
IO_STATUS_BLOCK IoStatusBlock;
OBJECT_ATTRIBUTES FileObjectAttributes;
InitializeObjectAttributes(&FileObjectAttributes, &szPath, OBJ_CASE_INSENSITIVE, NULL, NULL);
NTSTATUS NtStatus = reinterpret_cast<NTSTATUS(__stdcall*)(...)>(x86sc)(&hFile, GENERIC_READ | SYNCHRONIZE, &FileObjectAttributes, &IoStatusBlock, FILE_SHARE_READ, FILE_SYNCHRONOUS_IO_NONALERT | FILE_NON_DIRECTORY_FILE);
// result = STATUS_INVALID_PARAMETER