POSTVXD.C
Upload User: lx1888888
Upload Date: 2007-01-04
Package Size: 136k
Code Size: 4k
Category:

Driver Develop

Development Platform:

Visual C++

  1. #define WANTVXDWRAPS
  2. #include <basedef.h>
  3. #include <vmm.h>
  4. #include <debug.h>
  5. #include "vxdcall.h"
  6. #include <vxdwraps.h>
  7. #include <wrappers.h>
  8. #include <vwin32.h>
  9. #include "postvxd.h"
  10. #ifdef DEBUG
  11. #define DPRINTF0(buf, fmt) _Sprintf(buf, fmt ); Out_Debug_String( buf )
  12. #define DPRINTF1(buf, fmt, arg1) _Sprintf(buf, fmt, arg1 ); Out_Debug_String( buf )
  13. #define DPRINTF2(buf, fmt, arg1, arg2) _Sprintf(buf, fmt, arg1, arg2 ); Out_Debug_String( buf )
  14. #else
  15. #define DPRINTF0(buf, fmt)
  16. #define DPRINTF1(buf, fmt, arg1)
  17. #define DPRINTF2(buf, fmt, arg1, arg2)
  18. #endif
  19. VOID _cdecl PostMessageHandler(DWORD dwPostMessageReturnCode, PVOID refdata);
  20. // functions in asm module
  21. void PriorityEventThunk( void );
  22. BOOL bClientRegistered = FALSE; // True when PM API called to register
  23. WORD PostMsgOffset;
  24. WORD PostMsgSelector;
  25. HANDLE PostMsghWnd;
  26. char dbgbuf[80];
  27. BOOL  bWin3x;
  28. typedef struct
  29. {
  30. BOOL  bVmCreated;
  31. VMHANDLE hVM;
  32. } VMINFO;
  33. BOOL OnSysDynamicDeviceInit()
  34. {
  35. DPRINTF0(dbgbuf,"Loadingrn");
  36. return TRUE;
  37. }
  38. BOOL OnSysDynamicDeviceExit()
  39. {
  40. DPRINTF0(dbgbuf,"Unloadingrn");
  41. return TRUE;
  42. }
  43. BOOL OnInitComplete(VMHANDLE hVM)
  44. {
  45.    DWORD ver;
  46. ver = Get_VMM_Version();
  47. if (HIWORD(ver) <= 3)
  48. {
  49. // Win3.x, not 95
  50. bWin3x = TRUE;
  51.    }
  52. }
  53. BOOL OnVmInit(VMHANDLE hVM)
  54. {
  55.    VMINFO   *pInfo;
  56.    
  57. if (bClientRegistered)
  58. {
  59.       if (bWin3x)
  60.       {
  61.          pInfo = (VMINFO *)_HeapAllocate( sizeof( VMINFO ), 0 );
  62.          if (pInfo)
  63.          {
  64.             pInfo->hVM = hVM;
  65.             pInfo->bVmCreated = TRUE;
  66.             Call_Priority_VM_Event(LOW_PRI_DEVICE_BOOST, Get_Sys_VM_Handle(), 
  67.                                    PEF_WAIT_FOR_STI+PEF_WAIT_NOT_CRIT, 
  68.                                    pInfo, PriorityEventThunk, 0 );
  69.          }
  70.       }
  71.       else
  72.       {
  73.     _SHELL_PostMessage( PostMsghWnd, WM_USER_POSTVXD,
  74.    1, (DWORD)hVM,  
  75.                    PostMessageHandler, NULL );
  76.       }
  77. }
  78. return TRUE;
  79. }
  80. VOID OnVmTerminate(VMHANDLE hVM)
  81. {
  82.    VMINFO   *pInfo;
  83. if (bClientRegistered)
  84. {
  85.       if (bWin3x)
  86.       {
  87.          pInfo = (VMINFO *)_HeapAllocate( sizeof( VMINFO ), 0 );
  88.          if (pInfo)
  89.          {
  90.             pInfo->hVM = hVM;
  91.             pInfo->bVmCreated = TRUE;
  92.             Call_Priority_VM_Event(LOW_PRI_DEVICE_BOOST, Get_Sys_VM_Handle(), 
  93.                                    PEF_WAIT_FOR_STI+PEF_WAIT_NOT_CRIT, 
  94.                                    pInfo, PriorityEventThunk, 0 );
  95.          }
  96.       }
  97.       else
  98.       {
  99.     _SHELL_PostMessage( PostMsghWnd, WM_USER_POSTVXD,
  100.    0, hVM,  
  101.                    PostMessageHandler, NULL );
  102.       }
  103. }
  104. }
  105. VOID __stdcall PriorityEventHandler(VMHANDLE hVM, PVOID Refdata, CRS *pRegs)
  106. {
  107.    CLIENT_STRUCT   saveRegs;
  108.    VMINFO          *pInfo = Refdata;
  109.    Save_Client_State(&saveRegs);
  110.    Begin_Nest_Exec();
  111.    Simulate_Push(PostMsghWnd); // hwnd
  112.    Simulate_Push(WM_USER_POSTVXD); // message
  113.    Simulate_Push(pInfo->bVmCreated);       // wParam
  114.    Simulate_Push(((DWORD)pInfo->hVM >> 16) ); // lParam
  115.    Simulate_Push(((DWORD)pInfo->hVM & 0xffff) );
  116.    Simulate_Far_Call(PostMsgSelector, PostMsgOffset);
  117.    Resume_Exec();
  118.    End_Nest_Exec();
  119.    Restore_Client_State(&saveRegs);
  120.    _HeapFree( pInfo, 0 );
  121. }
  122. VOID _cdecl PostMessageHandler(DWORD dwPostMessageReturnCode, PVOID refdata)
  123. {
  124. if (!dwPostMessageReturnCode)
  125. DPRINTF0(dbgbuf, "PostMessage failed!rn");
  126. }
  127. VOID __cdecl PM_Api_Handler(VMHANDLE hVM, CLIENT_STRUCT *pcrs)
  128. {
  129. switch (pcrs->CWRS.Client_AX)
  130. {
  131. case POSTVXD_REGISTER:
  132.       PostMsghWnd = (HANDLE)pcrs->CWRS.Client_BX;
  133.       PostMsgSelector = pcrs->CWRS.Client_CX;
  134.       PostMsgOffset = pcrs->CWRS.Client_DX;
  135. bClientRegistered = TRUE;
  136. pcrs->CWRS.Client_AX = 0;
  137. break;
  138. case POSTVXD_DEREGISTER:
  139. bClientRegistered = FALSE;
  140. pcrs->CWRS.Client_AX = 0;
  141. break;
  142. default:
  143. pcrs->CWRS.Client_AX = 0xffff;
  144. }
  145. }