/**************************************************************************** Hidden 16-bit window for Switch Input Library DLL Copyright (c) 1992-1997 Bloorview MacMillan Centre This mini-application reports the 16-bit bios table address information back to the 32-bit world of the Switch Input Library ****************************************************************************/ //#define DEBUGMSG /**************************************************************** Headers */ #include #include #include #define APIENTRY FAR PASCAL long APIENTRY WndProc( HWND hWnd, UINT uMsg, WPARAM uParam, LPARAM lParam ); char szAppName[] = "MSSWCHY"; int nShow; // if Debug this will be SHOW BYTE bios_data_area[16]; HANDLE hData; DDEDATA FAR *pdata; extern WORD _0040h; #ifdef DEBUGMSG char szDbgMsg[80]; #endif /********************************************* Windows Callback Functions */ /********************************************************\ Windows initialization \********************************************************/ int PASCAL WinMain(hInstance, hPrevInstance, lpszCmdLine, nCmdShow) HANDLE hInstance, hPrevInstance; LPSTR lpszCmdLine; int nCmdShow; { HWND hWnd; MSG msg; WNDCLASS wndclass; // Look for magic word if ( ( lpszCmdLine[0] != 'S' ) || ( lpszCmdLine[1] != 'W' ) || ( lpszCmdLine[2] != 'C' ) || ( lpszCmdLine[3] != 'H' ) ) { MessageBox( GetFocus(), "This is not a user program", "MSSWCHY", MB_OK | MB_ICONHAND ); return FALSE; } if(!hPrevInstance) { wndclass.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS; wndclass.lpfnWndProc = WndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance; wndclass.hIcon = NULL; wndclass.hCursor = NULL; wndclass.hbrBackground = GetStockObject(WHITE_BRUSH); wndclass.lpszMenuName = NULL; wndclass.lpszClassName = szAppName; if(!RegisterClass(&wndclass)) return FALSE; } hWnd = CreateWindow(szAppName, szAppName, WS_OVERLAPPEDWINDOW, 0,0,10,10, NULL, NULL, hInstance, NULL); nShow = nCmdShow; ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); while(GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } /********************************************************\ Main window procedure \********************************************************/ long APIENTRY WndProc(HWND hWnd, UINT uMsg, WPARAM uParam, LPARAM lParam) { #ifdef xDEBUGMSG sprintf( szDbgMsg, "MP Msg: %X %X %lX\r\n", iMessage, wParam, lParam ); OutputDebugString( szDbgMsg ); #endif switch(uMsg) { case WM_CREATE: { HWND hSwchx; hSwchx = FindWindow( "MSSWCHX", NULL ); _fmemcpy( bios_data_area, (LPSTR)(MAKELONG(0,&_0040h)), sizeof( bios_data_area ) ); hData = GlobalAlloc( GMEM_DDESHARE, sizeof( DDEDATA ) + sizeof( bios_data_area )); if (hData) { pdata = (DDEDATA FAR *) GlobalLock( hData ); pdata->fResponse = TRUE; pdata->fRelease = FALSE; pdata->fAckReq = FALSE; pdata->cfFormat = CF_OWNERDISPLAY; _fmemcpy( pdata->Value, bios_data_area, sizeof( bios_data_area ) ); GlobalUnlock( hData ); PostMessage( hSwchx, WM_DDE_DATA, hWnd, MAKELONG( hData, 0 )); } } break; case WM_DDE_ACK: { if (hData) GlobalFree( hData ); if (nShow != SW_SHOW) PostMessage( hWnd, WM_CLOSE, 0, 0L ); } break; case WM_PAINT: // should only happen in debug mode { PAINTSTRUCT ps; char szOutBuff[100]; int i; BeginPaint( hWnd, &ps ); i = 0; wsprintf( szOutBuff, "Bios Data Area" ); TextOut( ps.hdc,0,10 * i,szOutBuff,lstrlen(szOutBuff)); for ( i=0;i<8;i++ ) {// note reversed pairs wsprintf( szOutBuff, "Port%d: %02X %02X", i, bios_data_area[2*i+1], bios_data_area[2*i] ); TextOut( ps.hdc,0,30 + 30 * i,szOutBuff,lstrlen(szOutBuff)); } EndPaint( hWnd, &ps ); } break; case WM_CLOSE: case WM_QUERYENDSESSION: if (uMsg == WM_QUERYENDSESSION) return 1L; else DestroyWindow( hWnd ); break; /* Window has just been closed */ case WM_DESTROY: PostQuitMessage(0); case WM_ENDSESSION: if (!uParam && (uMsg == WM_ENDSESSION)) /* Windows is not terminating */ break; /* else continue */ break; default: return DefWindowProc(hWnd, uMsg, uParam, lParam); } return 0L; }