我试图在内核空间中使用ZwOpenProcess
将符号链接打开为文件。使用下面的代码在XP-7上都可以。但是使用Windows 8.1 ZwOpenProcess
会失败,使用不同的NTSTATUS代码,例如0xC0000001
,0xC000000D
OBJECT_ATTRIBUTES ObjectAttributes;
HANDLE FileHandle;
IO_STATUS_BLOCK IoStatus;
NTSTATUS Status;
InitializeObjectAttributes ( &ObjectAttributes,
SymLinkOrDeviceName, // <--- \Device\CEDRIVER60
OBJ_KERNEL_HANDLE,
(HANDLE) NULL,
(PSECURITY_DESCRIPTOR) NULL );
Status = ZwOpenFile ( &FileHandle,
FILE_READ_ACCESS,
&ObjectAttributes,
&IoStatus,
0,
FILE_NON_DIRECTORY_FILE );
if ( !NT_SUCCESS ( Status ) )
{
DbgPrint("TEST: ERROR %p ", Status); // <--- 0xC0000001, 0xC000000D
goto Exit;
}
我检查过,使用WinObj - 系统中存在的符号链接,代码在XP-7上运行良好。
我也试图将Access更改为 - FILE_ANY_ACCESS - 结果相同。
答案 0 :(得分:0)
ZwOpenProcess
我想你的意思是ZwOpenFile。
\设备\ CEDRIVER60
你真的看过\ Device目录吗?此目录通常包含驱动程序创建的设备对象。符号链接通常放在\ DosDevices等目录中。您还应该包含OBJ_CASE_INSENSITIVE标志。
FILE_READ_ACCESS
此标志确定成功将IOCTL消息传递到目标设备对象所需的访问权限。指定一个真正的文件访问权限常量,如FILE_READ_ATTRIBUTES,FILE_READ_DATA(其值实际上与FILE_READ_ACCESS相同)或GENERIC_READ。 ZwOpenFile(和ZwCreateFile)上的MSDN页面也值得一读。您可能还需要包含SYNCHRONIZE标志。
%P
NTSTATUS定义为long(32位有符号整数)。 %x更合适。