📄 intwmi.c
字号:
so the irp should be completed with the buffer needed.
OutBufferSize has the maximum size available to write the data
block.
Buffer on return is filled with the returned data block
Return Value:
status
--*/
{
PDEVICE_EXTENSION deviceExtension;
NTSTATUS ntStatus;
ULONG size;
WCHAR modelName[] = L"Aishverya\0\0";
USHORT modelNameLen;
PAGED_CODE();
KdPrint( ("IntUsb_QueryWmiDataBlock - begins\n"));
size = 0;
modelNameLen = (wcslen(modelName) + 1) * sizeof(WCHAR);
//
// Only ever registers 1 instance per guid
//
ASSERT((InstanceIndex == 0) &&
(InstanceCount == 1));
deviceExtension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
switch (GuidIndex) {
case WMI_INTUSB_DRIVER_INFORMATION:
size = sizeof(ULONG) + modelNameLen + sizeof(USHORT);
if (OutBufferSize < size ) {
KdPrint( ("OutBuffer too small\n"));
ntStatus = STATUS_BUFFER_TOO_SMALL;
break;
}
* (PULONG) Buffer = DebugLevel;
Buffer += sizeof(ULONG);
//
// put length of string ahead of string
//
*((PUSHORT)Buffer) = modelNameLen;
Buffer = (PUCHAR)Buffer + sizeof(USHORT);
RtlCopyBytes((PVOID)Buffer, (PVOID)modelName, modelNameLen);
*InstanceLengthArray = size ;
ntStatus = STATUS_SUCCESS;
break;
default:
ntStatus = STATUS_WMI_GUID_NOT_FOUND;
}
ntStatus = WmiCompleteRequest(DeviceObject,
Irp,
ntStatus,
size,
IO_NO_INCREMENT);
KdPrint( ("IntUsb_QueryWmiDataBlock - ends\n"));
return ntStatus;
}
NTSTATUS
IntUsb_SetWmiDataItem(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN ULONG GuidIndex,
IN ULONG InstanceIndex,
IN ULONG DataItemId,
IN ULONG BufferSize,
IN PUCHAR Buffer
)
/*++
Routine Description:
This routine is a callback into the driver to set for the contents of
a data block. When the driver has finished filling the data block it
must call WmiCompleteRequest to complete the irp. The driver can
return STATUS_PENDING if the irp cannot be completed immediately.
Arguments:
DeviceObject is the device whose data block is being queried
Irp is the Irp that makes this request
GuidIndex is the index into the list of guids provided when the
device registered
InstanceIndex is the index that denotes which instance of the data block
is being queried.
DataItemId has the id of the data item being set
BufferSize has the size of the data item passed
Buffer has the new values for the data item
Return Value:
status
--*/
{
PDEVICE_EXTENSION deviceExtension;
NTSTATUS ntStatus;
ULONG info;
PAGED_CODE();
KdPrint( ("IntUsb_SetWmiDataItem - begins\n"));
deviceExtension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
info = 0;
switch(GuidIndex) {
case WMI_INTUSB_DRIVER_INFORMATION:
if(DataItemId == 1) {
if(BufferSize == sizeof(ULONG)) {
DebugLevel = *((PULONG)Buffer);
ntStatus = STATUS_SUCCESS;
info = sizeof(ULONG);
}
else {
ntStatus = STATUS_INFO_LENGTH_MISMATCH;
}
}
else {
ntStatus = STATUS_WMI_READ_ONLY;
}
break;
default:
ntStatus = STATUS_WMI_GUID_NOT_FOUND;
}
ntStatus = WmiCompleteRequest(DeviceObject,
Irp,
ntStatus,
info,
IO_NO_INCREMENT);
KdPrint( ("IntUsb_SetWmiDataItem - ends\n"));
return ntStatus;
}
NTSTATUS
IntUsb_SetWmiDataBlock(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN ULONG GuidIndex,
IN ULONG InstanceIndex,
IN ULONG BufferSize,
IN PUCHAR Buffer
)
/*++
Routine Description:
This routine is a callback into the driver to set the contents of
a data block. When the driver has finished filling the data block it
must call WmiCompleteRequest to complete the irp. The driver can
return STATUS_PENDING if the irp cannot be completed immediately.
Arguments:
DeviceObject is the device whose data block is being queried
Irp is the Irp that makes this request
GuidIndex is the index into the list of guids provided when the
device registered
InstanceIndex is the index that denotes which instance of the data block
is being queried.
BufferSize has the size of the data block passed
Buffer has the new values for the data block
Return Value:
status
--*/
{
PDEVICE_EXTENSION deviceExtension;
NTSTATUS ntStatus;
ULONG info;
PAGED_CODE();
deviceExtension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
info = 0;
KdPrint( ("IntUsb_SetWmiDataBlock - begins\n"));
switch(GuidIndex) {
case WMI_INTUSB_DRIVER_INFORMATION:
if(BufferSize == sizeof(ULONG)) {
DebugLevel = *(PULONG) Buffer;
ntStatus = STATUS_SUCCESS;
info = sizeof(ULONG);
}
else {
ntStatus = STATUS_INFO_LENGTH_MISMATCH;
}
break;
default:
ntStatus = STATUS_WMI_GUID_NOT_FOUND;
}
ntStatus = WmiCompleteRequest(DeviceObject,
Irp,
ntStatus,
info,
IO_NO_INCREMENT);
KdPrint( ("IntUsb_SetWmiDataBlock - ends\n"));
return ntStatus;
}
PCHAR
WMIMinorFunctionString (
UCHAR MinorFunction
)
/*++
Routine Description:
Arguments:
Return Value:
--*/
{
switch (MinorFunction) {
case IRP_MN_CHANGE_SINGLE_INSTANCE:
return "IRP_MN_CHANGE_SINGLE_INSTANCE\n";
case IRP_MN_CHANGE_SINGLE_ITEM:
return "IRP_MN_CHANGE_SINGLE_ITEM\n";
case IRP_MN_DISABLE_COLLECTION:
return "IRP_MN_DISABLE_COLLECTION\n";
case IRP_MN_DISABLE_EVENTS:
return "IRP_MN_DISABLE_EVENTS\n";
case IRP_MN_ENABLE_COLLECTION:
return "IRP_MN_ENABLE_COLLECTION\n";
case IRP_MN_ENABLE_EVENTS:
return "IRP_MN_ENABLE_EVENTS\n";
case IRP_MN_EXECUTE_METHOD:
return "IRP_MN_EXECUTE_METHOD\n";
case IRP_MN_QUERY_ALL_DATA:
return "IRP_MN_QUERY_ALL_DATA\n";
case IRP_MN_QUERY_SINGLE_INSTANCE:
return "IRP_MN_QUERY_SINGLE_INSTANCE\n";
case IRP_MN_REGINFO:
return "IRP_MN_REGINFO\n";
default:
return "IRP_MN_?????\n";
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -