?? pnpquery.cpp
字號(hào):
//*********************************************************************
// created: 23:2:2005 10:16
// author : tiamo
// desc : pnp query
//*********************************************************************
#include "stdafx.h"
NTSTATUS PnpCompleteRoutine(PDEVICE_OBJECT pDevice,PIRP pIrp,PVOID pContext)
{
PKEVENT pEvent = static_cast<PKEVENT>(pContext);
KeSetEvent(pEvent,0,FALSE);
return STATUS_MORE_PROCESSING_REQUIRED;
}
// query device bus rel
NTSTATUS PnpQueryDeviceBusRel(PDEVICE_OBJECT pDeviceInStack,PVOID pRelBuffer,
ULONG &ulRelBufferSize)
{
IO_STATUS_BLOCK localIoStatus;
PIRP pIrp = 0;
KEVENT evFinish;
__try
{
RtlZeroMemory(pRelBuffer,ulRelBufferSize);
// get top of the stack
pDeviceInStack = IoGetAttachedDeviceReference(pDeviceInStack);
pIrp = IoAllocateIrp(pDeviceInStack->StackSize,0);
if(!pIrp)
{
localIoStatus.Status = STATUS_INSUFFICIENT_RESOURCES;
__leave;
}
PIO_STACK_LOCATION pIrpSp = IoGetNextIrpStackLocation(pIrp);
pIrp->Flags = 0;
pIrp->RequestorMode = KernelMode;
pIrp->UserIosb = &localIoStatus;
pIrp->UserEvent = 0;
pIrp->IoStatus.Status = STATUS_NOT_SUPPORTED;
pIrp->IoStatus.Information = 0;
pIrp->Tail.Overlay.Thread = reinterpret_cast<PETHREAD>(KeGetCurrentThread());
pIrp->UserBuffer = 0;
localIoStatus.Status = STATUS_NOT_SUPPORTED;
localIoStatus.Information = 0;
pIrpSp->MajorFunction = IRP_MJ_PNP;
pIrpSp->MinorFunction = IRP_MN_QUERY_DEVICE_RELATIONS;
pIrpSp->FileObject = 0;
pIrpSp->DeviceObject = pDeviceInStack;
pIrpSp->Parameters.QueryDeviceRelations.Type = BusRelations;
KeInitializeEvent(&evFinish,SynchronizationEvent,FALSE);
IoSetCompletionRoutine(pIrp,PnpCompleteRoutine,&evFinish,TRUE,TRUE,TRUE);
localIoStatus.Status = IoCallDriver(pDeviceInStack,pIrp);
if(localIoStatus.Status == STATUS_PENDING)
{
KeWaitForSingleObject(&evFinish,Executive,KernelMode,FALSE,0);
}
localIoStatus.Status = pIrp->IoStatus.Status;
if( !NT_SUCCESS(localIoStatus.Status) ||
pIrp->IoStatus.Information == STATUS_INSUFFICIENT_RESOURCES ||
!pIrp->IoStatus.Information)
{
localIoStatus.Status = STATUS_NOT_SUPPORTED;
__leave;
}
PDEVICE_RELATIONS pRel = reinterpret_cast<PDEVICE_RELATIONS>(pIrp->IoStatus.Information);
ULONG ulSize = pRel->Count * sizeof(PDEVICE_OBJECT) + sizeof(ULONG);
if(ulSize > ulRelBufferSize)
{
ulRelBufferSize = 0;
localIoStatus.Status = STATUS_BUFFER_TOO_SMALL;
}
else
{
ulRelBufferSize = ulSize;
RtlCopyMemory(pRelBuffer,pRel,ulSize);
}
ExFreePool(pRel);
}
__finally
{
if(pIrp)
IoFreeIrp(pIrp);
}
ObDereferenceObject(pDeviceInStack);
return localIoStatus.Status;
}
// query device id
NTSTATUS PnpQueryDeviceID(PDEVICE_OBJECT pDeviceInStack,PVOID pIDBuffer,
ULONG &ulIDBufferSize)
{
IO_STATUS_BLOCK localIoStatus;
PIRP pIrp = 0;
KEVENT evFinish;
__try
{
// get top of the stack
pDeviceInStack = IoGetAttachedDeviceReference(pDeviceInStack);
pIrp = IoAllocateIrp(pDeviceInStack->StackSize,0);
if(!pIrp)
{
localIoStatus.Status = STATUS_INSUFFICIENT_RESOURCES;
__leave;
}
PIO_STACK_LOCATION pIrpSp = IoGetNextIrpStackLocation(pIrp);
pIrp->Flags = 0;
pIrp->RequestorMode = KernelMode;
pIrp->UserIosb = &localIoStatus;
pIrp->UserEvent = 0;
pIrp->IoStatus.Status = STATUS_NOT_SUPPORTED;
pIrp->IoStatus.Information = 0;
pIrp->Tail.Overlay.Thread = reinterpret_cast<PETHREAD>(KeGetCurrentThread());
pIrp->UserBuffer = 0;
localIoStatus.Status = STATUS_NOT_SUPPORTED;
localIoStatus.Information = 0;
pIrpSp->MajorFunction = IRP_MJ_PNP;
pIrpSp->MinorFunction = IRP_MN_QUERY_ID;
pIrpSp->FileObject = 0;
pIrpSp->DeviceObject = pDeviceInStack;
pIrpSp->Parameters.QueryId.IdType = BusQueryDeviceID;
KeInitializeEvent(&evFinish,SynchronizationEvent,FALSE);
IoSetCompletionRoutine(pIrp,PnpCompleteRoutine,&evFinish,TRUE,TRUE,TRUE);
localIoStatus.Status = IoCallDriver(pDeviceInStack,pIrp);
if(localIoStatus.Status == STATUS_PENDING)
{
KeWaitForSingleObject(&evFinish,Executive,KernelMode,FALSE,0);
}
localIoStatus.Status = pIrp->IoStatus.Status;
if( !NT_SUCCESS(localIoStatus.Status) ||
pIrp->IoStatus.Information == STATUS_INSUFFICIENT_RESOURCES ||
!pIrp->IoStatus.Information)
{
__leave;
}
PWCHAR pString = reinterpret_cast<PWCHAR>(pIrp->IoStatus.Information);
ulIDBufferSize /= 2;
ULONG i = 0;
PWCHAR pOutBuffer = static_cast<PWCHAR>(pIDBuffer);
pOutBuffer[--ulIDBufferSize] = 0;
while(pString[i] && i < ulIDBufferSize);
{
pOutBuffer[i] = pString[i];
i ++;
}
ExFreePool(pString);
}
__finally
{
if(pIrp)
IoFreeIrp(pIrp);
}
ObDereferenceObject(pDeviceInStack);
return localIoStatus.Status;
}
// query hardware id
NTSTATUS PnpQueryHardwareID(PDEVICE_OBJECT pPhysicalDevice,PVOID pIDBuffer,
ULONG &ulIDBufferSize)
{
RtlZeroMemory(pIDBuffer,ulIDBufferSize);
return IoGetDeviceProperty(pPhysicalDevice,DevicePropertyHardwareID,
ulIDBufferSize,pIDBuffer,&ulIDBufferSize);
}
// query compatible id
NTSTATUS PnpQueryCompatibleID(PDEVICE_OBJECT pPhysicalDevice,PVOID pIDBuffer,
ULONG &ulIDBufferSize)
{
RtlZeroMemory(pIDBuffer,ulIDBufferSize);
return IoGetDeviceProperty(pPhysicalDevice,DevicePropertyCompatibleIDs,
ulIDBufferSize,pIDBuffer,&ulIDBufferSize);
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -