- Timestamp:
- Feb 20, 2001, 6:02:40 AM (25 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/win32k/dev32/d32Win32kIOCtl.c
r5105 r5205 1 /* $Id: d32Win32kIOCtl.c,v 1. 5 2001-02-11 15:19:47bird Exp $1 /* $Id: d32Win32kIOCtl.c,v 1.6 2001-02-20 05:02:40 bird Exp $ 2 2 * 3 3 * Win32k driver IOCtl handler function. … … 11 11 * Defined Constants And Macros * 12 12 *******************************************************************************/ 13 #define MAX_PARAMSIZE 64 /* Maximum size of a parameter structure. */ 14 13 15 #define INCL_DOSERRORS 14 16 #define INCL_NOPMAPI 17 #define INCL_OS2KRNL_TK 15 18 16 19 #define NO_WIN32K_LIB_FUNCTIONS … … 28 31 #include "Win32k.h" 29 32 #include "k32.h" 33 #include "log.h" 34 #include "asmutils.h" 35 36 37 /******************************************************************************* 38 * Internal Functions * 39 *******************************************************************************/ 40 APIRET _Optlink Win32kAPIRouter(ULONG ulFunction, PVOID pvParam); /* called from d32CallGate.asm too. */ 30 41 31 42 … … 40 51 { 41 52 /* validate parameter pointer */ 42 if (pRpIOCtl == NULL || pRpIOCtl->ParmPacket == NULL )53 if (pRpIOCtl == NULL || pRpIOCtl->ParmPacket == NULL || pRpIOCtl->Function == 0 || pRpIOCtl->Function > K32_LASTIOCTLFUNCTION) 43 54 return STATUS_DONE | STERR | ERROR_I24_INVALID_PARAMETER; 44 55 … … 46 57 { 47 58 case IOCTL_W32K_K32: 48 switch (pRpIOCtl->Function)49 59 { 50 case K32_ALLOCMEMEX: 51 { 52 PK32ALLOCMEMEX pParm = (PK32ALLOCMEMEX)pRpIOCtl->ParmPacket; 53 pParm->rc = k32AllocMemEx(&pParm->pv, pParm->cb, pParm->flFlags, 54 pParm->ulCS, pParm->ulEIP); 55 return STATUS_DONE; 56 } 57 58 case K32_QUERYOTES: 59 { 60 PK32QUERYOTES pParm = (PK32QUERYOTES)pRpIOCtl->ParmPacket; 61 pParm->rc = k32QueryOTEs((HMTE)pParm->hMTE, pParm->pQOte, pParm->cbQOte); 62 return STATUS_DONE; 63 } 64 65 case K32_QUERYOPTIONSSTATUS: 66 { 67 PK32QUERYOPTIONSSTATUS pParm = (PK32QUERYOPTIONSSTATUS)pRpIOCtl->ParmPacket; 68 pParm->rc = k32QueryOptionsStatus(pParm->pOptions, pParm->pStatus); 69 return STATUS_DONE; 70 } 71 72 case K32_SETOPTIONS: 73 { 74 PK32SETOPTIONS pParm = (PK32SETOPTIONS)pRpIOCtl->ParmPacket; 75 pParm->rc = k32SetOptions(pParm->pOptions); 76 return STATUS_DONE; 77 } 78 79 case K32_PROCESSREADWRITE: 80 { 81 PK32PROCESSREADWRITE pParm = (PK32PROCESSREADWRITE)pRpIOCtl->ParmPacket; 82 pParm->rc = k32ProcessReadWrite(pParm->pid, pParm->cb, pParm->pvSource, pParm->pvTarget, pParm->fRead); 83 return STATUS_DONE; 84 } 85 86 case K32_HANDLESYSTEMEVENT: 87 { 88 PK32HANDLESYSTEMEVENT pParm = (PK32HANDLESYSTEMEVENT)pRpIOCtl->ParmPacket; 89 //pParm->rc = k32HandleSystemEvent(pParm->ulEvent, pParm->hev, pParm->fHandle); 90 pParm->rc = ERROR_NOT_SUPPORTED; 91 return STATUS_DONE; 92 } 93 94 case K32_QUERYSYSTEMMEMINFO: 95 { 96 PK32QUERYSYSTEMMEMINFO pParm = (PK32QUERYSYSTEMMEMINFO)pRpIOCtl->ParmPacket; 97 pParm->rc = k32QuerySystemMemInfo(pParm->pMemInfo); 98 return STATUS_DONE; 99 } 100 60 APIRET rc = Win32kAPIRouter(pRpIOCtl->Function, pRpIOCtl->ParmPacket); 61 if ( rc != 0xdeadbeefUL 62 && TKSuULongNF(pRpIOCtl->ParmPacket, SSToDS(&rc)) == NO_ERROR) 63 return STATUS_DONE; /* Successfull return */ 64 break; 101 65 } 102 break;103 66 } 104 67 … … 106 69 } 107 70 71 72 /** 73 * Internal function router which calls the correct function. 74 * Called from IOCtl worker and callgate in d32CallGate.asm. 75 * @returns function return code. 76 * 0xdeadbeef if invalid function number. 77 * @param ulFunction Function number to call. 78 * @param pvParam Parameter package for that function. 79 * @sketch 80 * @status partially implemented. 81 * @author knut st. osmundsen (knut.stange.osmundsen@mynd.no) 82 * @remark This could be reimplemented in assembly. 83 * Make generic parameter layout to limit amount of memory copied back. 84 */ 85 APIRET _Optlink Win32kAPIRouter(ULONG ulFunction, PVOID pvParam) 86 { 87 static ULONG acbParams[] = 88 { 89 0, /* Not used - ie. invalid */ 90 sizeof(K32ALLOCMEMEX), /* K32_ALLOCMEMEX 0x01 */ 91 sizeof(K32QUERYOTES), /* K32_QUERYOTES 0x02 */ 92 sizeof(K32QUERYOPTIONSSTATUS), /* K32_QUERYOPTIONSSTATUS 0x03 */ 93 sizeof(K32SETOPTIONS), /* K32_SETOPTIONS 0x04 */ 94 sizeof(K32PROCESSREADWRITE), /* K32_PROCESSREADWRITE 0x05 */ 95 sizeof(K32HANDLESYSTEMEVENT), /* K32_HANDLESYSTEMEVENT 0x06 */ 96 sizeof(K32QUERYSYSTEMMEMINFO) /* K32_QUERYSYSTEMMEMINFO 0x07 */ 97 }; 98 APIRET rc; 99 char achBuffer[MAX_PARAMSIZE]; 100 PVOID pv = SSToDS(&achBuffer[0]); 101 102 /* 103 * Validate the function number. 104 * Fetch parameters from user buffer onto our Ring-0 stack. 105 */ 106 if (ulFunction == 0 || ulFunction > sizeof(acbParams) / sizeof(acbParams[0])) 107 return 0xdeadbeaf; 108 rc = TKFuBuff(pv, pvParam, acbParams[ulFunction], TK_FUSU_NONFATAL); 109 if (rc) 110 { 111 kprintf(("Win32kAPIRouter: Failed to fetch user parameters rc=%d.\n", rc)); 112 return rc; /* This can't happen when called from by IOCtl (I hope). */ 113 } 114 115 116 /* 117 * Call the actual function. 118 */ 119 switch (ulFunction) 120 { 121 case K32_ALLOCMEMEX: 122 { 123 PK32ALLOCMEMEX pParm = (PK32ALLOCMEMEX)pv; 124 return k32AllocMemEx(pParm->ppv, pParm->cb, pParm->flFlags, pParm->ulCS, pParm->ulEIP); 125 } 126 127 case K32_QUERYOTES: 128 { 129 PK32QUERYOTES pParm = (PK32QUERYOTES)pv; 130 return k32QueryOTEs((HMTE)pParm->hMTE, pParm->pQOte, pParm->cbQOte); 131 } 132 133 case K32_QUERYOPTIONSSTATUS: 134 { 135 PK32QUERYOPTIONSSTATUS pParm = (PK32QUERYOPTIONSSTATUS)pv; 136 return k32QueryOptionsStatus(pParm->pOptions, pParm->pStatus); 137 } 138 139 case K32_SETOPTIONS: 140 { 141 PK32SETOPTIONS pParm = (PK32SETOPTIONS)pv; 142 return k32SetOptions(pParm->pOptions); 143 } 144 145 case K32_PROCESSREADWRITE: 146 { 147 PK32PROCESSREADWRITE pParm = (PK32PROCESSREADWRITE)pv; 148 return k32ProcessReadWrite(pParm->pid, pParm->cb, pParm->pvSource, pParm->pvTarget, pParm->fRead); 149 } 150 151 case K32_HANDLESYSTEMEVENT: 152 { 153 //PK32HANDLESYSTEMEVENT pParm = (PK32HANDLESYSTEMEVENT)pv; 154 //return k32HandleSystemEvent(pParm->ulEvent, pParm->hev, pParm->fHandle); 155 return ERROR_NOT_SUPPORTED; 156 } 157 158 case K32_QUERYSYSTEMMEMINFO: 159 { 160 PK32QUERYSYSTEMMEMINFO pParm = (PK32QUERYSYSTEMMEMINFO)pv; 161 return k32QuerySystemMemInfo(pParm->pMemInfo); 162 } 163 } 164 165 166 /* 167 * This will never happen. 168 */ 169 kprintf(("Win32kAPIRouter: Internal processing error\n")); 170 Int3(); 171 172 return 0xdeadbeaf; 173 }
Note:
See TracChangeset
for help on using the changeset viewer.