我赌了一个多星期,我无法形成如何获得内核对象列表的完整图片。我的算法如下:
这是一段负责使用NtOpenDirectoryObject函数的代码: http://pastebin.com/pDNb3GTn
使用参数NtOpenDirectoryObject调用函数时会获得异常c0000005,这意味着访问被阻止。
请告诉我,我做错了,我的错误在哪里。是否可以不使用原生api?谢谢你的帮助答案 0 :(得分:1)
异常c0000005
是访问冲突。这并不意味着访问被阻止。这意味着访问了无效的内存,例如,如果访问了NULL /未初始化的指针,或者您没有正确对齐数据并访问超出已分配范围的内容。
正如Andrew所说,你根本没有初始化UNICODE_STRING
。试试这个:
hNtdll = LoadLibrary("ntdll.dll");
NtOpenDirectoryObject = (NTOPENDIRECTORYOBJECT) GetProcAddress(hNtdll, "NtOpenDirectoryObject");
...
if (NtOpenDirectoryObject)
{
// add these three lines
str.Length = lstrlenW(uString) * sizeof(WCHAR);
str.MaximumLength = str.Length;
str.Buffer = uString;
InitializeObjectAttributes (&obj, &str, 0, NULL, NULL);
NtOpenDirectoryObject(&hFile, 0x20001, &obj);
}