📄 bus.c
字号:
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//
// Use of this sample source code is subject to the terms of the Microsoft
// license agreement under which you licensed this sample source code. If
// you did not accept the terms of the license agreement, you are not
// authorized to use this sample source code. For the terms of the license,
// please see the license agreement between you and Microsoft or, if applicable,
// see the LICENSE.RTF on your install media or the root of your tools installation.
// THE SAMPLE SOURCE CODE IS PROVIDED "AS IS", WITH NO WARRANTIES.
//
//------------------------------------------------------------------------------
//
#include <windows.h>
#include <types.h>
#include <ceddk.h>
#include <devload.h>
#include <pm.h>
#include <cebus.h>
#include <CeBusCfg.h>
//------------------------------------------------------------------------------
// Local Definitions
#define BUS_ACCESS_COOKIE 'Asub'
//------------------------------------------------------------------------------
typedef struct {
DWORD cookie;
HANDLE hRefBus; // Parent bus device manager handler
HANDLE hBus; // Parent bus I/O handler
LPWSTR pszDeviceName; // Device bus name
} PARENT_BUS_ACCESS;
//------------------------------------------------------------------------------
HANDLE CreateBusAccessHandle(LPCTSTR szActivePath)
{
BOOL rc = FALSE;
PARENT_BUS_ACCESS *pBusAccess = NULL;
HANDLE hDevice;
DEVMGR_DEVICE_INFORMATION di;
DWORD length;
// Get device handle
hDevice = GetDeviceHandleFromContext(szActivePath);
if (hDevice == NULL) goto clean;
// Get device name and parent bus device manager handler
memset(&di, 0, sizeof(di));
di.dwSize = sizeof(di);
if (!GetDeviceInformationByDeviceHandle(hDevice, &di)) goto clean;
// Allocate internal structure
pBusAccess = LocalAlloc(LPTR, sizeof(PARENT_BUS_ACCESS));
if (pBusAccess == NULL) goto clean;
// Set cookie & hBus
pBusAccess->cookie = BUS_ACCESS_COOKIE;
pBusAccess->hBus = INVALID_HANDLE_VALUE;
// Save parent bus handler
pBusAccess->hRefBus = di.hParentDevice;
// Save device bus name
length = (wcslen(di.szBusName) + 1) * sizeof(WCHAR);
pBusAccess->pszDeviceName = LocalAlloc(LPTR, length);
if (pBusAccess->pszDeviceName == NULL) goto clean;
memcpy(pBusAccess->pszDeviceName, di.szBusName, length);
// Get parent bus info when there is one
if (pBusAccess->hRefBus != NULL) {
// Get parent bus device information
memset(&di, 0, sizeof(di));
di.dwSize = sizeof(di);
if (!GetDeviceInformationByDeviceHandle(pBusAccess->hRefBus, &di)) {
goto clean;
}
// Open bus for later calls
pBusAccess->hBus = CreateFile(
di.szBusName, GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL
);
}
// Done
rc = TRUE;
clean:
if (!rc && pBusAccess != NULL) {
if (pBusAccess->hBus != INVALID_HANDLE_VALUE) {
CloseHandle(pBusAccess->hBus);
}
if (pBusAccess->pszDeviceName != NULL) {
LocalFree(pBusAccess->pszDeviceName);
}
LocalFree(pBusAccess);
pBusAccess = NULL;
}
return pBusAccess;
}
//------------------------------------------------------------------------------
VOID CloseBusAccessHandle(HANDLE hBusAccess)
{
PARENT_BUS_ACCESS *pBusAccess = (PARENT_BUS_ACCESS *)hBusAccess;
if (pBusAccess == NULL || pBusAccess->cookie != BUS_ACCESS_COOKIE) {
SetLastError(ERROR_INVALID_HANDLE);
goto clean;
}
if (pBusAccess->hBus != INVALID_HANDLE_VALUE) CloseHandle(pBusAccess->hBus);
if (pBusAccess->pszDeviceName != NULL) LocalFree(pBusAccess->pszDeviceName);
LocalFree(pBusAccess);
clean:
return;
}
//------------------------------------------------------------------------------
BOOL SetDevicePowerState(
HANDLE hBusAccess, CEDEVICE_POWER_STATE powerState, VOID *pReserved
) {
BOOL rc = FALSE;
PARENT_BUS_ACCESS *pBusAccess = (PARENT_BUS_ACCESS *)hBusAccess;
CE_BUS_POWER_STATE ps;
// Check passed handler
if (pBusAccess == NULL || pBusAccess->cookie != BUS_ACCESS_COOKIE) {
SetLastError(ERROR_INVALID_HANDLE);
goto clean;
}
// Call parent device
if (pBusAccess->hBus != INVALID_HANDLE_VALUE) {
ps.lpDeviceBusName = pBusAccess->pszDeviceName;
ps.lpceDevicePowerState = &powerState;
ps.lpReserved = pReserved;
rc = DeviceIoControl(
pBusAccess->hBus, IOCTL_BUS_SET_POWER_STATE, &ps, sizeof(ps),
NULL, 0, NULL, 0
);
}
clean:
return rc;
}
//------------------------------------------------------------------------------
BOOL GetDevicePowerState(
HANDLE hBusAccess, CEDEVICE_POWER_STATE *pPowerState, VOID *pReserved
) {
BOOL rc = FALSE;
PARENT_BUS_ACCESS *pBusAccess = (PARENT_BUS_ACCESS *)hBusAccess;
CE_BUS_POWER_STATE ps;
// Check passed handler
if (pBusAccess == NULL || pBusAccess->cookie != BUS_ACCESS_COOKIE) {
SetLastError(ERROR_INVALID_HANDLE);
goto clean;
}
// Call parent device
if (pBusAccess->hBus != INVALID_HANDLE_VALUE) {
ps.lpDeviceBusName = pBusAccess->pszDeviceName;
ps.lpceDevicePowerState = pPowerState;
ps.lpReserved = pReserved;
rc = DeviceIoControl(
pBusAccess->hBus, IOCTL_BUS_GET_POWER_STATE, &ps, sizeof(ps),
NULL, 0, NULL, 0
);
}
clean:
return rc;
}
//------------------------------------------------------------------------------
BOOL TranslateBusAddr(
HANDLE hBusAccess, INTERFACE_TYPE interfaceType, ULONG busNumber,
PHYSICAL_ADDRESS busAddress, ULONG *pAddressSpace,
PHYSICAL_ADDRESS *pTranslatedAddress
) {
BOOL rc = FALSE;
PARENT_BUS_ACCESS *pBusAccess = (PARENT_BUS_ACCESS *)hBusAccess;
CE_BUS_TRANSLATE_BUS_ADDR busTranslate;
// 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
busTranslate.lpDeviceBusName = pBusAccess->pszDeviceName;
busTranslate.InterfaceType = interfaceType;
busTranslate.BusNumber = busNumber;
busTranslate.BusAddress = busAddress;
busTranslate.AddressSpace = pAddressSpace;
busTranslate.TranslatedAddress = pTranslatedAddress;
rc = DeviceIoControl(
pBusAccess->hBus, IOCTL_BUS_TRANSLATE_BUS_ADDRESS, &busTranslate,
sizeof(busTranslate), NULL, 0, NULL, 0
);
} else {
// Call HAL
rc = HalTranslateBusAddress(
interfaceType, busNumber, busAddress, pAddressSpace,
pTranslatedAddress
);
}
clean:
return rc;
}
//------------------------------------------------------------------------------
BOOL TranslateSystemAddr(
HANDLE hBusAccess, INTERFACE_TYPE interfaceType, ULONG busNumber,
PHYSICAL_ADDRESS systemAddress, PHYSICAL_ADDRESS *pTranslatedAddress
) {
BOOL rc = FALSE;
PARENT_BUS_ACCESS *pBusAccess = (PARENT_BUS_ACCESS *)hBusAccess;
CE_BUS_TRANSLATE_SYSTEM_ADDR systemTranslate;
// 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
systemTranslate.lpDeviceBusName = pBusAccess->pszDeviceName;
systemTranslate.InterfaceType = interfaceType;
systemTranslate.BusNumber = busNumber;
systemTranslate.SystemAddress = systemAddress;
systemTranslate.TranslatedAddress = pTranslatedAddress;
rc = DeviceIoControl(
pBusAccess->hBus, IOCTL_BUS_TRANSLATE_SYSTEM_ADDRESS,
&systemTranslate, sizeof(systemTranslate), NULL, 0, NULL, 0
);
} else {
// Call HAL
rc = HalTranslateSystemAddress(
interfaceType, busNumber, systemAddress, pTranslatedAddress
);
}
clean:
return rc;
}
//------------------------------------------------------------------------------
ULONG SetDeviceConfigurationData(
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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -