////////////////////////////////////////////////////////////////
// File - PCI_SCAN.C
//
// A utility for getting a list of the PCI cards installed 
// and the resources allocated for each one of them (memory 
// ranges, IO ranges and interrupts).
// 
////////////////////////////////////////////////////////////////

#include <windows.h>
#include <stdio.h>
#include <winioctl.h>
#include "..\windrvr.h"

HANDLE hWD;

void print_card_info(WD_PCI_SLOT pciSlot)
{
    WD_PCI_CARD_INFO pciCardInfo;
    DWORD i;

    pciCardInfo.pciSlot = pciSlot;
    WD_PciGetCardInfo (hWD, &pciCardInfo);

    for (i=0; i<pciCardInfo.Card.dwItems; i++)
    {
        WD_ITEMS item = pciCardInfo.Card.Item[i];
        printf ("   Item ",i);
        switch (item.item)
        {
        case ITEM_MEMORY:
            printf ("Memory: range 0x%x-0x%x", 
                item.I.Mem.dwPhysicalAddr, item.I.Mem.dwPhysicalAddr+item.I.Mem.dwBytes-1);
            break;
        case ITEM_IO:
            printf ("IO: range 0x%x-0x%x", 
                item.I.IO.dwAddr, item.I.IO.dwAddr+item.I.IO.dwBytes-1);
            break;
        case ITEM_INTERRUPT:
            printf ("Interrupt: irq %d", item.I.Int.dwInterrupt);
            break;
        default:
            printf ("Invalid item type");
            break;
        }
        printf ("\n");
    }
}

int main (int argc, char *argv[]) 
{
    WD_VERSION ver;
    WD_PCI_SCAN_CARDS pciScan;
    WD_PCI_SLOT pciSlot;
    WD_PCI_ID   pciId;
    DWORD i;

    hWD=WD_Open();
    if (hWD==INVALID_HANDLE_VALUE) 
    {
        printf("Error: Cannot open WinDriver device\n");
        exit(1);
    }
    WD_Version(hWD,&ver);
    if (ver.dwVer!=WD_VER) 
    {
        printf ("Error: incorrect WINDRVR version. needs ver %d\n",WD_VER);
        exit(1);
    }
    else 
    {
        printf("Using %s\n",ver.cVer);
    }


    pciScan.searchId.dwVendorId = 0;
    pciScan.searchId.dwDeviceId = 0;

    printf ("Pci bus scan:\n\n");
    WD_PciScanCards (hWD,&pciScan);

    for (i=0; i<pciScan.dwCards; i++)
    {
        pciId = pciScan.cardId[i];
        pciSlot = pciScan.cardSlot[i];
        printf("Bus %d Slot %d Function %d, VendorID %04x DeviceID %04x\n",
            pciSlot.dwBus, pciSlot.dwSlot, pciSlot.dwFunction, pciId.dwVendorId, pciId.dwDeviceId);

        print_card_info(pciSlot);
        printf("\n");
    }

    WD_Close(hWD);

    return 0;
}