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

📄 pcienum.cpp

📁 此代码为WCE5.0下PCI总线的源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
        if ( AssignChildDriver())
            return TRUE;
    };
    DEBUGMSG(ZONE_ENUM|ZONE_ERROR,(TEXT("-BusENUM!Init eturn FALSE!!!\r\n")));
    return FALSE;
    
};
BOOL PciBusEnum::PostInit()
{
    BOOL bReturn = FALSE;
    if ( GetDeviceHandle()!=NULL &&  m_DeviceKey.IsKeyOpened()) {
        bReturn=ActiveAllChildDriver();
    };
    return bReturn;
}
DWORD PciBusEnum::GetBusNamePrefix(LPTSTR lpReturnBusName,DWORD dwSizeInUnit)
{
    if (m_lpBusName && lpReturnBusName &&  dwSizeInUnit) {
        DWORD dwCopyUnit = min(_tcslen(m_lpBusName) +1 , dwSizeInUnit);
        _tcsncpy(lpReturnBusName,m_lpBusName,dwCopyUnit);
        lpReturnBusName[dwCopyUnit-1]=0;
        return dwCopyUnit;
    }
    else
        return DefaultBusDriver::GetBusNamePrefix(lpReturnBusName,dwSizeInUnit);
}

BOOL PciBusEnum::AssignChildDriver()
{
    DWORD NumSubKeys;
    DWORD MaxSubKeyLen;
    DWORD MaxClassLen;
    DWORD NumValues;
    DWORD MaxValueNameLen;
    DWORD MaxValueLen;
    // Get info on Template Key
    BOOL bSuccess = m_DeviceKey.RegQueryInfoKey(
                NULL,               // class name buffer (lpszClass)
                NULL,               // ptr to length of class name buffer (lpcchClass)
                NULL,               // reserved
                &NumSubKeys,        // ptr to number of sub-keys (lpcSubKeys)
                &MaxSubKeyLen,      // ptr to longest subkey name length (lpcchMaxSubKeyLen)
                &MaxClassLen,       // ptr to longest class string length (lpcchMaxClassLen)
                &NumValues,         // ptr to number of value entries (lpcValues)
                &MaxValueNameLen,  // ptr to longest value name length (lpcchMaxValueNameLen)
                &MaxValueLen,       // ptr to longest value data length (lpcbMaxValueData)
                NULL,               // ptr to security descriptor length
                NULL);              // ptr to last write time
                    
    if (!bSuccess) {
        DEBUGMSG(ZONE_ENUM|ZONE_ERROR,
            (TEXT("PCMCIA::RegCopyKey RegQueryInfoKey returned fails.\r\n")));
        return FALSE;
    }
    // Recurse for each sub-key
    
    for (DWORD Key = 0; Key < NumSubKeys; Key++) {
        // Get TKey sub-key according to Key
        WCHAR ValName[PCI_MAX_REG_NAME];
        DWORD ValLen = sizeof(ValName) / sizeof(WCHAR);
        if (! m_DeviceKey.RegEnumKeyEx(  Key, ValName, &ValLen, NULL,  NULL,  NULL, NULL)){
            DEBUGMSG(ZONE_ENUM,
                (TEXT("BusEnum::RegCopyKey RegEnumKeyEx(%d) returned Error\r\n"), ValName));
            break;
        }
        else {
            // Open sub-key under TKey
            CRegistryEdit TSubKey(m_DeviceKey.GetHKey(),ValName);
            if (!TSubKey.IsKeyOpened()) {
                DEBUGMSG(ZONE_ENUM|ZONE_ERROR,
                    (TEXT("PCIBUS::RegCopyKey RegOpenKeyEx(%s) returned Error\r\n"), ValName));
                
                continue;
            }
            else { // Get Bus Info.
                DDKPCIINFO dpi;
                dpi.cbSize = sizeof (DDKPCIINFO);                
                dpi.dwDeviceNumber = (DWORD)-1;
                dpi.dwFunctionNumber = (DWORD)-1;
                if (TSubKey.GetPciInfo(&dpi)!=ERROR_SUCCESS || dpi.dwDeviceNumber == (DWORD)-1 || dpi.dwFunctionNumber == (DWORD)-1) {
                    dpi.dwDeviceNumber = m_dwDeviceIndex++;
                    dpi.dwFunctionNumber = 0;
                }
                DWORD dwBusNumber = (DWORD)-1;
                if ( !TSubKey.GetRegValue(PCIBUS_BUSNUMBER_VALNAME, (LPBYTE)&dwBusNumber, sizeof(dwBusNumber)) || dwBusNumber == (DWORD)-1) {
                    dwBusNumber = m_dwBusNumber;
                }
                // We Create Foler for this driver.
                TCHAR lpChildPath[DEVKEY_LEN];
                _tcsncpy(lpChildPath,m_lpActiveRegPath,DEVKEY_LEN-1);
                lpChildPath[DEVKEY_LEN-2] = 0;
                DWORD dwLen=_tcslen(lpChildPath);
                lpChildPath[dwLen]=_T('\\');
                dwLen++;
                lpChildPath[dwLen]=0;
                _tcsncat(lpChildPath,ValName,DEVKEY_LEN-1-dwLen);
                lpChildPath[DEVKEY_LEN-1]=0;

                PCI_SLOT_NUMBER SlotNumber;
                SlotNumber.u.bits.DeviceNumber= dpi.dwDeviceNumber;
                SlotNumber.u.bits.FunctionNumber =  dpi.dwFunctionNumber;
                PciDeviceFolder * nDevice =
                    new PciDeviceFolder (m_lpBusName!=NULL?m_lpBusName:BUSNAMEUNKNOWN,
                            lpChildPath,m_dwBusType,dwBusNumber,SlotNumber,GetDeviceHandle());
                if (nDevice) {
                    nDevice->SetAlwaysBackup(m_dwCfgAlwaysBackup!=0);
                    InsertChild(nDevice);
                }
            }
            
        }
    }
    
    return TRUE;
}
#define MAX_TEMP_BUFFER_SIZE 0x200
BOOL PciBusEnum::ActiveAllChildDriver()
{
    Lock();
    PciDeviceFolder * pCurDevice = (PciDeviceFolder *)GetDeviceList ();
    while (pCurDevice) {
        DEBUGMSG(ZONE_ENUM,(TEXT("Activate Child: Template reg path is %s\r\n"),pCurDevice->GetRegPath()));
        // Create Initial Active Registry.
        for (DWORD dwIndex=0; dwIndex< m_dwNumOfInitParam; dwIndex++) {
            BYTE tempBuffer[ MAX_TEMP_BUFFER_SIZE] ;
            DWORD dwSize=MAX_TEMP_BUFFER_SIZE;
            DWORD dwType;
            if (m_DeviceKey.IsKeyOpened() && 
                    m_DeviceKey.RegQueryValueEx(m_lpInitParamArray[dwIndex],&dwType, tempBuffer,&dwSize) ) {
                REGINI Reg;
                Reg.lpszVal = m_lpInitParamArray[dwIndex];
                Reg.dwType = dwType;
                Reg.dwLen = dwSize;
                Reg.pData = tempBuffer;
                pCurDevice->AddInitReg(1, &Reg);
                DEBUGMSG(ZONE_ENUM,(TEXT("Activate Child add %s to %s ActivePath\r\n"),m_lpInitParamArray[dwIndex],pCurDevice->GetRegPath()));                
            }
        }
        pCurDevice =(PciDeviceFolder *) pCurDevice->GetNextDeviceFolder();
    }
    // Activate Device 
    DWORD dwCurOrder = 0;
    while (dwCurOrder != MAXDWORD) {
        DEBUGMSG(ZONE_ENUM,(TEXT("Activate Child LoaderDriver at order %d \r\n"),dwCurOrder));
        DWORD dwNextOrder = MAXDWORD;
        pCurDevice = (PciDeviceFolder *)GetDeviceList ();
        while (pCurDevice) {
            DWORD dwDeviceLoadOrder = pCurDevice->GetLoadOrder();
            if ( dwDeviceLoadOrder == dwCurOrder)
                pCurDevice->LoadDevice();
            else 
            if (dwDeviceLoadOrder> dwCurOrder  && dwDeviceLoadOrder < dwNextOrder)
                dwNextOrder = dwDeviceLoadOrder;
            pCurDevice = (PciDeviceFolder *)pCurDevice->GetNextDeviceFolder();
        }
        dwCurOrder = dwNextOrder;
    }
    Unlock();
    return TRUE;
}
BOOL PciBusEnum::PowerUp() 
{
    Lock();
    PciDeviceFolder * pCurDevice = (PciDeviceFolder *)GetDeviceList ();
    DWORD dwCurOrder = 0;
    while (dwCurOrder != MAXDWORD) {
        DEBUGMSG(ZONE_ENUM,(TEXT("PowerUp for order %d \r\n"),dwCurOrder));
        DWORD dwNextOrder = MAXDWORD;
        pCurDevice = (PciDeviceFolder *)GetDeviceList ();
        while (pCurDevice) {
            DWORD dwDeviceLoadOrder = pCurDevice->GetLoadOrder();
            if ( dwDeviceLoadOrder == dwCurOrder)
                pCurDevice->PowerUp();
            else 
            if (dwDeviceLoadOrder> dwCurOrder  && dwDeviceLoadOrder < dwNextOrder)
                dwNextOrder = dwDeviceLoadOrder;
            pCurDevice = (PciDeviceFolder *)pCurDevice->GetNextDeviceFolder();
        }
        dwCurOrder = dwNextOrder;
    }
    Unlock();    
    return TRUE;
}
BOOL PciBusEnum::PowerDown()
{
    Lock();
    PciDeviceFolder * pCurDevice =( PciDeviceFolder *) GetDeviceList ();
    DWORD dwCurOrder = MAXDWORD-1;
    while (dwCurOrder != MAXDWORD ) {
        DEBUGMSG(ZONE_ENUM,(TEXT("PowerDonw for order %d \r\n"),dwCurOrder));
        DWORD dwNextOrder = 0 ;
        pCurDevice = (PciDeviceFolder *)GetDeviceList ();
        while (pCurDevice) {
            DWORD dwDeviceLoadOrder = pCurDevice->GetLoadOrder();
            if ( dwDeviceLoadOrder == dwCurOrder)
                pCurDevice->PowerDown();
            else 
            if (dwDeviceLoadOrder< dwCurOrder  && dwDeviceLoadOrder > dwNextOrder)
                dwNextOrder = dwDeviceLoadOrder;
            pCurDevice =(PciDeviceFolder *) pCurDevice->GetNextDeviceFolder();
        }
        if (dwCurOrder==0 && dwNextOrder == 0 ) {
            dwCurOrder = MAXDWORD;
            break;
        }
        else
            dwCurOrder = dwNextOrder;
    }
    Unlock();
    return TRUE;
}
BOOL PciBusEnum::SetChildDevicePowerState( PCE_BUS_POWER_STATE pPowerState)
{
    BOOL bReturn = FALSE;
    if ( pPowerState !=NULL &&  pPowerState->lpDeviceBusName !=NULL && pPowerState->lpceDevicePowerState) { 
        PciDeviceFolder * pDevice = (PciDeviceFolder * )GetChildByName(pPowerState->lpDeviceBusName);
        if (pDevice) {
            bReturn=pDevice->SetPowerState(*(pPowerState->lpceDevicePowerState));
            pDevice->DeRef();
        }
    }
    return bReturn;
}
BOOL PciBusEnum::GetChildDevicePowerState( PCE_BUS_POWER_STATE pPowerState)
{
    BOOL bReturn = FALSE;
    if ( pPowerState !=NULL &&  pPowerState->lpDeviceBusName !=NULL && pPowerState->lpceDevicePowerState) { 
        PciDeviceFolder * pDevice = (PciDeviceFolder * )GetChildByName(pPowerState->lpDeviceBusName);
        if (pDevice) {
            bReturn = TRUE;
            *(pPowerState->lpceDevicePowerState)=pDevice->GetPowerState();
            pDevice->DeRef();
        }
    }
    return bReturn;
}

extern "C"
HANDLE CreatePciBus(LPCTSTR lpActiveRegPath,LPCTSTR lpInstanceRegPath)
{
    DefaultBusDriver * pBusDriver = new PciBusEnum(lpActiveRegPath,lpInstanceRegPath);
    if ( pBusDriver) {
        if ( pBusDriver->Init())
            return  (HANDLE)pBusDriver;
        else 
            delete  pBusDriver;
    }
    return NULL;
}


extern "C" void
DeletePciBus(HANDLE hInstance)
{
    DefaultBusDriver * pBusDriver = (DefaultBusDriver * )hInstance;
    if (pBusDriver )
        delete pBusDriver ;    
}
extern "C" BOOL 
PowerUp(DWORD dwData)
{
    DEBUGMSG(ZONE_INIT,(TEXT("Pcibus.DLL : +PowerUp dwData=%x \r\n"),dwData));
    DefaultBusDriver * pBusDriver = (DefaultBusDriver * )dwData;
    if (pBusDriver)
        pBusDriver->PowerUp();
    DEBUGMSG(ZONE_INIT,(TEXT("Pcibus.DLL : -PowerUp dwData=%x \r\n")));
    return TRUE;
}
extern "C" BOOL 
PowerDown(DWORD dwData)
{
    DEBUGMSG(ZONE_INIT,(TEXT("Pcibus.DLL : +PowerDown dwData=%x \r\n"),dwData));
    DefaultBusDriver * pBusDriver = (DefaultBusDriver * )dwData;
    if (pBusDriver)
        pBusDriver->PowerDown();
    DEBUGMSG(ZONE_INIT,(TEXT("Pcibus.DLL : -PowerDown dwData=%x \r\n")));
    return TRUE;
}

extern "C" HANDLE
Open(
        HANDLE  pHead,          // @parm Handle returned by COM_Init.
        DWORD   AccessCode,     // @parm access code.
        DWORD   ShareMode       // @parm share mode - Not used in this driver.
        )
{
    DefaultBusDriver * pBusDriver = (DefaultBusDriver * )pHead;
    if (pBusDriver && pBusDriver->Open(AccessCode,ShareMode))
        return (HANDLE)pBusDriver;
    return NULL;
}
extern "C" BOOL
Close(HANDLE pOpenHead)
{
    DefaultBusDriver * pBusDriver = (DefaultBusDriver * )pOpenHead;
    if (pBusDriver)
        return pBusDriver->Close();
    return FALSE;
}
extern "C" BOOL
IOControl(HANDLE pOpenHead,
              DWORD dwCode, PBYTE pBufIn,
              DWORD dwLenIn, PBYTE pBufOut, DWORD dwLenOut,
              PDWORD pdwActualOut)
{
    DefaultBusDriver * pBusDriver = (DefaultBusDriver * )pOpenHead;
    if (pBusDriver)
        return pBusDriver->IOControl(dwCode,pBufIn,dwLenIn,pBufOut,dwLenOut,pdwActualOut);
    return FALSE;
}


⌨️ 快捷键说明

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