05. november 2002 - 09:39Der er
9 kommentarer og 1 løsning
Devicemanager win32
Jeg har følgende metode til at hente informationer fra devicemanageren i windows. Mit spørgsmål er så: "Hvordan tilpasser jeg input værdierne til SetupDiGetClassDevs(...) for f.eks. udelukkende at hente informationer om displayadapteren? På MSDN står der noget om et GUID .."ClassGuid [in] Pointer to a class GUID for a setup class or an interface class. This parameter is optional. ".. http://msdn.microsoft.com/library/default.asp?url=/library/en-us/devio/base/setupdigetclassdevs.asp
GUID er et globalt tildelt nummer, som hver producent af hardware har fået af PCI-organisationen. (Nogle hHW producenter er underleveranødren til andre producenter, og bruge så et sub-GUID til at "markere" deres egne kort.)
Fidusen er at driveren til de pågældende kort så kender deres GUID på forhånd, og derfor kan "spørge" windows, hvilke adresser, interrupt osv. "deres" kort har fået. Følgende kodestump, som jeg har fået sammen med et specielt PCI-kort, viser hvordan programmet (driveren) finder frem til sit eget kort:
/* ************************************************************************ * * apci.c - PCI Access Demo program * * * * $Author DGS$ * * $Log$ * * * * Modification History * * 26-05-99 RHB 2 * * - Added COM4 to list of boards detected * * 01-03-98 DGS 1 * * - Created using BorlandC 4.5. * * ************************************************************************ */
/******************************* Include Files ******************************/
/****************************** Global Variables ****************************/
int NOBOARD = TRUE; /* ARCOM PCI not found*/ int ERROR = FALSE; /* Global Error Flag */
union REGS inregs, outregs;
/* Definitions so that BYTE is 8-bits, WORD is 16-bits, and DWORD is 32-bits */
typedef unsigned char BYTE ; typedef unsigned short WORD ; typedef unsigned long DWORD ;
/****************************** Function Prototypes *************************/
void main (void); WORD FIND_PCI_DEVICE(WORD device, WORD vendor, WORD index); WORD READ_CONFIG_WORD(WORD PCIdevice, BYTE Regnum); WORD READ_CONFIG_BYTE(WORD PCIdevice, BYTE Regnum); void WRITE_CONFIG_WORD(WORD PCIdevice, BYTE Regnum, WORD Value); void Verifyboard(WORD board); WORD IOaddrange(WORD PCIdevice); void Testboard(WORD base, WORD board); void IoWrite(int base, int ioaddr, int value);
/******************************** Main Program ******************************/
void main(void) { int c; int Index = 0; /* Instance of device */ WORD PCIdevice; /* Bus number, Device nuber and Function number */ WORD board; /* APCI board ID */ WORD regval; /* Register Value */ WORD base; /* Base address */
printf("\nTest Board access Y/N ?"); /* Ask if user wants to test board */ c=getch();
if ((c=toupper(c))=='Y') { Testboard(base,board); /* Flash board LED */ } else { printf("\n\n"); /* Format display correctly */ } } ++Index; /* Increase index and search for next device */ } if (NOBOARD==TRUE) printf("No Arcom PCI boards detected\n");
}
/***************************************************************************** * Find_pci_device - Uses INT 1A to find a specified PCI device * * * * parameters passed : Device - PCI chip * * Vendor - Manufacturers ID * * Index - Instance of device * * Return values : PCIdevice - bus, device and function number * ****************************************************************************/
WORD FIND_PCI_DEVICE(WORD device, WORD vendor, WORD index) { WORD PCIdevice = 0;
inregs.h.ah = 0xb1; /* PCI function ID */ inregs.h.al = 0x02; /* FIND_PCI_DEVICE Function */ inregs.x.cx = device; /* Device ID */ inregs.x.dx = vendor; /* Vendor ID */ inregs.x.si = index; /* Instance of device */
/***************************************************************************** * Read_Config_Word - Uses INT 1A to read a specified word * * * * parameters passed : PCIdevice - bus, device and function number * * Regnum - register to read * * Return values : Regval - Value returned from register * ****************************************************************************/
WORD READ_CONFIG_WORD(WORD PCIdevice, BYTE Regnum) { WORD Regval;
inregs.h.ah = 0xb1; /* PCI function ID */ inregs.h.al = 0x09; /* READ_CONFIG_WORD Function */ inregs.x.bx = PCIdevice; /* Device */ inregs.x.di = Regnum; /* Register number to read */
/***************************************************************************** * Read_Config_Byte - Uses INT 1A to read a specified byte * * * * parameters passed : Regnum - Register to write * * Value - Value to be written * * Return values : Regval - value read * ****************************************************************************/
WORD READ_CONFIG_BYTE(WORD PCIdevice, BYTE Regnum) { BYTE Regval;
inregs.h.ah = 0xb1; /* PCI function ID */ inregs.h.al = 0x08; /* READ_CONFIG_WORD Function */ inregs.x.bx = PCIdevice; /* Device */ inregs.x.di = Regnum; /* Register number to read */
/***************************************************************************** * Write_Config_Word - Uses INT 1A to wrie a specified word * * * * parameters passed : PCIdevice - Bus, device and function number * * Regnum - Register to write * * Value - Value to be written * * Return values : None * ****************************************************************************/
void WRITE_CONFIG_WORD(WORD PCIdevice, BYTE Regnum, WORD Value) { inregs.h.ah = 0xb1; /* PCI function ID */ inregs.h.al = 0x0c; /* WRITE_CONFIG_WORD Function */ inregs.x.bx = PCIdevice; /* Device */ inregs.x.di = Regnum; /* Register number to write */ inregs.x.cx = Value;
/***************************************************************************** * Verifyboard - Checks which board has been found and prints a message to * * the display * * parameters passed : Board - name of board found * * Return values : None * ****************************************************************************/
switch(board) { case IB40 :printf("APCI-IB40\n"); break; case SER4 :printf("APCI-SER4\n"); break; case RELAY8 :printf("APCI-RELAY8/IN8\n"); break; case ADADIO :printf("APCI-ADADIO\n"); break; case COM4 :printf("APCI-COM4\n"); break; default :printf("UNKNOWN\n"); break; } }
/***************************************************************************** * IOaddrange - Determines I/O address range allocated to PCI card * * * * parameters passed : PCIdevice - Bus, device and Function number * * Return values : lower - Base address * ****************************************************************************/
WORD IOaddrange(WORD PCIdevice) { WORD lower, upper;
lower = READ_CONFIG_WORD(PCIdevice, BASEADDRREG); /* Read Base addr register */ WRITE_CONFIG_WORD(PCIdevice, BASEADDRREG,0xFFFF); /* Write all 1's to base addr register */ upper = READ_CONFIG_WORD(PCIdevice, BASEADDRREG); /* Read base addr register */ WRITE_CONFIG_WORD(PCIdevice, BASEADDRREG, lower); /* Restore orignal value */ --lower; /* Strip off I/O bit */ --upper; upper = ~upper; /* Invert upper */ upper = upper + lower; /* Add to base addr to give range */ printf("\tAddrees Range\t%xH - %xH\n",lower,upper);
return(lower); /* Return base address */
}
/***************************************************************************** * Testboard - Flashes user led until key is pressed * * * * parameters passed : Base - base address of board * * Board - board name * * Return values : None * ****************************************************************************/ void Testboard(WORD base, WORD board)
{ if ((board == RELAY8) || (board == COM4)) { printf("\n\nThe RED ACCESS LED should be ON, press any key to turm OFF\n\n"); while(!kbhit()) { IoWrite(base,0,0); } getch(); }
else { printf("\n\nThe GREEN user LED shoud be flashing, press any Key to continue.\n\n");
while (!kbhit()) { IoWrite(base,USERLED, LEDON); /* Turn User LED ON */ delay(500); /* Wait 500ms */ IoWrite(base,USERLED, LEDOFF); /* Turn user LED OFF */ delay(500); /* Wait 500ms */ } getch(); } }
/*************************************************************************** * IoWrite - write to the port. * * * * Paramters passed : BASE - base address of board under test. * * ioaddr - address pointer to the port. * * value - data to be output. * * Return : None. * ****************************************************************************/
void IoWrite(int base, int ioaddr, int value) { outp(base,ioaddr); /* Set up I/O address */ outp(base+1,value); /* Write value to I/O address */ }
Det er metoden FIND_PCI-DEVICE der er (mest) interessant.
Tak for det.. jeg må se om jeg kan få noget ud af det. Umiddelbart virker det lidt uoverskueligt. Jeg fandt ud af at hente netværkskortet fra registreringsdatabasen, så nu mangler jeg bare grafikkortet.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.