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

📄 autodetect.cpp

📁 Windows WDM 设备驱动程序开发指南(源码)
💻 CPP
字号:
NTSTATUS  AbcConfigCallback(
	IN PVOID Context, IN PUNICODE_STRING PathName,
	IN INTERFACE_TYPE BusType, IN ULONG BusNumber, IN PKEY_VALUE_FULL_INFORMATION *BusInfo,
	IN CONFIGURATION_TYPE CtrlrType, IN ULONG CtrlrNumber, IN PKEY_VALUE_FULL_INFORMATION *CtrlrInfo,
	IN CONFIGURATION_TYPE PeripheralType, IN ULONG PeripheralNumber, IN PKEY_VALUE_FULL_INFORMATION *PeripheralInfo
	)
{
	DebugPrint( "ConfigCallback: Bus: %d,%d",BusType,BusNumber);
	DebugPrint( "ConfigCallback: Controller: %d,%d",CtrlrType,CtrlrNumber);
	DebugPrint( "ConfigCallback: Peripheral: %d,%d",PeripheralType,PeripheralNumber);

	if( CtrlrInfo!=NULL)
	{
		PCM_FULL_RESOURCE_DESCRIPTOR frd = (PCM_FULL_RESOURCE_DESCRIPTOR)
			(((PUCHAR)CtrlrInfo[IoQueryDeviceConfigurationData])
			+CtrlrInfo[IoQueryDeviceConfigurationData]->DataOffset);
		for( ULONG i=0; i<frd->PartialResourceList.Count; i++)
		{
			PCM_PARTIAL_RESOURCE_DESCRIPTOR resource = &frd->PartialResourceList.PartialDescriptors[i];
			switch( resource->Type)
			{
			case CmResourceTypePort:
				DebugPrint( "ConfigCallback: I/O port %x,%d",
						resource->u.Port.Start.LowPart, resource->u.Port.Length);
				break;
			case CmResourceTypeInterrupt:
				DebugPrint( "ConfigCallback: Interrupt level %d vector %d", resource->u.Interrupt.Level, resource->u.Interrupt.Vector);
				break;
			default:
				DebugPrint( "ConfigCallback: Resource type %d",resource->Type);
			}
		}
	}
	return STATUS_SUCCESS;
}

NTSTATUS FindParallelPort()
{
	NTSTATUS status;
	for( int BusType=0; BusType<MaximumInterfaceType; BusType++)
	{
		INTERFACE_TYPE iBusType = (INTERFACE_TYPE)BusType;
		CONFIGURATION_TYPE CtrlrType = ParallelController;
		ULONG BusNumber = 0;
		while(true)
		{
			// See if this bus instance exists
			status = IoQueryDeviceDescription(
					&iBusType, &BusNumber,
					NULL, NULL,
					NULL, NULL,
					AbcConfigCallback, NULL);
			if( !NT_SUCCESS(status))
			{
				if( status != STATUS_OBJECT_NAME_NOT_FOUND)
					return status;
				break;
			}

			// See what printers exist on this bus instance
			status = IoQueryDeviceDescription(
					&iBusType, &BusNumber,
					&CtrlrType, NULL,
					NULL, NULL,
					AbcConfigCallback, NULL);
			if( !NT_SUCCESS(status) &&
				(status != STATUS_OBJECT_NAME_NOT_FOUND))
				return status;
			BusNumber++;
		}
	}
	return status;
}

⌨️ 快捷键说明

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