Здравствуйте, gear nuke, Вы писали:
GN>А если бы дело было не с ntdll, а в ядре где нет дебажного CRT, как бы обнаружилась ошибка, если возвращаемый статус не проверяется?
Ну у меня реализовано вот так:
int func::CZwQuerySecurityObject() {
PULONG ReturnL=0;
ULONG uLength = 0x800;
PISECURITY_DESCRIPTOR pSD=NULL,pSD2;
HMODULE hModule=LoadLibrary(L"Ntdll.dll");
NTSTATUS status;
NTSTATUS (WINAPI *pZwQuerySecurityObject)(HANDLE,SECURITY_INFORMATION,PISECURITY_DESCRIPTOR,ULONG,PULONG);
pZwQuerySecurityObject=(NTSTATUS (WINAPI*)(HANDLE,SECURITY_INFORMATION,PISECURITY_DESCRIPTOR,ULONG,PULONG)) GetProcAddress(hModule,"ZwQuerySecurityObject");
if(pZwQuerySecurityObject==NULL) abort();
do
{ if (pSD) free(pSD);
uLength *= 2;
pSD=(PISECURITY_DESCRIPTOR)malloc(uLength);
if (!pSD)
printf("malloc failed! ");
status = pZwQuerySecurityObject(directoryHandle,DACL_SECURITY_INFORMATION|GROUP_SECURITY_INFORMATION|OWNER_SECURITY_INFORMATION,pSD,uLength,ReturnL);
} while (status == STATUS_BUFFER_TOO_SMALL);
return 0;
}
Вся загвоздка в том, почему в поле Owner, функция возращает не то что нужно