static void ShowResourceGroup( struct ISAPNP_ResourceGroup* resource_group, struct ISAPNPBase* res ) { struct ISAPNP_Resource* r; struct ISAPNP_ResourceGroup* rg; for( r = (struct ISAPNP_Resource*) resource_group->isapnprg_Resources.mlh_Head; r->isapnpr_MinNode.mln_Succ != NULL; r = (struct ISAPNP_Resource*) r->isapnpr_MinNode.mln_Succ ) { Printf( " " ); ShowResource( r, res ); } if( resource_group->isapnprg_ResourceGroups.mlh_Head->mln_Succ != NULL ) { Printf( " One of\n" ); for( rg = (struct ISAPNP_ResourceGroup*) resource_group->isapnprg_ResourceGroups.mlh_Head; rg->isapnprg_MinNode.mln_Succ != NULL; rg = (struct ISAPNP_ResourceGroup*) rg->isapnprg_MinNode.mln_Succ ) { Printf( " {\n" ); ShowResourceGroup( rg, res ); Printf( " }\n" ); } } }
void GetInterruptResource(PDEVICE_OBJECT fdo, PIRP Irp) { PCM_PARTIAL_RESOURCE_DESCRIPTOR cmPartialResourceDescriptor; PIO_STACK_LOCATION IrpStack = IoGetCurrentIrpStackLocation(Irp); PLOCAL_DEVICE_INFO pdx = (PLOCAL_DEVICE_INFO)fdo->DeviceExtension; ULONG i; // Get the number of resources we need PCM_RESOURCE_LIST cmResourceList = IrpStack->Parameters.StartDevice.AllocatedResourcesTranslated; PCM_FULL_RESOURCE_DESCRIPTOR cmFullResourceDescriptor = &cmResourceList->List[0]; PCM_PARTIAL_RESOURCE_LIST cmPartialResourceList = &cmFullResourceDescriptor->PartialResourceList; ShowResource(cmPartialResourceList); for (i = 0; i < cmPartialResourceList->Count; i++) { cmPartialResourceDescriptor = &cmPartialResourceList->PartialDescriptors[i]; switch (cmPartialResourceDescriptor->Type) { case CmResourceTypeInterrupt: { if (cmPartialResourceDescriptor->Flags == CM_RESOURCE_INTERRUPT_LEVEL_SENSITIVE) { DebugPrint(DBG_WDM | DBG_KERNEL, " Interrupt Mode : LevelSensitive\n"); pdx->InterruptMode = LevelSensitive; } else { DebugPrint(DBG_WDM | DBG_KERNEL, " Interrupt Mode : Latched\n"); pdx->InterruptMode = Latched; } pdx->InterruptShareDisposition = cmPartialResourceDescriptor->ShareDisposition; pdx->InterruptSharable = (pdx->InterruptShareDisposition & CmResourceShareShared) ? TRUE : FALSE; pdx->InterruptVector = cmPartialResourceDescriptor->u.Interrupt.Vector; pdx->InterruptLevel = cmPartialResourceDescriptor->u.Interrupt.Level; pdx->InterruptAffinity = cmPartialResourceDescriptor->u.Interrupt.Affinity; break; } default: { DebugPrint(DBG_WDM | DBG_ERROR, " The Resource Type not HANDLE!\n"); break; } } } }
static void ShowCards( BOOL show_options, struct ISAPNPBase* res ) { struct ISAPNP_Card* card; for( card = (struct ISAPNP_Card*) res->m_Cards.lh_Head; card->isapnpc_Node.ln_Succ != NULL; card = (struct ISAPNP_Card*) card->isapnpc_Node.ln_Succ ) { struct ISAPNP_Device* dev; Printf( "Card %ld: %s%03lx%lx/%ld ('%s')\n", card->isapnpc_CSN, (ULONG) card->isapnpc_ID.isapnpid_Vendor, card->isapnpc_ID.isapnpid_ProductID, card->isapnpc_ID.isapnpid_Revision, card->isapnpc_SerialNumber, card->isapnpc_Node.ln_Name != NULL ? (ULONG) card->isapnpc_Node.ln_Name : (ULONG) "" ); Printf( " PnP version: %ld.%ld\n", card->isapnpc_MajorPnPVersion, card->isapnpc_MinorPnPVersion ); Printf( " Vendor specific version number: %ld.%ld\n", card->isapnpc_VendorPnPVersion >> 4, card->isapnpc_VendorPnPVersion & 0x0f ); for( dev = (struct ISAPNP_Device*) card->isapnpc_Devices.lh_Head; dev->isapnpd_Node.ln_Succ != NULL; dev = (struct ISAPNP_Device*) dev->isapnpd_Node.ln_Succ ) { struct ISAPNP_Identifier* id; struct ISAPNP_Resource* r; Printf( " Logical device %ld: ", dev->isapnpd_DeviceNumber ); for( id = (struct ISAPNP_Identifier*) dev->isapnpd_IDs.mlh_Head; id->isapnpid_MinNode.mln_Succ != NULL; id = (struct ISAPNP_Identifier*) id->isapnpid_MinNode.mln_Succ ) { Printf( "%s%03lx%lx ", (ULONG) id->isapnpid_Vendor, id->isapnpid_ProductID, id->isapnpid_Revision ); } if( dev->isapnpd_Node.ln_Name != NULL ) { Printf( "('%s')", (ULONG) dev->isapnpd_Node.ln_Name ); } Printf( "\n" ); if( dev->isapnpd_SupportedCommands & ISAPNP_DEVICE_SCF_BOOTABLE ) { Printf( " Device is capable of participating in the boot process.\n" ); } if( dev->isapnpd_SupportedCommands & ISAPNP_DEVICE_SCF_RANGE_CHECK ) { Printf( " Device supports IO range checking.\n" ); } Printf( " Allocated resources:\n" ); if( dev->isapnpd_Resources.mlh_Head->mln_Succ != NULL ) { for( r = (struct ISAPNP_Resource*) dev->isapnpd_Resources.mlh_Head; r->isapnpr_MinNode.mln_Succ != NULL; r = (struct ISAPNP_Resource*) r->isapnpr_MinNode.mln_Succ ) { Printf( " " ); ShowResource( r, res ); } } else { Printf( " None.\n" ); } if( show_options ) { Printf( " Requested resources:\n" ); ShowResourceGroup( dev->isapnpd_Options, res ); } } } }