能力值:
( LV2,RANK:10 )
|
-
-
2 楼
已经解决,红色位置为修改的地方,参见:ftp://ftp.lantronix.com/priv/cpr/Lantronix/4.3/4.3.0.0/Debug/DriverSource/registry.c
#include <ntddk.h>
NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath)
{
NTSTATUS status;
HANDLE KeyHandle = NULL;
OBJECT_ATTRIBUTES objAttr = { 0 };
UNICODE_STRING KeyPath = RTL_CONSTANT_STRING(L"\\Registry\\Machine\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion");
UNICODE_STRING ValueName = RTL_CONSTANT_STRING(L"RegisteredOwner");
PKEY_VALUE_PARTIAL_INFORMATION pKeyValueInformation;
ULONG ResultLength;
InitializeObjectAttributes(&objAttr, &KeyPath, OBJ_CASE_INSENSITIVE, NULL, NULL);
status = ZwOpenKey(&KeyHandle, KEY_READ, &objAttr);
if (!NT_SUCCESS(status))
{
return STATUS_UNSUCCESSFUL;
}
/* 写注册表代码
UNICODE_STRING ValueName = RTL_CONSTANT_STRING(L"DriverWrited");
PWCHAR Value = L"My Test Value";
status = ZwSetValueKey(KeyHandle, &ValueName, 0, REG_SZ, Value,
(wcslen(Value) + 1) * sizeof(WCHAR));
if (!NT_SUCCESS(status))
{
ZwClose(KeyHandle);
return STATUS_UNSUCCESSFUL;
}*/
// 试探性的调用,主要根据返回值得到实际 buffer 的大小
status = ZwQueryValueKey(
KeyHandle, // key句柄
&ValueName, // 要获取的键名
KeyValuePartialInformation, // 获取类型和值
[COLOR="red"] NULL, // 首次 buffer 传 NULL 为了其失败返回实际需要空间
0, // buffer 长度传 0,同上目的[/COLOR]
&ResultLength // 用来返回实际需要空间的变量
);
// 如果说实际需要的长度比 Length 要大,那么返回 STATUS_BUFFER_ OVERFLOW
// 或者 STATUS_BUFFER_TOO_SMALL。如果成功读出了全部数据,那么返回 STATUS_SUCCESS。
// 其他的情况,返回一个错误码。
if (!NT_SUCCESS(status) &&
status != STATUS_BUFFER_OVERFLOW &&
status != STATUS_BUFFER_TOO_SMALL)
{
ZwClose(KeyHandle);
}
// 根据实际返回所需的 buffer 大小分配空间
pKeyValueInformation = (KEY_VALUE_PARTIAL_INFORMATION*)
ExAllocatePool(NonPagedPool, ResultLength);
if (NULL == pKeyValueInformation)
{
status = STATUS_INSUFFICIENT_RESOURCES;
ZwClose(KeyHandle);
}
// 继续读取
status = ZwQueryValueKey(
KeyHandle,
&ValueName,
KeyValuePartialInformation,
[COLOR="Red"] pKeyValueInformation, // 传递已经分配了空间的 buffer
ResultLength, // 传递上一次 ZwQueryValueKey 返回的实际大小值[/COLOR]
&ResultLength
);
UNICODE_STRING ResultString;
RtlInitUnicodeString(&ResultString, (PCWSTR)pKeyValueInformation->Data);
ResultString.Length = (USHORT)pKeyValueInformation->DataLength;
ResultString.MaximumLength = (USHORT)pKeyValueInformation->DataLength;
KdPrint(("pKeyValueInformation.Data = %S\r\n", pKeyValueInformation->Data));
KdPrint(("ResultString = %wZ, Length = %ld\r\n", &ResultString, ResultString.Length));
ExFreePool((VOID*)pKeyValueInformation);
ZwClose(KeyHandle);
return STATUS_UNSUCCESSFUL;
}
|
能力值:
( LV13,RANK:240 )
|
-
-
3 楼
内核里面unicode不要直接 printf他的data .data不一定0结尾的,拷贝到某个地方再打印吧。好久没有看驱动了。
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
好的,谢谢指点。这个在书中有看到,它并不是 \0 结尾的字符串,而是结构中的 Length 描述的长度,这个是我忽略了。
|
|
|