⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pnpquery.cpp

📁 显示Device Treee
💻 CPP
字号:

//*********************************************************************
//	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);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -