我正在模仿conhost.exe
和condrv.sys
驱动程序之间的连接。因此,我将conhost.exe中的代码复制到一个简单的C文件中并进行了编译。但是NtOpenFile()
总是显示0xc0000005
错误。这是代码段。
RtlInitUnicodeString(&DestinationString, L"\\Device\\ConDrv\\Server");
ObjectAttributes.Length = sizeof(OBJECT_ATTRIBUTES);
ObjectAttributes.RootDirectory = 0;
ObjectAttributes.Attributes = OBJ_CASE_INSENSITIVE;
ObjectAttributes.ObjectName = &DestinationString;
ObjectAttributes.SecurityDescriptor = 0;
status = NtOpenFile(&Handle, GENERIC_ALL, &ObjectAttributes, &IoStatusBlock, 0, 0);
如何修改该代码以使其正常工作?我做错什么了吗?
答案 0 :(得分:1)
感谢@RbMm的建议。 OBJECT_ATTRIBUTES
结构定义为:
typedef struct _OBJECT_ATTRIBUTES {
ULONG Length;
HANDLE RootDirectory;
PUNICODE_STRING ObjectName;
ULONG Attributes;
PVOID SecurityDescriptor;
PVOID SecurityQualityOfService;
} OBJECT_ATTRIBUTES;
typedef OBJECT_ATTRIBUTES *POBJECT_ATTRIBUTES;
显示错误是因为我忘记将SecurityQualityOfService
设为零。因此NtOpenFile()
从内存中剩下的任何值中获取SecurityQualityOfService
的值。并且显示0xC0000005
又名。内存访问冲突。我添加了ObjectAttributes.SecurityQualityOfService = 0;
,它可以正常工作。