Winapi 带有ConDrv设备的NtOpenFile()显示0xC0000005错误

Winapi 带有ConDrv设备的NtOpenFile()显示0xC0000005错误,winapi,console,Winapi,Console,我正在模拟conhost.exe和condrv.sys驱动程序之间的连接。因此,我将conhost.exe中的代码复制到一个简单的C文件中,并对其进行编译。但是NtOpenFile()总是显示0xc000005错误。下面是代码片段 RtlInitUnicodeString(&DestinationString,L“\\Device\\ConDrv\\Server”); ObjectAttributes.Length=sizeof(OBJECT\u属性); ObjectAttributes.Roo

我正在模拟
conhost.exe
condrv.sys
驱动程序之间的连接。因此,我将conhost.exe中的代码复制到一个简单的C文件中,并对其进行编译。但是
NtOpenFile()
总是显示
0xc000005
错误。下面是代码片段

RtlInitUnicodeString(&DestinationString,L“\\Device\\ConDrv\\Server”);
ObjectAttributes.Length=sizeof(OBJECT\u属性);
ObjectAttributes.RootDirectory=0;
Attributes=OBJ_不区分大小写;
ObjectAttributes.ObjectName=&DestinationString;
ObjectAttributes.SecurityDescriptor=0;
状态=NtOpenFile(&Handle,GENERIC_ALL,&ObjectAttributes,&IoStatusBlock,0,0);

如何修改该代码以正常工作?我做错什么了吗

感谢@RbMm的建议。
OBJECT\u属性
struct定义为:

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
0。因此
NtOpenFile()
从内存中剩余的内容中获取
SecurityQualityOfService
值。并显示
0xc000005
aka。内存访问冲突。我添加了
ObjectAttributes.SecurityQualityOfService=0有效。

@KenWhite:0xC0000005是一种访问冲突,即试图读取/写入/执行一个无法读取/写入/执行的内存地址。您忘记了init
SecurityQualityOfService
-所有这些都会更快地给出访问冲突。最好将其初始化为
OBJECT\u ATTRIBUTES oa={sizeof(oa),0,&DestinationString,对象不区分大小写}仅供参考,condrv.sys和conhost.exe之间的接口是完全私有的。微软可以随时自由地改变一切。在Windows 8+中,condrv.sys执行conhost.exe,并且至少在Windows 10中,在命令行上传递“Server”的继承句柄。因此,在某种程度上,他们实际上可以使这种情况下的
IRP_MJ_CREATE
分派函数(即
condrv!CdCreateServer
)在从用户模式调用时总是失败,访问被拒绝(0xC0000022)。你的最终目标是什么?“它看起来可疑且脆弱。@艾尔克森是的,先生,关于c-22的错误你是对的。我只是想知道控制台是如何从内部工作的(不仅仅是文章)。顺便说一句,您可以总是
初始化objectattributes
,而不是自己手动设置结构的每个字段。宏为您执行此操作,您只需将其作为参数传递。它在用户模式的
winternl.h
中定义。依我看,使用这个宏看起来更干净。