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

📄 speakerheadset.cpp

📁 我自己编译的armv4i wince60模拟器的bps源文件,已经验证可以使用,欢迎下载
💻 CPP
📖 第 1 页 / 共 2 页
字号:
    // It is the restore-state scenrio. During the restore-state, update device appropriately.
    ProcessMaskChange();
    LeaveCriticalSection(&SPKDeviceLock);
    DEBUGMSG( TRUE, (TEXT("--SPK_PowerUp\n")) );
}

extern "C" BOOL SPK_IOControl(DWORD hOpenContext, DWORD dwCode, PBYTE pBufIn, DWORD dwLenIn, PBYTE pBufOut, DWORD dwLenOut, PDWORD pdwActualOut)
{
    DWORD error = 0;
    DEVNOTIFY_EVENT tempEv;
    NOTIFY_NODE* pTempNode = NULL;

    DEBUGMSG( TRUE, (TEXT("++SPK_IOControl dwCode=%d\n"), dwCode) );
    if (!hOpenContext) {
        SetLastError(ERROR_INVALID_HANDLE);
        error = ERROR_INVALID_HANDLE;
        DEBUGMSG( TRUE, (TEXT("--SPK_IOControl %d\n"), error) );
        return FALSE;
    }

    BOOL success = TRUE;
    DWORD dwIndex = -1;
    HWND hWnd = NULL;
    EnterCriticalSection(&SPKDeviceLock);

    // Check and execute dwCode.
    switch (dwCode)
    {
        case IOCTL_HEADSET_ADD_NOTIFY_HWND:
            // pBufIn should contain the pointer.
            if (NULL == pBufIn || (dwLenIn != sizeof(DEVNOTIFY_EVENT))) {
                ASSERT(0);
                SetLastError(ERROR_INVALID_PARAMETER);
                success = FALSE;
                goto Done;
            }
            __try {
                tempEv = *((DEVNOTIFY_EVENT*)pBufIn);
            } __except (EXCEPTION_EXECUTE_HANDLER) {
                ASSERT(0);
                SetLastError(ERROR_ACCESS_DENIED);
                success = FALSE;
                goto Done;
            }
            
            if (!(pTempNode = g_HeadsetNotificationList.AddWindow(tempEv))) {
                SetLastError(ERROR_NOT_ENOUGH_MEMORY);
                success = FALSE;
                goto Done;
            } else {          
                // If Headset is already plugged in, send a notification.
                if (CurrentDriverState & HeadsetMask) {
                    g_HeadsetNotificationList.SendMessage(pTempNode, 1);
                }
            }
            break;
        case IOCTL_HEADSET_REMOVE_NOTIFY_HWND:
            // pBufIn should contain the valid pointer.
            if (NULL == pBufIn || dwLenIn != sizeof (HWND)) {
                SetLastError(ERROR_INVALID_PARAMETER);
                success = FALSE;
                goto Done;
            }

            __try {
                hWnd = *(HWND*)pBufIn;
            } __except (EXCEPTION_EXECUTE_HANDLER) {
                ASSERT(0);
                success = FALSE;
                SetLastError (ERROR_ACCESS_DENIED);
                goto Done;
            }

            // Remove the handle from the notification list.
            if (!g_HeadsetNotificationList.RemoveWindow(hWnd)) {
                SetLastError(ERROR_INVALID_HANDLE);
                success = FALSE;
                goto Done;
            }
            break;

        case IOCTL_SPEAKER_ADD_NOTIFY_HWND:
            if (NULL == pBufIn || (dwLenIn != sizeof (DEVNOTIFY_EVENT))) {
                SetLastError(ERROR_INVALID_PARAMETER);
                success = FALSE;
                goto Done;
            }            

            __try {
                tempEv = *((DEVNOTIFY_EVENT*)pBufIn);
            } __except (EXCEPTION_EXECUTE_HANDLER) { 
                ASSERT(0);
                success = FALSE;
                SetLastError(ERROR_ACCESS_DENIED);
                goto Done;
            }

            if (!(pTempNode = g_SpeakerPhoneNotificationList.AddWindow(tempEv))) {
                SetLastError(ERROR_NOT_ENOUGH_MEMORY);
                success = FALSE;
                goto Done;
            } else {
                // Send a message to window if speakerphone is already on.
                if (CurrentDriverState & SpeakerphoneMask) {
                    g_SpeakerPhoneNotificationList.SendMessage(pTempNode, 1);
                }
            }
            break;
        case IOCTL_SPEAKER_REMOVE_NOTIFY_HWND:
            if (NULL == pBufIn || (dwLenIn != sizeof (HWND))) { 
                SetLastError(ERROR_INVALID_PARAMETER);
                success = FALSE;
                goto Done;
            }

            __try {
                hWnd = *((HWND*)pBufIn);
            } __except (EXCEPTION_EXECUTE_HANDLER) {
                ASSERT(0);
                SetLastError (ERROR_ACCESS_DENIED);
                success = FALSE;
                goto Done;
            }

            if (!g_SpeakerPhoneNotificationList.RemoveWindow(hWnd)) {
                SetLastError(ERROR_INVALID_HANDLE);
                success = FALSE;
                goto Done;
            }

            break;
        case IOCTL_SPEAKER_GETMODE:
            if (NULL == pBufOut || dwLenOut != sizeof(CurrentDriverState)) {
                SetLastError(ERROR_INVALID_PARAMETER);
                success = FALSE;
                goto Done;
            }

            __try {
                *(__int8*)pBufOut = (CurrentDriverState & SpeakerphoneMask)?1:0;
            } __except (EXCEPTION_EXECUTE_HANDLER) {
                SetLastError(ERROR_ACCESS_DENIED);
                success = FALSE;
                goto Done;
            }
            break;
        case IOCTL_SPEAKER_SETMODE:
            if (NULL == pBufIn || dwLenIn != sizeof(CurrentDriverState)) {
                SetLastError(ERROR_INVALID_PARAMETER);
                success = FALSE;
                goto Done;
            }

            __try {
                success = SetSpeakerPhoneMode(*(unsigned __int8*)pBufIn);
            } __except (EXCEPTION_EXECUTE_HANDLER) {
                SetLastError(ERROR_ACCESS_DENIED);
                success = FALSE;
                goto Done;
            }
            break;
        case IOCTL_CARKIT_ADD_NOTIFY_HWND:
            if (NULL == pBufIn || dwLenIn != sizeof(DEVNOTIFY_EVENT)) {
                SetLastError(ERROR_INVALID_PARAMETER);
                success = FALSE;
                goto Done;
            }

            __try {
                tempEv = *((DEVNOTIFY_EVENT*)pBufIn);
            } __except (EXCEPTION_EXECUTE_HANDLER) {
                ASSERT(0);
                SetLastError (ERROR_ACCESS_DENIED);
                success = FALSE;
                goto Done;
            }

            if (!(pTempNode = g_CarkitNotificationList.AddWindow(tempEv))) {
                SetLastError(ERROR_NOT_ENOUGH_MEMORY);
                success = FALSE;
                goto Done;
            } else {
                // See if carkit is already plugged-in.
                if (CurrentDriverState & CarKitMask) {
                    g_CarkitNotificationList.SendMessage(pTempNode, 1);
                }
            }
            break;
        case IOCTL_CARKIT_REMOVE_NOTIFY_HWND:
            if (NULL == pBufIn || dwLenIn != sizeof(HWND)) {
                SetLastError(ERROR_INVALID_PARAMETER);
                success = FALSE;
                goto Done;
            }

            __try {
                hWnd = *((HWND*)pBufIn);
            } __except (EXCEPTION_EXECUTE_HANDLER) {
                ASSERT(0);
                SetLastError (ERROR_ACCESS_DENIED);
                success = FALSE;
                goto Done;
            }

            if (!g_CarkitNotificationList.RemoveWindow(hWnd)) {
                SetLastError(ERROR_INVALID_HANDLE);
                success = FALSE;
                goto Done;
            }
            break;
        case IOCTL_PSL_NOTIFY: // Some process which opened the file is exiting without closing the handle gracefully.
            // What to do here.... How do we determine which window handle is invalid now.
            DEBUGMSG(TRUE, (TEXT("SPK IOControl Process is exiting\n")));
            break;
        default:
            SetLastError(ERROR_INVALID_PARAMETER);
            success = FALSE;
            goto Done;
            break;
    }

Done:
    DEBUGMSG( TRUE, (TEXT("--SPK_IOControl Error=%d\n"), error) );
    LeaveCriticalSection(&SPKDeviceLock);
    return success;
}     
            
extern "C" void SPK_PowerDown(DWORD /*hDeviceContext*/)
{
    DEBUGMSG( TRUE, (TEXT("++SPK_PowerDown\n--SPK_PowerDown\n")) );
    return;
}

extern "C" DWORD SPK_Open(DWORD /*hDeviceContext*/, DWORD /*AccessMode*/, DWORD /*ShareMode*/)
{
    DEBUGMSG( TRUE, (TEXT("++SPK_Open\n--SPK_Open\n")) );
    return 1;
}

BOOL SPK_Close(DWORD /*hOpenContext*/)
{
    DEBUGMSG( TRUE, (TEXT("++SPK_Close\n--SPK_Close\n")) );
    return TRUE;
}

DWORD SPK_Read(DWORD /*hOpenContext*/, LPVOID /*pBuffer*/, DWORD /*Count*/)
{
    DEBUGMSG( TRUE, (TEXT("++SPK_Read\n--SPK_Read\n")) );
    return 0;
}

DWORD SPK_Write(DWORD /*hOpenContext*/, LPCVOID /*pBuffer*/, DWORD /*Count*/)
{
    DEBUGMSG( TRUE, (TEXT("++SPK_Write\n--SPK_Write\n")) );
    return 0;
}

DWORD SPK_Seek(DWORD /*hOpenContext*/, long /*Amount*/, WORD /*Type*/)
{
    DEBUGMSG( TRUE, (TEXT("++SPK_Seek\n--SPK_Seek\n")) );
    return 0;
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -