📄 pcienum.cpp
字号:
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 + -