📄 bus.c
字号:
}
if (pBusAccess->hBus != INVALID_HANDLE_VALUE) {
// Call parent device bus
deviceConfigData.lpDeviceBusName = pBusAccess->pszDeviceName;
deviceConfigData.dwSpace = space;
deviceConfigData.dwOffset = offset;
deviceConfigData.dwLength = length;
deviceConfigData.pBuffer = pBuffer;
rc = DeviceIoControl(
pBusAccess->hBus, IOCTL_BUS_SET_CONFIGURE_DATA, &deviceConfigData,
sizeof(deviceConfigData), NULL, 0, NULL, 0
);
} else if (
space == PCI_WHICHSPACE_CONFIG ||
space == PCCARD_PCI_CONFIGURATION_SPACE
) {
// Call HAL for config space
rc = HalSetBusDataByOffset(
PCIConfiguration, busNumber, slotNumber, pBuffer, offset, length
);
} else {
SetLastError(ERROR_INVALID_HANDLE);
}
clean:
return rc;
}
//------------------------------------------------------------------------------
ULONG GetDeviceConfigurationData(
HANDLE hBusAccess, DWORD space, DWORD busNumber, DWORD slotNumber,
DWORD offset, DWORD length, VOID *pBuffer
) {
ULONG rc = 0;
PARENT_BUS_ACCESS *pBusAccess = (PARENT_BUS_ACCESS *)hBusAccess;
CE_BUS_DEVICE_CONFIGURATION_DATA deviceConfigData;
// Check passed handler
if (pBusAccess == NULL || pBusAccess->cookie != BUS_ACCESS_COOKIE) {
SetLastError(ERROR_INVALID_HANDLE);
goto clean;
}
if (pBusAccess->hBus != INVALID_HANDLE_VALUE) {
// Call parent device bus
deviceConfigData.lpDeviceBusName = pBusAccess->pszDeviceName;
deviceConfigData.dwSpace = space;
deviceConfigData.dwOffset = offset;
deviceConfigData.dwLength = length;
deviceConfigData.pBuffer = pBuffer;
rc = DeviceIoControl(
pBusAccess->hBus, IOCTL_BUS_GET_CONFIGURE_DATA, &deviceConfigData,
sizeof(deviceConfigData), NULL, 0, NULL, 0
);
} else if (
space == PCI_WHICHSPACE_CONFIG ||
space == PCCARD_PCI_CONFIGURATION_SPACE
) {
// Call HAL for config space
rc = HalGetBusDataByOffset(
PCIConfiguration, busNumber, slotNumber, pBuffer, offset, length
);
} else {
SetLastError(ERROR_INVALID_HANDLE);
}
clean:
return rc;
}
//------------------------------------------------------------------------------
BOOL GetParentDeviceInfo(HANDLE hBusAccess, DEVMGR_DEVICE_INFORMATION *pInfo)
{
BOOL rc = FALSE;
PARENT_BUS_ACCESS *pBusAccess = (PARENT_BUS_ACCESS *)hBusAccess;
// Check passed handler
if (pBusAccess == NULL || pBusAccess->cookie != BUS_ACCESS_COOKIE) {
SetLastError(ERROR_INVALID_HANDLE);
goto clean;
}
rc = GetDeviceInformationByDeviceHandle(pBusAccess->hRefBus, pInfo);
clean:
return rc;
}
//------------------------------------------------------------------------------
BOOL GetChildDeviceRemoveState(HANDLE hBusAccess, DWORD *pChildDeviceState)
{
BOOL rc = FALSE;
PARENT_BUS_ACCESS *pBusAccess = (PARENT_BUS_ACCESS *)hBusAccess;
// Check passed handler
if (pBusAccess == NULL || pBusAccess->cookie != BUS_ACCESS_COOKIE) {
SetLastError(ERROR_INVALID_HANDLE);
goto clean;
}
// Call parent device if exists
if (pBusAccess->hBus != INVALID_HANDLE_VALUE) {
rc = DeviceIoControl(
pBusAccess->hBus, IOCTL_BUS_GET_CONFIGURE_DATA,
pBusAccess->pszDeviceName,
(_tcslen(pBusAccess->pszDeviceName) + 1) * sizeof(TCHAR),
pChildDeviceState, sizeof(DWORD), NULL, 0
);
}
clean:
return rc;
}
//------------------------------------------------------------------------------
BOOL GetBusNamePrefix(HANDLE hBusAccess, LPTSTR pOutString, DWORD outSize)
{
BOOL rc = FALSE;
PARENT_BUS_ACCESS *pBusAccess = (PARENT_BUS_ACCESS *)hBusAccess;
// Check passed handler
if (pBusAccess == NULL || pBusAccess->cookie != BUS_ACCESS_COOKIE) {
SetLastError(ERROR_INVALID_HANDLE);
goto clean;
}
// Call parent device if exists
if (pBusAccess->hBus != INVALID_HANDLE_VALUE) {
rc = DeviceIoControl(
pBusAccess->hBus, IOCTL_BUS_NAME_PREFIX, pBusAccess->pszDeviceName,
(_tcslen(pBusAccess->pszDeviceName) + 1) * sizeof(TCHAR),
pOutString, outSize * sizeof(TCHAR), NULL, 0
);
}
clean:
return rc;
}
//------------------------------------------------------------------------------
BOOL BusTransBusAddrToVirtual(
HANDLE hBusAccess, INTERFACE_TYPE interfaceType, ULONG busNumber,
PHYSICAL_ADDRESS busAddress, ULONG length, ULONG *pAddressSpace,
VOID **ppMappedAddress
) {
BOOL rc = FALSE;
PHYSICAL_ADDRESS translatedAddress;
if (!TranslateBusAddr(
hBusAccess, interfaceType, busNumber, busAddress, pAddressSpace,
&translatedAddress
)) goto clean;
if (*pAddressSpace == 0) {
// Memory-mapped I/O, get virtual address
*ppMappedAddress = MmMapIoSpace(translatedAddress, length, FALSE);
rc = (*ppMappedAddress != NULL);
} else {
// I/O port
*ppMappedAddress = (VOID*)translatedAddress.LowPart;
rc = TRUE;
}
clean:
return rc;
}
//------------------------------------------------------------------------------
BOOL BusTransBusAddrToStatic(
HANDLE hBusAccess, INTERFACE_TYPE interfaceType, ULONG busNumber,
PHYSICAL_ADDRESS busAddress, ULONG length, ULONG *pAddressSpace,
VOID **ppMappedAddress
) {
BOOL rc = FALSE;
PHYSICAL_ADDRESS translatedAddress;
UCHAR *pStaticAddress;
DWORD alignedAddress, alignedSize;
if (!TranslateBusAddr(
hBusAccess, interfaceType, busNumber, busAddress, pAddressSpace,
&translatedAddress
)) goto clean;
if (*pAddressSpace == 0) {
alignedAddress = translatedAddress.LowPart & ~(PAGE_SIZE - 1);
alignedSize = length + (translatedAddress.LowPart & (PAGE_SIZE - 1));
pStaticAddress = CreateStaticMapping(alignedAddress >> 8, alignedSize);
if (pStaticAddress == NULL) goto clean;
pStaticAddress += translatedAddress.LowPart & (PAGE_SIZE - 1);
*ppMappedAddress = pStaticAddress;
rc = TRUE;
} else {
// I/O port
*ppMappedAddress = (VOID*)translatedAddress.LowPart;
rc = TRUE;
}
clean:
return rc;
}
//------------------------------------------------------------------------------
BOOL BusIoControl(
HANDLE hBusAccess, DWORD code, VOID *pInBuffer, DWORD inSize,
VOID *pOutBuffer, DWORD outSize, DWORD *pOutSize, OVERLAPPED *pOverlapped
) {
BOOL rc = FALSE;
PARENT_BUS_ACCESS *pBusAccess = (PARENT_BUS_ACCESS *)hBusAccess;
// Check passed handler
if (pBusAccess == NULL || pBusAccess->cookie != BUS_ACCESS_COOKIE) {
SetLastError(ERROR_INVALID_HANDLE);
goto clean;
}
// Call parent device if exists
if (pBusAccess->hBus != INVALID_HANDLE_VALUE) {
// If there isn't any input buffer, pass device name instead
if (pInBuffer == NULL && inSize == 0) {
pInBuffer = pBusAccess->pszDeviceName;
inSize = (_tcslen(pBusAccess->pszDeviceName) + 1)*sizeof(TCHAR);
}
// Call bus driver
rc = DeviceIoControl(
pBusAccess->hBus, code, pInBuffer, inSize, pOutBuffer, outSize,
pOutSize, pOverlapped
);
}
clean:
return rc;
}
//------------------------------------------------------------------------------
BOOL BusChildIoControl(
HANDLE hBusAccess, DWORD code, LPVOID pBuffer, DWORD size
) {
BOOL rc = FALSE;
LPVOID pInBuffer;
DWORD inSize;
PARENT_BUS_ACCESS *pBusAccess = (PARENT_BUS_ACCESS *)hBusAccess;
// Check passed handler
if (pBusAccess == NULL || pBusAccess->cookie != BUS_ACCESS_COOKIE) {
SetLastError(ERROR_INVALID_HANDLE);
goto clean;
}
// Call parent device if exists
if (pBusAccess->hBus != INVALID_HANDLE_VALUE) {
pInBuffer = pBusAccess->pszDeviceName;
inSize = (_tcslen(pBusAccess->pszDeviceName) + 1)*sizeof(TCHAR);
// Call bus driver
rc = DeviceIoControl(
pBusAccess->hBus, code, pInBuffer, inSize, pBuffer, size, NULL, NULL
);
}
clean:
return rc;
}
//------------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -