2 // --------------------------------------------
3 // Dynamically loadable VxD for DCHOOK
4 // --------------------------------------------
5 #define WIN32_LEAN_AND_MEAN // Excludes un-needed parts of windows.h
12 // -------------------------------------
13 // Externs defined in assembly module
14 // -------------------------------------
15 // These defined in assembly for the VMM.INC or VPICD.INC file inclusion
16 // ------------------------
17 // PRAGMA for this DATA
18 // ------------------------
20 #pragma data_seg ( "_LDATA","_LCODE")
22 // ------------------------------------
23 // Data structures MUST be INITIALIZED
24 // ------------------------------------
25 // ------------------------
26 // PRAGMAS for this CODE
27 // ------------------------
29 #pragma code_seg ( "_LTEXT", "_LCODE" )
30 //No stack checking for routines in this module
31 #pragma check_stack(off)
33 // ---------------------------------------
34 // Set Good Return code for DIOC requests
35 // ---------------------------------------
36 void _declspec(naked)GoodReturnDIOC(void)
38 // Clear eax and carry flag for GOOD return
44 // ---------------------------------------
45 // Set Bad Return code for DIOC requests
46 // ---------------------------------------
47 void _declspec(naked) BadReturnDIOC(void)
49 // NOTE: 50 is a FCN NOT SUPPORTED code -- ok to use
50 // SET carry flag for BAD return
57 // ------------------------------
58 // Routine for DCHOOK Device UNINIT
59 // ------------------------------
60 void CHK95_Device_UNInit()
62 // Set GOOD return code
66 // ------------------------------
67 // Routine for DCHOOK Device INIT
68 // ------------------------------
70 void CHK95_Device_Init()
75 PageModPerm( DWORD Page, DWORD nPages, DWORD Flags1, DWORD Flags2 )
83 VMMCall( _PageModifyPermissions );
90 // --------------------------------
91 // Routine for DCHOOK Device IO ctrl
92 // --------------------------------
93 void CHK95_Device_IOctrl(PDIOCPARAMETERS ptr)
102 // Field the DEV IO requests from VMM
103 switch(ptr->dwIoControlCode)
105 case DIOC_WRITEABLE_MEMORY: // The address to be changed must be already committed.
106 if ( ptr->lpvInBuffer ){
107 // Does it need a PC_STATIC?
111 // I don't know exact parameters. But it works well, so I don't care about it....
113 r = PageModPerm( *((DWORD*)ptr->lpvInBuffer), 1, 0xFFFFFFFF, PC_WRITEABLE | PC_USER | PC_STATIC );
114 if ( ptr->lpvOutBuffer ){
115 *((DWORD*)ptr->lpvOutBuffer) = r;
119 case DIOC_NONWRITEABLE_MEMORY: // The address to be changed must be already committed.
123 r = PageModPerm( *((DWORD*)ptr->lpvInBuffer), 1, ~PC_WRITEABLE, PC_USER | PC_STATIC );
124 if ( ptr->lpvOutBuffer ){
125 *((DWORD*)ptr->lpvOutBuffer) = r;
129 case DIOC_CHANGE_MEMORY:
130 addr = (DWORD)ptr->lpvOutBuffer;
131 page = addr >> 12; // 4KB
132 npage = ((addr + ptr->cbInBuffer) >> 12) - page + 1;
133 oldpermission = PageModPerm( page, npage, 0xFFFFFFFF, PC_WRITEABLE | PC_USER | PC_STATIC );
136 if ( oldpermission == (DWORD)-1 ){
141 p = (unsigned char*)addr;
142 q = (unsigned char*)ptr->lpvInBuffer;
143 for ( i=0;i<ptr->cbInBuffer;i++ ){
146 PageModPerm( page, npage, oldpermission, oldpermission );
151 *(DWORD*)ptr->lpvOutBuffer = (DWORD)CHK95_Device_IOctrl;
154 //The below DIOC_GETVERSION is a part of the dynamic load protocol
155 //It MUST return a GOOD code (all codes here use GoodReturnDIOC()
156 // case(DIOC_GETVERSION):
157 // case(DIOC_CLOSEHANDLE):