예제 #1
0
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;
			}
		} 
	}
}
예제 #3
0
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 );
      }
    }
  }
}