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

📄 ufnbus.cpp

📁 It permits simultaneous use of multiple USB Serial protocols.
💻 CPP
📖 第 1 页 / 共 3 页
字号:
    }

    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 + -