source: trunk/src/win32k/dev32/d32hlp.asm@ 10367

Last change on this file since 10367 was 6216, checked in by bird, 24 years ago

Made getdosenv dev help work.

File size: 9.1 KB
Line 
1; $Id: d32hlp.asm,v 1.6 2001-07-08 02:53:52 bird Exp $
2;
3; d32hlp - 32-bit Device Driver Helper Function.
4;
5; Copyright (c) 1999 knut st. osmundsen
6;
7; Project Odin Software License can be found in LICENSE.TXT
8;
9 .386p
10
11
12;
13; Include files
14;
15 include devsegdf.inc
16 include devhlp.inc
17
18
19;
20; Exported symbols
21;
22 public D32Hlp_VirtToLin
23 public D32Hlp_VirtToLin2
24 public D32Hlp_VirtToLin3
25 public D32Hlp_GetDOSVar
26 public D32Hlp_Yield
27 public D32Hlp_VMAlloc
28 public D32Hlp_VMFree
29 public D32Hlp_VMSetMem
30 public D32Hlp_VMLock
31 public D32Hlp_VMLock2
32 public D32Hlp_VMUnLock
33
34
35;
36; extrns
37;
38 extrn _Device_Help:dword
39
40
41CODE32 segment
42 assume cs:CODE32, ds:flat, ss:nothing, es:nothing
43 .386p
44
45;PVOID D32HLPCALL D32Hlp_VirtToLin(ULONG ulPtr16); /* eax */
46; Sideeffect: edx holds the error code on error.
47D32Hlp_VirtToLin proc near
48 push esi
49
50 movzx esi, ax
51 shr eax, 16
52 mov dl, DevHlp_VirtToLin
53 jmp far ptr CODE16:Thunk16_VirtToLin
54Thunk32_VirtToLin::
55 jnc Finished
56 mov edx, eax
57 xor eax, eax
58
59Finished:
60 pop esi
61 ret
62D32Hlp_VirtToLin endp
63
64
65;PVOID D32HLPCALL D32Hlp_VirtToLin2(USHORT usSelector, /* ax */
66; ULONG ulOffset); /* edx */
67; Sideeffect: edx holds the error code on error.
68D32Hlp_VirtToLin2 proc near
69 push esi
70
71 mov esi, edx
72 mov dl, DevHlp_VirtToLin
73 jmp far ptr CODE16:Thunk16_VirtToLin2
74Thunk32_VirtToLin2::
75 jnc Finished
76 mov edx, eax
77 xor eax, eax
78
79Finished:
80 pop esi
81 ret
82D32Hlp_VirtToLin2 endp
83
84
85;D32RET D32HLPCALL D32Hlp_VirtToLin3(USHORT usSelector, /* ax */
86; ULONG ulOffset, /* edx */
87; PPVOID ppvLinAddress); /* ecx */
88D32Hlp_VirtToLin3 proc near
89 push esi
90
91 mov esi, edx
92 mov dl, DevHlp_VirtToLin
93 jmp far ptr CODE16:Thunk16_VirtToLin3
94Thunk32_VirtToLin3::
95 jc Finished
96 mov [ecx], eax
97 xor eax, eax
98
99Finished:
100 pop esi
101 ret
102D32Hlp_VirtToLin3 endp
103
104
105;
106; Jump table used by D32Hlp_GetDOSVar
107;
108DosVarThunkTab LABEL DWORD
109 dd 0 ; 0 - Reserved
110 dd FLAT:Load1600Thunk ; 1 - GIS
111 dd FLAT:Load1616Thunk ; 2 - LIS
112 dd 0 ; 3 - Reserved
113 dd FLAT:Load1616 ; 4 - VectorSDF
114 dd FLAT:Load1616 ; 5 - VectorReboot
115 dd FLAT:Load1616 ; 6 - VectorMSATS
116 dd FLAT:ThunkPtr ; 7 - YieldFlag (Resched)
117 dd FLAT:ThunkPtr ; 8 - TCYieldFlag (TCResched)
118 dd FLAT:ThunkPtr ; 9 - DOSTable (yeah, reserved)
119 dd FLAT:Load1616 ; a - VectorDEKKO (yeah, reserved)
120 dd FLAT:ThunkPtr ; b - CodePgBuff
121 dd FLAT:Load1616 ; c - VectorRIPL
122 dd FLAT:ThunkPtr ; d - InterruptLevel
123 dd FLAT:ThunkPtr ; e - DevClassTables
124 dd FLAT:ThunkPtr ; f - DMQS_Sel
125 dd FLAT:ThunkPtr ;10 - APMInfo
126 dd FLAT:LoadWord ;11 - APM_Length (length of above structure)
127DosVarThunkTabSize equ ($ - DosVarThunkTab) / 4
128
129
130;PVOID D32HLPCALL D32Hlp_GetDOSVar(ULONG ulVarNumber, /* eax */
131; ULONG ulVarMember); /* edx */
132;
133; Note that we do post processing of the value....!
134;
135D32Hlp_GetDOSVar proc near
136 ASSUME DS:FLAT, ES:NOTHING
137 push ebx
138 push es
139 push ds
140 push ds
141 pop es ; paranoia
142 ASSUME es:FLAT
143 push eax
144 mov ecx, edx
145 mov dl, DevHlp_GetDOSVar
146 jmp far ptr CODE16:Thunk16_GetDOSVar
147Thunk32_GetDOSVar::
148 jc Error
149 mov ds, ax
150 pop eax ; Index...
151 cmp eax, DosVarThunkTabSize
152 jg Error
153 and ebx, 0000ffffh ; (ds:ebx is ptr to be processed)
154 jmp es:DosVarThunkTab[eax*4]
155
156; Load Word at ds:bx
157LoadWord::
158 xor eax, eax
159 mov ax, word ptr [bx]
160 jmp Finished
161
162; Load selector at ds:bx and thunk it.
163Load1600Thunk::
164 xor eax, eax
165 mov ax, word ptr [bx]
166 rol ax, 16
167 jmp ThunkIt
168
169; Load 16:16 ptr at ds:bx and thunk it.
170Load1616Thunk::
171 mov eax, dword ptr [ebx]
172 jmp ThunkIt
173
174; Load 16:16 ptr at ds:bx and return it.
175Load1616::
176 mov eax, dword ptr [ebx]
177 jmp Finished
178
179; Thunk the ds:bx ptr.
180ThunkPtr::
181 mov ax, ds
182 shl eax, 16
183 mov ax, bx
184
185; Thunks 16:16 ptr in eax
186ThunkIt::
187 pop ds
188 call D32Hlp_VirtToLin
189 jmp Finished2
190
191Error:
192 add esp, 4
193 xor eax, eax
194
195Finished:
196 pop ds
197Finished2:
198 pop es
199 pop ebx
200 ret
201D32Hlp_GetDOSVar endp
202
203
204
205;VOID D32HLPCALL D32Hlp_Yield(VOID);
206D32Hlp_Yield proc near
207 mov dl, DevHlp_Yield
208 jmp far ptr CODE16:Thunk16_Yield
209Thunk32_Yield::
210 ret
211D32Hlp_Yield endp
212
213
214
215;PVOID D32HLPCALL D32Hlp_VMAlloc(ULONG flFlags, /* eax */
216; ULONG cbSize, /* edx */
217; ULONG ulPhysAddr);/* ecx */
218D32Hlp_VMAlloc proc near
219 push edi
220
221 mov edi, ecx
222 mov ecx, edx
223
224 mov dl, DevHlp_VMAlloc
225 jmp far ptr CODE16:Thunk16_VMAlloc
226Thunk32_VMAlloc::
227 jnc Finished
228 xor eax, eax
229
230Finished:
231 pop edi
232 ret
233D32Hlp_VMAlloc endp
234
235
236;D32RET D32HLPCALL D32Hlp_VMFree(PVOID pvAddress); /* eax */
237D32Hlp_VMFree proc near
238 mov dl, DevHlp_VMFree
239 jmp far ptr CODE16:Thunk16_VMFree
240Thunk32_VMFree::
241 jc Finished
242 xor eax, eax
243Finished:
244 ret
245D32Hlp_VMFree endp
246
247
248;D32RET D32HLPCALL D32Hlp_VMSetMem(PVOID pvAddress, /* eax */
249; ULONG cbSize, /* edx */
250; ULONG flFlags); /* ecx */
251D32Hlp_VMSetMem proc near
252 push ebx
253
254 mov ebx, eax
255 mov eax, ecx
256 mov ecx, edx
257
258 mov dl, DevHlp_VMSetMem
259 jmp far ptr CODE16:Thunk16_VMSetMem
260Thunk32_VMSetMem::
261
262 pop ebx
263 ret
264D32Hlp_VMSetMem endp
265
266
267;D32RET D32HLPCALL D32Hlp_VMLock(PVOID pvAddress, /* eax (ebp + 08h) */
268; ULONG ulLength, /* edx (ebp + 0Ch)*/
269; ULONG flFlags, /* ecx (ebp + 10h)*/
270; PVOID pvPagelist, /* ebp + 14h */
271; PLOCKHANDLE pLockHandle, /* ebp + 18h */
272; PULONG pulPageListCount); /* ebp + 1Ch */
273D32Hlp_VMLock proc near
274 push ebp
275 mov ebp, esp
276 push esi
277 push edi
278 push ebx
279
280 mov edi, [ebp + 14h]
281 mov esi, [ebp + 18h]
282 mov ebx, eax
283 mov eax, ecx
284 mov ecx, edx
285
286 mov dl, DevHlp_VMLock
287 jmp far ptr CODE16:Thunk16_VMLock
288Thunk32_VMLock::
289 jc Finished
290 mov ebx, [ebp + 1Ch]
291 or ebx, ebx
292 jz Success
293 mov [ebx], eax
294
295Success:
296 xor eax, eax
297
298Finished:
299 pop ebx
300 pop edi
301 pop esi
302 pop ebp
303 ret
304D32Hlp_VMLock endp
305
306
307;D32RET D32HLPCALL D32Hlp_VMLock2(PVOID pvAddress, /* eax (ebp + 08h) */
308; ULONG ulLength, /* edx (ebp + 0Ch)*/
309; ULONG flFlags, /* ecx (ebp + 10h)*/
310; PLOCKHANDLE pLockHandle); /* ebp + 14h */
311D32Hlp_VMLock2 proc near
312 push ebp
313 mov ebp, esp
314 push esi
315 push edi
316 push ebx
317
318 mov edi, 0ffffffffh
319 mov esi, [ebp + 14h]
320 mov ebx, eax
321 mov eax, ecx
322 mov ecx, edx
323
324 mov dl, DevHlp_VMLock
325 jmp far ptr CODE16:Thunk16_VMLock2
326Thunk32_VMLock2::
327 jc Finished
328 xor eax, eax
329
330Finished:
331 pop ebx
332 pop edi
333 pop esi
334 pop ebp
335 ret
336D32Hlp_VMLock2 endp
337
338
339;D32RET D32HLPCALL D32Hlp_VMUnLock(PLOCKHANDLE pLockHandle); /* eax */
340D32Hlp_VMUnLock proc near
341 push esi
342
343 mov esi, eax
344 mov dl, DevHlp_VMUnlock
345 jmp far ptr CODE16:Thunk16_VMUnLock
346Thunk32_VMUnLock::
347 jc Finished
348 xor eax, eax
349
350Finished:
351 pop esi
352 ret
353D32Hlp_VMUnLock endp
354
355CODE32 ends
356
357
358
359
360
361;CODE16 segment
362CODE16 segment
363 assume cs:CODE16, ds:FLAT
364
365Thunk16_VirtToLin:
366 call [_Device_Help]
367 jmp far ptr FLAT:Thunk32_VirtToLin
368
369Thunk16_VirtToLin2:
370 call [_Device_Help]
371 jmp far ptr FLAT:Thunk32_VirtToLin2
372
373Thunk16_VirtToLin3:
374 call [_Device_Help]
375 jmp far ptr FLAT:Thunk32_VirtToLin3
376
377Thunk16_GetDOSVar:
378 call [_Device_Help]
379 jmp far ptr FLAT:Thunk32_GetDOSVar
380
381Thunk16_Yield:
382 call [_Device_Help]
383 jmp far ptr FLAT:Thunk32_Yield
384
385Thunk16_VMAlloc:
386 call [_Device_Help]
387 jmp far ptr FLAT:Thunk32_VMAlloc
388
389Thunk16_VMFree:
390 call [_Device_Help]
391 jmp far ptr FLAT:Thunk32_VMFree
392
393Thunk16_VMLock:
394 call [_Device_Help]
395 jmp far ptr FLAT:Thunk32_VMLock
396
397Thunk16_VMLock2:
398 call [_Device_Help]
399 jmp far ptr FLAT:Thunk32_VMLock2
400
401Thunk16_VMUnLock:
402 call [_Device_Help]
403 jmp far ptr FLAT:Thunk32_VMUnLock
404
405Thunk16_VMSetMem:
406 call [_Device_Help]
407 jmp far ptr FLAT:Thunk32_VMSetMem
408
409CODE16 ends
410
411end
Note: See TracBrowser for help on using the repository browser.