阅读:1994回复:6
求救!电脑启动时打开注册表问题!
求救!电脑启动时打开注册表问题!
我编写Driver要在电脑启动时打开注册表,可是我总是打开注册表出错!请高手们知道一下,万分感谢! #define REGPATH L"\\Registry\\Machine\\SOFTWARE\\MYTEST" NTSTATUS GetRegValueDword() { NTSTATUS Status; OBJECT_ATTRIBUTES ObjectAttributes; HANDLE KeyHandle; UNICODE_STRING UnicodeRegPath; UNICODE_STRING UnicodeValueName; ULONG nTotalOther=1; RtlInitUnicodeString(&UnicodeRegPath,REGPATH); RtlInitUnicodeString(&UnicodeValueName, L"dwMyTest"); InitializeObjectAttributes(&ObjectAttributes, &UnicodeRegPath, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, // Flags NULL, // Root directory NULL); // Security descriptor Status = ZwOpenKey(&KeyHandle, KEY_ALL_ACCESS, &ObjectAttributes); // 出错,错误码是-1073741772 if (Status != STATUS_SUCCESS) { KdPrint(("Open Error!\n")); Status=ZwCreateKey( //创建一个注册表键 &KeyHandle, KEY_ALL_ACCESS, &ObjectAttributes, 0, (PUNICODE_STRING) NULL, REG_OPTION_NON_VOLATILE, NULL ); KdPrint(("ZwCreateKey Status = %d\n",Status)); if (Status == STATUS_SUCCESS) { Status = RtlWriteRegistryValue( //向注册表写一个值 RTL_REGISTRY_ABSOLUTE, REGPATH L"dwMyTest", REG_DWORD, &nTotalOther, 4); if (Status == STATUS_SUCCESS) { ZwClose(KeyHandle); KdPrint(("Write ok\n")); } else { ZwClose(KeyHandle); KdPrint(("Write Error\n")); } return STATUS_INVALID_DEVICE_REQUEST; } else { ZwClose(KeyHandle); KdPrint(("Create Error\n")); return STATUS_SUCCESS; } } else { ZwClose(KeyHandle); KdPrint(("Open Registry Ok!\n")); return STATUS_SUCCESS; } } |
|
沙发#
发布于:2005-07-19 10:05
我这是视频采集卡的驱动,我想刚安装的时候通过注册表使系统重新启动,而重启后再来读注册表确认用不用申请内存等......所以有没有可能是因为先加载了硬件的驱动,才生成注册表呢? 因为我如果进系统后读的话就是没有问题的.....
|
|
板凳#
发布于:2005-07-19 15:27
你那个错误代码为C0000034,STATUS_OBJECT_NAME_NOT_FOUND。
可能是应为注册表没有装载完成吧,你把驱动程序的INF里面的LoadOrderGroup 和 StartType修改一下, 把驱动程序的加载时间推后一点试试吧。 |
|
|
地板#
发布于:2005-07-19 17:31
还是不行呢,我想也应该是这时这个注册表项还没有加载到,还有什么办法吗?
|
|
地下室#
发布于:2005-07-20 11:12
这样啊,那只有自己写一个应用程序在开机的时候运行并通知驱动程序读取注册表了。
|
|
|
5楼#
发布于:2005-07-21 17:46
嗯,那时候还没有加载完,把startType设定为3试试看。
|
|
|
6楼#
发布于:2005-07-22 15:30
我本来就是设置为3了的啊,....
ServiceType = 1 ; SERVICE_KERNEL_DRIVER StartType = 3 ; SERVICE_DEMAND_START ErrorControl = 1 ; SERVICE_ERROR_NORMAL |
|