📄 speakerheadset.cpp
字号:
// 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 + -