📄 ufnbus.cpp
字号:
}
DEBUGMSG(ZONE_INIT, (_T("%s Activated client driver \"%s\"\r\n"),
pszFname, ((CUfnBusDevice*) GetDeviceList())->GetUfnName()));
EXIT:
if (dwRet != ERROR_SUCCESS) {
CleanUpAfterClient();
}
return (dwRet == ERROR_SUCCESS);
}
BOOL
CUfnBus::DeactivateChild(LPCTSTR pszChildBusName)
{
SETFNAME();
FUNCTION_ENTER_MSG();
PREFAST_DEBUGCHK(m_pContext);
DEBUGCHK(IsClientActive());
DWORD dwRet = CleanUpAfterClient();
m_fIsChildPowerManaged = FALSE;
FUNCTION_LEAVE_MSG();
return (dwRet == ERROR_SUCCESS);
}
BOOL
CUfnBus::TranslateChildBusAddr(
PCE_BUS_TRANSLATE_BUS_ADDR pcbtba
)
{
PREFAST_DEBUGCHK(pcbtba);
PREFAST_DEBUGCHK(pcbtba->lpDeviceBusName);
PREFAST_DEBUGCHK(pcbtba->AddressSpace);
PREFAST_DEBUGCHK(pcbtba->TranslatedAddress);
BOOL fRet = FALSE;
CUfnBusDevice *pDevice = (CUfnBusDevice *) GetChildByName(pcbtba->lpDeviceBusName);
if (pDevice) {
DWORD dwRet = m_pContext->PddInfo.pfnIOControl(
m_pContext->PddInfo.pvPddContext, MDD_IOCTL, IOCTL_BUS_TRANSLATE_BUS_ADDRESS,
(PBYTE) pcbtba, sizeof(*pcbtba), NULL, 0, NULL);
if (dwRet == ERROR_SUCCESS) {
fRet = TRUE;
}
else {
SetLastError(dwRet);
}
pDevice->DeRef();
}
else {
SetLastError(ERROR_INVALID_PARAMETER);
}
return fRet;
}
BOOL
CUfnBus::TranslateChildSystemAddr(
PCE_BUS_TRANSLATE_SYSTEM_ADDR pcbtsa
)
{
PREFAST_DEBUGCHK(pcbtsa);
PREFAST_DEBUGCHK(pcbtsa->lpDeviceBusName);
PREFAST_DEBUGCHK(pcbtsa->TranslatedAddress);
BOOL fRet = FALSE;
CUfnBusDevice *pDevice = (CUfnBusDevice *) GetChildByName(pcbtsa->lpDeviceBusName);
if (pDevice) {
DWORD dwRet = m_pContext->PddInfo.pfnIOControl(
m_pContext->PddInfo.pvPddContext, MDD_IOCTL, IOCTL_BUS_TRANSLATE_SYSTEM_ADDRESS,
(PBYTE) pcbtsa, sizeof(*pcbtsa), NULL, 0, NULL);
if (dwRet == ERROR_SUCCESS) {
fRet = TRUE;
}
else {
SetLastError(dwRet);
}
pDevice->DeRef();
}
else {
SetLastError(ERROR_INVALID_PARAMETER);
}
return fRet;
}
BOOL
CUfnBus::SetChildDevicePowerState(
PCE_BUS_POWER_STATE pcbps,
DeviceFolder **ppDeviceFoler
)
{
PREFAST_DEBUGCHK(pcbps);
PREFAST_DEBUGCHK(pcbps->lpDeviceBusName);
PREFAST_DEBUGCHK(pcbps->lpceDevicePowerState);
BOOL fRet = FALSE;
if (!VALID_DX(*pcbps->lpceDevicePowerState)) {
SetLastError(ERROR_INVALID_PARAMETER);
goto EXIT;
}
CUfnBusDevice *pDevice =
(CUfnBusDevice *) GetChildByName(pcbps->lpDeviceBusName,ppDeviceFoler);
if (!pDevice) {
SetLastError(ERROR_INVALID_PARAMETER);
goto EXIT;
}
DWORD dwRet = m_pContext->PddInfo.pfnIOControl(
m_pContext->PddInfo.pvPddContext, MDD_IOCTL, IOCTL_BUS_SET_POWER_STATE,
(PBYTE) pcbps, sizeof(*pcbps), NULL, 0, NULL);
if (dwRet == ERROR_SUCCESS) {
fRet = TRUE;
}
else {
SetLastError(dwRet);
}
pDevice->DeRef();
EXIT:
return fRet;
}
BOOL
CUfnBus::GetChildDevicePowerState(
PCE_BUS_POWER_STATE pcbps ,
DeviceFolder **ppDeviceFoler
)
{
PREFAST_DEBUGCHK(pcbps);
PREFAST_DEBUGCHK(pcbps->lpDeviceBusName);
PREFAST_DEBUGCHK(pcbps->lpceDevicePowerState);
BOOL fRet = FALSE;
CUfnBusDevice *pDevice = (CUfnBusDevice *) GetChildByName(pcbps->lpDeviceBusName,ppDeviceFoler);
if (pDevice) {
DWORD dwRet = m_pContext->PddInfo.pfnIOControl(
m_pContext->PddInfo.pvPddContext, MDD_IOCTL, IOCTL_BUS_GET_POWER_STATE,
(PBYTE) pcbps, sizeof(*pcbps), NULL, 0, NULL);
if (dwRet == ERROR_SUCCESS) {
fRet = TRUE;
}
else {
SetLastError(dwRet);
}
pDevice->DeRef();
}
else {
SetLastError(ERROR_INVALID_PARAMETER);
}
return fRet;
}
BOOL
CUfnBus::SetChildDeviceConfigurationData(
PCE_BUS_DEVICE_CONFIGURATION_DATA pcbdcd,
DeviceFolder **ppDeviceFoler
)
{
PREFAST_DEBUGCHK(pcbdcd);
PREFAST_DEBUGCHK(pcbdcd->lpDeviceBusName);
PREFAST_DEBUGCHK(pcbdcd->pBuffer);
BOOL fRet = FALSE;
CUfnBusDevice *pDevice = (CUfnBusDevice *) GetChildByName(pcbdcd->lpDeviceBusName,ppDeviceFoler);
if (pDevice) {
DWORD dwRet = m_pContext->PddInfo.pfnIOControl(
m_pContext->PddInfo.pvPddContext, MDD_IOCTL, IOCTL_BUS_SET_CONFIGURE_DATA,
(PBYTE) pcbdcd, sizeof(*pcbdcd), NULL, 0, NULL);
if (dwRet == ERROR_SUCCESS) {
fRet = TRUE;
}
else {
SetLastError(dwRet);
}
pDevice->DeRef();
}
else {
SetLastError(ERROR_INVALID_PARAMETER);
}
return fRet;
}
BOOL
CUfnBus::GetChildDeviceConfigurationData(
PCE_BUS_DEVICE_CONFIGURATION_DATA pcbdcd,
DeviceFolder **ppDeviceFoler
)
{
PREFAST_DEBUGCHK(pcbdcd);
PREFAST_DEBUGCHK(pcbdcd->lpDeviceBusName);
PREFAST_DEBUGCHK(pcbdcd->pBuffer);
BOOL fRet = FALSE;
CUfnBusDevice *pDevice = (CUfnBusDevice *) GetChildByName(pcbdcd->lpDeviceBusName,ppDeviceFoler);
if (pDevice) {
DWORD dwRet = m_pContext->PddInfo.pfnIOControl(
m_pContext->PddInfo.pvPddContext, MDD_IOCTL, IOCTL_BUS_GET_CONFIGURE_DATA,
(PBYTE) pcbdcd, sizeof(*pcbdcd), NULL, 0, NULL);
if (dwRet == ERROR_SUCCESS) {
fRet = TRUE;
}
else {
SetLastError(dwRet);
}
pDevice->DeRef();
}
else {
SetLastError(ERROR_INVALID_PARAMETER);
}
return fRet;
}
BOOL
CUfnBus::IOControl(
PUFN_MDD_BUS_OPEN_CONTEXT pBusContext,
DWORD dwCode,
PBYTE pbInBuf,
DWORD cbInBuf,
PBYTE pbOutBuf,
DWORD cbOutBuf,
PDWORD pcbActualOutBuf
)
{
SETFNAME();
DWORD dwRet = ERROR_SUCCESS;
BOOL fRet;
BOOL fCallDefaultBusDriver = FALSE;
switch (dwCode) {
case IOCTL_UFN_ENUMERATE_AVAILABLE_CLIENTS_SETUP: {
pBusContext->dwIndex = 0;
pBusContext->fSetupCalled = TRUE;
break;
}
case IOCTL_UFN_ENUMERATE_AVAILABLE_CLIENTS: {
if ( !pbOutBuf || (cbOutBuf != sizeof(UFN_CLIENT_INFO)) ) {
dwRet = ERROR_INVALID_PARAMETER;
break;
}
else if (pBusContext->fSetupCalled == FALSE) {
dwRet = ERROR_INVALID_STATE;
break;
}
PUFN_CLIENT_INFO pClientInfo = (PUFN_CLIENT_INFO) pbOutBuf;
pClientInfo->szDescription[0] = 0;
pClientInfo->szName[0] = 0;
DWORD cchSubKey = dim(pClientInfo->szName);
dwRet = RegEnumKeyEx(pBusContext->hkClients, pBusContext->dwIndex++,
pClientInfo->szName, &cchSubKey, NULL, NULL, NULL, NULL);
NULL_TERMINATE(pClientInfo->szName);
if (dwRet == ERROR_SUCCESS) {
HKEY hkCurrentEnumClient;
dwRet = RegOpenKeyEx(pBusContext->hkClients,
pClientInfo->szName, 0, 0, &hkCurrentEnumClient);
if (dwRet != ERROR_SUCCESS) {
break;
}
CUfnBusDevice *pDevice = (CUfnBusDevice *) GetDeviceList();
GetUfnDescription(hkCurrentEnumClient, pClientInfo->szDescription,
dim(pClientInfo->szDescription));
if (pcbActualOutBuf) {
*pcbActualOutBuf = sizeof(UFN_CLIENT_INFO);
}
RegCloseKey(hkCurrentEnumClient);
}
break;
}
case IOCTL_UFN_GET_CURRENT_CLIENT: {
if ( !pbOutBuf || (cbOutBuf != sizeof(UFN_CLIENT_INFO)) ) {
dwRet = ERROR_INVALID_PARAMETER;
break;
}
PUFN_CLIENT_INFO pClientInfo = (PUFN_CLIENT_INFO) pbOutBuf;
pClientInfo->szDescription[0] = 0;
pClientInfo->szName[0] = 0;
if (IsClientPresent()) {
CUfnBusDevice *pDevice = (CUfnBusDevice *) GetDeviceList();
HRESULT hr = StringCchCopy(pClientInfo->szName, dim(pClientInfo->szName),
pDevice->GetUfnName());
GetUfnDescription(pDevice->GetHKey(), pClientInfo->szDescription,
dim(pClientInfo->szDescription));
}
else {
// No current client. Return success but no data.
dwRet = ERROR_SUCCESS;
}
if (dwRet == ERROR_SUCCESS) {
if (pcbActualOutBuf) {
*pcbActualOutBuf = sizeof(UFN_CLIENT_INFO);
}
}
break;
}
case IOCTL_UFN_CHANGE_CURRENT_CLIENT: {
if ( !pbInBuf || (cbInBuf != sizeof(UFN_CLIENT_NAME)) ) {
dwRet = ERROR_INVALID_PARAMETER;
break;
}
PUFN_CLIENT_NAME pClientName = (PUFN_CLIENT_NAME) pbInBuf;
UFN_CLIENT_NAME ClientName;
HRESULT hr = StringCchCopy(ClientName.szName, dim(ClientName.szName),
pClientName->szName);
if (ClientName.szName[0] == 0) {
// Just remove the current client if there is one
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -