HANDLE OpenPhysicalMemory(DWORD mAccess) { UNICODE_STRING PhysMemString; OBJECT_ATTRIBUTES Attr; PACL OldAcl, NewAcl; PSECURITY_DESCRIPTOR SD; PEXPLICIT_ACCESS_A Access; HANDLE mHandle; HANDLE Result; NTSTATUS ntStatus; DWORD dStatus; HRESULT hStatus; HLOCAL hlStatus; hntdll = LoadLibrary(TEXT("ntdll.dll")); MyRtlInitUnicodeString = (void (__stdcall *) ( OUT PUNICODE_STRING, IN PCWSTR))GetProcAddress( hntdll,"RtlInitUnicodeString"); MyRtlInitUnicodeString(&PhysMemString, L"\\Device\\PhysicalMemory"); InitializeObjectAttributes(&Attr, &PhysMemString, OBJ_CASE_INSENSITIVE , NULL, NULL); ZwOpenSection = (tag_ZwOpenSection) GetProcAddress( hntdll, "ZwOpenSection" ); ntStatus = ZwOpenSection(&mHandle, READ_CONTROL | WRITE_DAC, &Attr); if(ntStatus != STATUS_SUCCESS) return 0; OldAcl = (PACL)VirtualAlloc(NULL, sizeof(ACL), MEM_COMMIT|MEM_RESERVE, PAGE_READWRITE); NewAcl = (PACL)VirtualAlloc(NULL, sizeof(ACL), MEM_COMMIT|MEM_RESERVE, PAGE_READWRITE); SD = (PSECURITY_DESCRIPTOR)VirtualAlloc(NULL, sizeof(SECURITY_DESCRIPTOR), MEM_COMMIT|MEM_RESERVE, PAGE_READWRITE); dStatus = GetSecurityInfo(mHandle, SE_KERNEL_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, &OldAcl, NULL, &SD); DWORD dLastError = GetLastError(); //error dLastError = 0x0000007a //вот здесь ошибка, хотя dStatus = 0; if(dStatus != ERROR_SUCCESS) return 0; Access = (PEXPLICIT_ACCESS_A)VirtualAlloc(NULL, sizeof(EXPLICIT_ACCESS_A), MEM_COMMIT|MEM_RESERVE, PAGE_READWRITE); Access->grfAccessPermissions = mAccess; Access->grfAccessMode = GRANT_ACCESS; Access->grfInheritance = NO_INHERITANCE; Access->Trustee.pMultipleTrustee = NULL; Access->Trustee.MultipleTrusteeOperation = NO_MULTIPLE_TRUSTEE; Access->Trustee.TrusteeForm = TRUSTEE_IS_NAME; Access->Trustee.TrusteeType = TRUSTEE_IS_USER; Access->Trustee.ptstrName = "CURRENT_USER"; dStatus = SetEntriesInAclA(1, Access, OldAcl, &NewAcl); //error dLastError = 0x000003f0 //и здесь ошибка, хотя dStatus тоже = 0; dLastError = GetLastError(); dStatus = SetSecurityInfo(mHandle , SE_KERNEL_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, NewAcl, NULL); ntStatus = ZwOpenSection(&Result, mAccess, &Attr); dStatus = SetSecurityInfo(mHandle , SE_KERNEL_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, OldAcl, NULL); hStatus = CloseHandle(mHandle); hlStatus = LocalFree(NewAcl); hlStatus = LocalFree(SD); return Result; } Я не понимаю почему возникают ошибки, хотя возвращаемое значение dStatus = 0 Может дело в ZwOpenSection??? в mHandle она возвращает 0x00000fc0. Кстати. Использовал вариант с драйвером. Драйвер загружается нормально. Создаю устройство с помощью CreateFile(). При попытке записи чего-нить в устройство, система падает. Может кто чего-нить подскажет???
Драйверы обычно падают при Код (Text): xor eax, eas mov ebx, dword ptr [eax] Прототипчик как-то так Код (Text): DWORD WINAPI GetSecurityInfo( __in HANDLE handle, __in SE_OBJECT_TYPE ObjectType, __in SECURITY_INFORMATION SecurityInfo, __out_opt PSID *ppsidOwner, __out_opt PSID *ppsidGroup, __out_opt PACL *ppDacl, __out_opt PACL *ppSacl, __out_opt PSECURITY_DESCRIPTOR *ppSecurityDescriptor //Не хочет собака писать по нулевому адресу ); Тему раскопали, закрыли, и закопали