source: trunk/src/VBox/Additions/os2/VBoxSF/VBoxSFA.asm@ 161

Last change on this file since 161 was 161, checked in by Valery V. Sedletski, 7 years ago

VBoxSF.ifs: commit forgotten last changes (some more IFS entry points implemented).

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 57.1 KB
Line 
1; $Id: VBoxSFA.asm 161 2018-04-10 00:36:59Z valerius $
2;; @file
3; VBoxSF - OS/2 Shared Folders, all assembly code (16 -> 32 thunking mostly).
4;
5
6;
7; Copyright (c) 2007 knut st. osmundsen <bird-src-spam@anduin.net>
8;
9; Permission is hereby granted, free of charge, to any person
10; obtaining a copy of this software and associated documentation
11; files (the "Software"), to deal in the Software without
12; restriction, including without limitation the rights to use,
13; copy, modify, merge, publish, distribute, sublicense, and/or sell
14; copies of the Software, and to permit persons to whom the
15; Software is furnished to do so, subject to the following
16; conditions:
17;
18; The above copyright notice and this permission notice shall be
19; included in all copies or substantial portions of the Software.
20;
21; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
22; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
23; OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
24; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
25; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
26; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
27; FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
28; OTHER DEALINGS IN THE SOFTWARE.
29;
30
31
32;*******************************************************************************
33;* Header Files *
34;*******************************************************************************
35%define RT_INCL_16BIT_SEGMENTS
36%include "iprt/asmdefs.mac"
37%include "iprt/err.mac"
38%include "VBox/VBoxGuest.mac"
39
40
41;*******************************************************************************
42;* Defined Constants And Macros *
43;*******************************************************************************
44%define ERROR_NOT_SUPPORTED 50
45%define ERROR_INVALID_PARAMETER 87
46%define ERROR_PROTECTION_VIOLATION 115
47%define DevHlp_AttachDD 2ah
48%define DevHlp_AllocGDTSelector 2dh
49%define DevHlp_FreeGDTSelector 53h
50%define DevHlp_VMProcessToGlobal 59h
51%define DevHlp_LinToGDTSelector 5ch
52
53;;
54; Prints a string to the VBox log port.
55%macro DEBUG_STR16 1
56%ifdef DEBUG
57segment DATA16
58%%my_dbg_str: db %1, 0ah, 0
59segment CODE16
60 push ax
61 mov ax, %%my_dbg_str
62 call NAME(dbgstr16)
63 pop ax
64%endif
65%endmacro
66
67
68%macro VBOXSF_EP16_BEGIN 2
69global %1
70%1:
71 DEBUG_STR16 {'VBoxSF: ', %2}
72
73%endmacro
74
75%macro VBOXSF_EP16_END 1
76global %1_EndProc
77%1_EndProc:
78%endmacro
79
80
81%macro VBOXSF_EP32_BEGIN 2
82global %1
83%1:
84; DEBUG_STR16 {'VBoxSF: ', %2}
85
86%endmacro
87
88%macro VBOXSF_EP32_END 1
89global %1_EndProc
90%1_EndProc:
91%endmacro
92
93;;
94; Used to taking us to 32-bit and reserving a parameter frame.
95;
96; @param %1 The function name
97; @param %2 The number of bytes to reserve
98;
99%macro VBOXSF_TO_32 2
100 ; prologue
101 push ebp
102 mov ebp, esp ; bp
103 push ds ; bp - 2
104 push es ; bp - 4
105
106 ; Reserve the 32-bit parameter and align the stack on a 16 byte
107 ; boundary to make GCC really happy.
108 sub sp, %2
109 and sp, 0fff0h
110
111 ;jmp far dword NAME(%i %+ _32) wrt FLAT
112 db 066h
113 db 0eah
114 dd NAME(%1 %+ _32) ;wrt FLAT
115 dw TEXT32 wrt FLAT
116segment TEXT32
117GLOBALNAME %1 %+ _32
118 mov ax, DATA32 wrt FLAT
119 mov ds, ax
120 mov es, ax
121
122 call KernThunkStackTo32
123
124%endmacro VBOXSF_TO_32 1
125
126;;
127; The counter part to VBOXSF_TO_32
128;
129; @param %1 The function name
130;
131%macro VBOXSF_TO_16 1
132 push eax
133 call KernThunkStackTo16
134 pop eax
135
136 ;jmp far dword NAME(%1 %+ _16) wrt CODE16
137 db 066h
138 db 0eah
139 dw NAME(%1 %+ _16) wrt CODE16
140 dw CODE16
141segment CODE16
142GLOBALNAME %1 %+ _16
143
144 ; Epilogue
145 lea sp, [bp - 4h]
146 pop es
147 pop ds
148 mov esp, ebp
149 pop ebp
150%endmacro
151
152
153;;
154; Used to taking us to 16-bit and reserving a parameter frame.
155;
156; @param %1 The function name
157; @param %2 The number of bytes to reserve
158;
159%macro VBOXSF_32_TO_16 2
160 ; prologue
161 push ebp
162 mov ebp, esp ; ebp
163 push edi ; ebp - 4
164 push ebx ; ebp - 8
165 push ds ; ebp - 0c
166 push es ; ebp - 10
167
168 ; Reserve the 16-bit parameters and align the stack on a 16 byte
169 ; boundary to make GCC really happy.
170 sub esp, %2
171 and esp, 0fffffff0h
172
173 call KernThunkStackTo16
174
175 xor ebx, ebx
176
177 ;jmp far dword NAME(%i %+ _16)
178 db 066h
179 db 0eah
180 dw NAME(%1 %+ _16) wrt CODE16
181 dw CODE16
182segment CODE16
183GLOBALNAME %1 %+ _16
184 mov ax, DATA16
185 mov ds, ax
186 mov es, ax
187
188%endmacro VBOXSF_32_TO_16 1
189
190
191;;
192; The counter part to VBOXSF_32_TO_16
193;
194; @param %1 The function name
195;
196%macro VBOXSF_16_TO_32 1
197 ;jmp far dword NAME(%1 %+ _32) wrt FLAT
198 db 066h
199 db 0eah
200 dd NAME(%1 %+ _32) wrt FLAT
201 dw TEXT32 wrt FLAT
202segment TEXT32
203GLOBALNAME %1 %+ _32
204 mov ax, DATA32 wrt FLAT
205 mov ds, ax
206 mov es, ax
207
208 call KernThunkStackTo32
209
210%endmacro
211
212;;
213; Allocate a GDT selector
214;
215; @param %1 The function name
216; @param %2 esp offset to the selector
217;
218%macro VBOXSF_ALLOCGDTSEL 1
219 mov eax, ss
220 mov es, ax
221 lea edi, [esp + %1] ; &sel in ES:DI
222 mov ecx, 1 ; one selector
223 mov dl, DevHlp_AllocGDTSelector
224 call far [NAME(g_fpfnDevHlp)]
225%endmacro
226
227;;
228; Map Linear address to a GDT selector
229;
230; @param %1 Selector esp offset
231; @param %2 Linear address ebp offset
232; @param %3 Size (immediate)
233;
234; carry flag if unsuccessful
235;
236%macro VBOXSF_LINTOGDTSEL 3
237 xor eax, eax
238 mov ax, [esp + %1] ; sel
239 mov ebx, [ebp + %2] ; lin
240 mov ecx, %3 ; size
241 mov dl, DevHlp_LinToGDTSelector
242 call far [NAME(g_fpfnDevHlp)]
243%endmacro
244
245;;
246; Free GDT selector
247;
248; @param %1 Selector esp offset
249;
250%macro VBOXSF_FREEGDTSEL 1
251 mov ax, [esp + %1] ; sel
252 mov dl, DevHlp_FreeGDTSelector
253 call far [NAME(g_fpfnDevHlp)]
254%endmacro
255
256;;
257; Process to Global
258;
259; @param %1 Linear address ebp offset
260; @param %2 size
261; @param %3 Action flags
262;
263%macro VBOXSF_PROCESSTOGLOBAL 3
264 mov ebx, [ebp + %1] ; lin
265 mov ecx, %2 ; size
266 mov eax, %3 ; flags
267 mov dl, DevHlp_VMProcessToGlobal
268 call far [NAME(g_fpfnDevHlp)]
269%endmacro
270
271
272;;
273; Take off the old stack frame
274;
275%macro VBOXSF_EPILOGUE 0
276 ; Epilogue
277 lea esp, [ebp - 10h]
278
279 pop es
280 pop ds
281 pop ebx
282 pop edi
283 mov esp, ebp
284 pop ebp
285%endmacro
286
287;;
288; Thunks the given 16:16 pointer to a flat pointer.
289;
290; @param %1 The ebp offset of the input.
291; @param %2 The esp offset of the output.
292; @users eax
293;
294%macro VBOXSF_FARPTR_2_FLAT 2
295 mov eax, dword [ebp + (%1)]
296 push eax
297 call KernSelToFlat
298 add esp, 4
299 mov [esp + (%2)], eax
300%endmacro
301
302
303;;
304; Put address of an input variable and put it at an output offset.
305;
306; @param %1 The esp offset of the input.
307; @param %2 The esp offset of the output.
308; @users eax, edx
309
310%macro VBOXSF_PUTVARADDR 2
311 lea edx, [esp + (%1)]
312 mov ax, ss
313 shl eax, 10h
314 mov ax, dx
315 mov [esp + (%2)], eax
316%endmacro
317
318
319;;
320; Converts the 16:16 pointer on stack to a FLAT pointer.
321;
322; @param %1 The esp offset of the input
323; @param %2 The ebp offset of the input
324; @users eax, ecx
325;
326%macro VBOXSF_THUNK_FARPTR_2_FLAT 2
327 mov eax, [esp + (%1)]
328
329 push eax
330 call KernSelToFlat
331 add sp, 4
332
333 mov ecx, [ebp + (%2)]
334 mov [ecx], eax
335%endmacro
336
337
338;;
339; Thunks the given 16:16 struct sffsd pointer to a flat pointer.
340;
341; @param %1 The ebp offset of the input.
342; @param %2 The esp offset of the output.
343; @users eax, ecx
344;
345%macro VBOXSF_PSFFSD_2_FLAT 2
346 lds cx, [ebp + (%1)]
347 and ecx, 0ffffh
348 mov eax, dword [ecx]
349 mov cx, DATA32 wrt FLAT
350 mov [esp + (%2)], eax
351 mov ds, cx
352%endmacro
353
354
355;;
356; Thunks the given 16:16 struct cdfsd pointer to a flat pointer.
357;
358; @param %1 The ebp offset of the input.
359; @param %2 The esp offset of the output.
360; @users eax, ecx
361;
362%macro VBOXSF_PCDFSD_2_FLAT 2
363 lds cx, [ebp + (%1)]
364 and ecx, 0ffffh
365 mov eax, dword [ecx]
366 mov cx, DATA32 wrt FLAT
367 mov [esp + (%2)], eax
368 mov ds, cx
369%endmacro
370
371;;
372; Thunks the given 16:16 struct fsfsd pointer to a flat pointer.
373;
374; @param %1 The ebp offset of the input.
375; @param %2 The esp offset of the output.
376; @users eax, ecx
377;
378%macro VBOXSF_PFSFSD_2_FLAT 2
379 lds cx, [ebp + (%1)]
380 and ecx, 0ffffh
381 mov eax, dword [ecx]
382 mov cx, DATA32 wrt FLAT
383 mov [esp + (%2)], eax
384 mov ds, cx
385%endmacro
386
387
388;*******************************************************************************
389;* External Symbols *
390;*******************************************************************************
391segment CODE32
392extern KernThunkStackTo32
393extern KernThunkStackTo16
394extern KernSelToFlat
395segment CODE16
396extern FSH_FORCENOSWAP
397extern DOS16WRITE
398extern FSH_GETVOLPARM
399extern FSH_PROBEBUF
400extern FSH_WILDMATCH
401
402segment CODE32
403extern NAME(FS32_ALLOCATEPAGESPACE)
404extern NAME(FS32_ATTACH)
405extern NAME(FS32_CANCELLOCKREQUEST)
406extern NAME(FS32_CANCELLOCKREQUESTL)
407extern NAME(FS32_CHDIR)
408extern FS32_CHGFILEPTRL
409extern NAME(FS32_CLOSE)
410extern NAME(FS32_COMMIT)
411extern NAME(FS32_COPY)
412extern NAME(FS32_DELETE)
413extern NAME(FS32_DOPAGEIO)
414extern NAME(FS32_EXIT)
415extern NAME(FS32_FILEATTRIBUTE)
416extern NAME(FS32_FILEINFO)
417extern NAME(FS32_FILEIO)
418extern NAME(FS32_FILELOCKS)
419extern NAME(FS32_FILELOCKSL)
420extern NAME(FS32_FINDCLOSE)
421extern NAME(FS32_FINDFIRST)
422extern NAME(FS32_FINDFROMNAME)
423extern NAME(FS32_FINDNEXT)
424extern NAME(FS32_FINDNOTIFYCLOSE)
425extern NAME(FS32_FINDNOTIFYFIRST)
426extern NAME(FS32_FINDNOTIFYNEXT)
427extern NAME(FS32_FLUSHBUF)
428extern NAME(FS32_FSCTL)
429extern NAME(FS32_FSINFO)
430extern NAME(FS32_IOCTL)
431extern NAME(FS32_MKDIR)
432extern NAME(FS32_MOUNT)
433extern NAME(FS32_MOVE)
434extern NAME(FS32_NEWSIZEL)
435extern NAME(FS32_NMPIPE)
436extern NAME(FS32_OPENCREATE)
437extern NAME(FS32_OPENPAGEFILE)
438extern NAME(FS32_PATHINFO)
439extern NAME(FS32_PROCESSNAME)
440extern FS32_READ
441extern NAME(FS32_RMDIR)
442extern NAME(FS32_SETSWAP)
443extern NAME(FS32_SHUTDOWN)
444extern NAME(FS32_VERIFYUNCNAME)
445extern FS32_WRITE
446
447extern NAME(VBoxSFR0Init)
448
449
450;*******************************************************************************
451;* IFS Helpers *
452;*******************************************************************************
453segment TEXT32
454
455;;
456; @cproto APIRET APIENTRY FSH32_GETVOLPARM(USHORT hVPB, PVPFSI *ppvpfsi, PVPFSD *ppvpfsd);
457VBOXSF_EP32_BEGIN FSH32_GETVOLPARM, 'FSH32_GETVOLPARM'
458 ; switch to 16-bits and reserve place in stack for pvpfsi/pvpfsd and FSH_GETVOLPARM args (2+3=5)
459 VBOXSF_32_TO_16 FSH32_GETVOLPARM, 5*4
460segment CODE16
461 mov cx, [ebp + 8h] ; hVPB
462 mov [esp + 2*4], cx
463 ; reserve place for ppvpfsi far16 pointer on stack
464 VBOXSF_PUTVARADDR 4*4, 1*4 ; ppvpfsi
465 ; reserve place for ppvpfsd far16 pointer on stack
466 VBOXSF_PUTVARADDR 3*4, 0*4 ; ppvpfsd
467 call far FSH_GETVOLPARM
468 ; switch back to 32 bits
469 VBOXSF_16_TO_32 FSH32_GETVOLPARM
470 ; convert pvpfsd to FLAT
471 VBOXSF_THUNK_FARPTR_2_FLAT 2 + 0*4, 4*4
472 ; convert pvpfsi to FLAT
473 VBOXSF_THUNK_FARPTR_2_FLAT 2 + 1*4, 3*4
474 ; restore stack
475 VBOXSF_EPILOGUE
476 ret
477VBOXSF_EP32_END FSH32_GETVOLPARM
478
479;;
480; APIRET APIENTRY FSH32_PROBEBUF(ULONG operation, char *pData, ULONG cbData);
481VBOXSF_EP32_BEGIN FSH32_PROBEBUF, 'FSH32_PROBEBUF'
482 ; switch to 16-bits and reserve place in stack for one selector and three vars
483 VBOXSF_32_TO_16 FSH32_PROBEBUF, 10
484segment CODE16
485 mov cx, [ebp + 8h] ; operation
486 mov [esp + 6], cx
487
488 ; alloc a GDT selector for pData
489 VBOXSF_ALLOCGDTSEL 8
490 jnc FSH32_PROBEBUF_ok1
491 mov ebx, ERROR_PROTECTION_VIOLATION
492 jmp NAME(FSH32_PROBEBUF_exit2)
493FSH32_PROBEBUF_ok1:
494 ; Convert address from current process address space to system one
495 VBOXSF_PROCESSTOGLOBAL 0xc, [ebp + 10h], [ebp + 8h]
496 jnc FSH32_PROBEBUF_ok2
497 mov ebx, ERROR_PROTECTION_VIOLATION
498 jmp NAME(FSH32_PROBEBUF_exit1)
499FSH32_PROBEBUF_ok2:
500 mov [ebp + 0ch], eax
501 ; map pData FLAT addr to an allocated selector
502 VBOXSF_LINTOGDTSEL 8, 0xc, [ebp + 10h]
503 jnc FSH32_PROBEBUF_ok3
504 mov ebx, ERROR_PROTECTION_VIOLATION
505 jmp NAME(FSH32_PROBEBUF_exit1)
506FSH32_PROBEBUF_ok3:
507 ; store a far pointer to pData
508 mov eax, [esp + 8]
509 shl eax, 16
510 mov [esp + 2], eax
511
512 mov cx, [ebp + 10h] ; cbData
513 mov [esp], cx
514
515 call far FSH_PROBEBUF
516
517 ; save return code
518 xor ebx, ebx
519 mov bx, ax
520
521 ; -2*4 is because of "ret 8" command at the end of last function
522 sub esp, 8
523
524GLOBALNAME FSH32_PROBEBUF_exit1
525 ; free GDT selectors
526 VBOXSF_FREEGDTSEL 8
527GLOBALNAME FSH32_PROBEBUF_exit2
528
529 add esp, 8
530
531 ; switch back to 32 bits
532 VBOXSF_16_TO_32 FSH32_PROBEBUF
533
534 ; restore return code
535 mov eax, ebx
536
537 ; restore stack
538 VBOXSF_EPILOGUE
539 ret
540VBOXSF_EP32_END FSH32_PROBEBUF
541
542;;
543; APIRET APIENTRY FSH32_WILDMATCH(char *pPat, char *pStr);
544VBOXSF_EP32_BEGIN FSH32_WILDMATCH, 'FSH32_WILDMATCH'
545 ; switch to 16-bits and reserve place in stack for two selectors and two far ptrs (2+2=4)
546 VBOXSF_32_TO_16 FSH32_WILDMATCH, 4*4
547segment CODE16
548 ; alloc a GDT selector for pPat
549 VBOXSF_ALLOCGDTSEL 3*4
550 jc NAME(FSH32_WILDMATCH_exit2)
551 ; map pPat FLAT addr to an allocated selector
552 VBOXSF_LINTOGDTSEL 3*4, 0x8, 0x10000
553 jc NAME(FSH32_WILDMATCH_exit2)
554 ; store a far pointer to pPat
555 mov eax, [esp + 3*4]
556 shl eax, 16
557 mov [esp + 1*4], eax
558
559 ; alloc a GDT selector for pStr
560 VBOXSF_ALLOCGDTSEL 2*4
561 jc NAME(FSH32_WILDMATCH_exit1)
562 ; map pStr FLAT addr to an allocated selector
563 VBOXSF_LINTOGDTSEL 2*4, 0xc, 0x10000
564 jc NAME(FSH32_WILDMATCH_exit1)
565 ; store a far pointer to pStr
566 mov eax, [esp + 2*4]
567 shl eax, 16
568 mov [esp + 0*4], eax
569
570 call far FSH_WILDMATCH
571
572 ; save return code
573 xor ebx, ebx
574 mov bx, ax
575
576 ; -2*4 is because of "ret 8" command at the end of last function
577 sub esp, 2*4
578
579 ; free GDT selectors
580 VBOXSF_FREEGDTSEL 2*4
581GLOBALNAME FSH32_WILDMATCH_exit1
582 VBOXSF_FREEGDTSEL 3*4
583GLOBALNAME FSH32_WILDMATCH_exit2
584
585 add esp, 2*4
586
587 ; switch back to 32 bits
588 VBOXSF_16_TO_32 FSH32_WILDMATCH
589
590 ; restore return code
591 mov eax, ebx
592
593 ; restore stack
594 VBOXSF_EPILOGUE
595 ret
596VBOXSF_EP32_END FSH32_WILDMATCH
597
598
599;*******************************************************************************
600;* Global Variables *
601;*******************************************************************************
602segment DATA16
603
604;;
605; The file system name.
606global FS_NAME
607FS_NAME:
608 db 'VBOXSF',0
609
610;;
611; File system attributes
612; The 32-bit version is only used to indicate that this is a 32-bit file system.
613;
614%define FSA_REMOTE 0001h ; remote file system.
615%define FSA_UNC 0002h ; implements UNC.
616%define FSA_LOCK 0004h ; needs lock notification.
617%define FSA_LVL7 0008h ; accept level 7 (case preserving path request).
618%define FSA_PSVR 0010h ; (named) pipe server.
619%define FSA_LARGEFILE 0020h ; large file support.
620align 16
621global FS_ATTRIBUTE
622global FS32_ATTRIBUTE
623FS_ATTRIBUTE:
624FS32_ATTRIBUTE:
625 dd FSA_REMOTE + FSA_LARGEFILE + FSA_UNC ;+ FSA_LVL7 + FSA_LOCK
626
627;; 64-bit mask.
628; bit 0 - don't get the ring-0 spinlock.
629; bit 6 - don't get the subsystem ring-0 spinlock.
630global FS_MPSAFEFLAGS2
631FS_MPSAFEFLAGS2:
632 dd 0
633 dd 0
634
635;;
636; Set after VBoxSFR0Init16Bit has been called.
637GLOBALNAME g_fDoneRing0
638 db 0
639
640align 4
641;;
642; The device helper (IPRT expects this name).
643; (This is set by FS_INIT.)
644GLOBALNAME g_fpfnDevHlp
645 dd 0
646
647;;
648; Whether initialization should be verbose or quiet.
649GLOBALNAME g_fVerbose
650 db 1
651
652;; DEBUGGING DEBUGGING
653GLOBALNAME g_u32Info
654 dd 0
655
656;; Far pointer to DOS16WRITE (corrected set before called).
657; Just a 'temporary' hack to work around a wlink/nasm issue.
658GLOBALNAME g_fpfnDos16Write
659 dw DOS16WRITE
660 dw seg DOS16WRITE
661
662;;
663; The attach dd data.
664GLOBALNAME g_VBoxGuestAttachDD
665 dd 0
666 dw 0
667 dd 0
668 dw 0
669;;
670; The AttachDD name of the VBoxGuest.sys driver.
671GLOBALNAME g_szVBoxGuestName
672 db VBOXGUEST_DEVICE_NAME, 0
673;;
674; The VBoxGuest IDC connection data.
675GLOBALNAME g_VBoxGuestIDC
676 times VBGOS2IDC_size db 0
677
678;;
679; This must be present, we've got fixups against it.
680segment DATA32
681g_pfnDos16Write:
682 dd DOS16WRITE ; flat
683
684
685
686
687
688
689
690;
691;
692; 16-bit entry point thunking.
693; 16-bit entry point thunking.
694; 16-bit entry point thunking.
695;
696;
697segment CODE16
698
699
700;;
701; @cproto int FS_ALLOCATEPAGESPACE(PSFFSI psffsi, PVBOXSFFSD psffsd, ULONG cb, USHORT cbWantContig)
702VBOXSF_EP16_BEGIN FS_ALLOCATEPAGESPACE, 'FS_ALLOCATEPAGESPACE'
703VBOXSF_TO_32 FS_ALLOCATEPAGESPACE, 4*4
704 movzx ecx, word [ebp + 08h] ; cbWantContig
705 mov [esp + 3*4], ecx
706 mov edx, [ebp + 0ah] ; cb
707 mov [esp + 2*4], edx
708 ;VBOXSF_PSFFSD_2_FLAT 0eh, 1*4 ; psffsd
709 VBOXSF_FARPTR_2_FLAT 0eh, 1*4 ; psffsd
710 VBOXSF_FARPTR_2_FLAT 12h, 0*4 ; psffsi
711 call NAME(FS32_ALLOCATEPAGESPACE)
712VBOXSF_TO_16 FS_ALLOCATEPAGESPACE
713 retf 0eh
714VBOXSF_EP16_END FS_ALLOCATEPAGESPACE
715
716;;
717; @cproto int FS_ATTACH(USHORT flag, PCSZ pszDev, PVPFSD pvpfsd, PCDFSD pcdfsd, PBYTE pszParm, PUSHORT pcbParm)
718;
719VBOXSF_EP16_BEGIN FS_ATTACH, 'FS_ATTACH'
720 ;
721 ; Initialized ring-0 yet? (this is a likely first entry point)
722 ;
723 push ds
724 mov ax, DATA16
725 mov ds, ax
726 test byte [NAME(g_fDoneRing0)], 1
727 jnz .DoneRing0
728 call NAME(VBoxSFR0Init16Bit)
729.DoneRing0:
730 pop ds
731
732VBOXSF_TO_32 FS_ATTACH, 6*4
733 VBOXSF_FARPTR_2_FLAT 08h, 5*4 ; pcbParm
734 VBOXSF_FARPTR_2_FLAT 0ch, 4*4 ; pszParm
735 VBOXSF_FARPTR_2_FLAT 10h, 3*4 ; pcdfsd
736 VBOXSF_FARPTR_2_FLAT 14h, 2*4 ; pvpfsd
737 VBOXSF_FARPTR_2_FLAT 18h, 1*4 ; pszDev
738 movzx ecx, word [ebp + 1ch] ; fFlag
739 mov [esp], ecx
740 call NAME(FS32_ATTACH)
741VBOXSF_TO_16 FS_ATTACH
742 retf 16h
743VBOXSF_EP16_END FS_ATTACH
744
745
746;;
747; @cproto int FS_CANCELLOCKREQUEST(PSFFSI psffsi, PVBOXSFFSD psffsd, struct filelock far *pLockRange)
748VBOXSF_EP16_BEGIN FS_CANCELLOCKREQUEST, 'FS_CANCELLOCKREQUEST'
749VBOXSF_TO_32 FS_CANCELLOCKREQUEST, 3*4
750 VBOXSF_FARPTR_2_FLAT 08h, 2*4 ; pLockRange
751 ;VBOXSF_PSFFSD_2_FLAT 0ch, 1*4 ; psffsd
752 VBOXSF_FARPTR_2_FLAT 0ch, 1*4 ; psffsd
753 VBOXSF_FARPTR_2_FLAT 10h, 0*4 ; psffsi
754 call NAME(FS32_CANCELLOCKREQUEST)
755VBOXSF_TO_16 FS_CANCELLOCKREQUEST
756 retf 0ch
757VBOXSF_EP16_END FS_CANCELLOCKREQUEST
758
759
760;;
761; @cproto int FS_CANCELLOCKREQUESTL(PSFFSI psffsi, PVBOXSFFSD psffsd, struct filelockl far *pLockRange)
762VBOXSF_EP16_BEGIN FS_CANCELLOCKREQUESTL, 'FS_CANCELLOCKREQUESTL'
763VBOXSF_TO_32 FS_CANCELLOCKREQUESTL, 3*4
764 VBOXSF_FARPTR_2_FLAT 08h, 2*4 ; pLockRange
765 ;VBOXSF_PSFFSD_2_FLAT 0ch, 1*4 ; psffsd
766 VBOXSF_FARPTR_2_FLAT 0ch, 1*4 ; psffsd
767 VBOXSF_FARPTR_2_FLAT 10h, 0*4 ; psffsi
768 call NAME(FS32_CANCELLOCKREQUESTL)
769VBOXSF_TO_16 FS_CANCELLOCKREQUESTL
770 retf 0ch
771VBOXSF_EP16_END FS_CANCELLOCKREQUESTL
772
773
774;;
775; @cproto int FS_CHDIR(USHORT flag, PCDFSI pcdfsi, PVBOXSFCD pcdfsd, PCSZ pszDir, USHORT iCurDirEnd)
776VBOXSF_EP16_BEGIN FS_CHDIR, 'FS_CHDIR'
777VBOXSF_TO_32 FS_CHDIR, 5*4
778 movzx ecx, word [ebp + 08h] ; iCurDirEnd
779 mov [esp + 4*4], ecx
780 VBOXSF_FARPTR_2_FLAT 0ah, 3*4 ; pszDir
781 VBOXSF_FARPTR_2_FLAT 0eh, 2*4 ; pcdfsd (use slow thunk here, see flag)
782 VBOXSF_FARPTR_2_FLAT 12h, 1*4 ; pcdfsi
783 movzx eax, word [ebp + 16h] ; flag
784 mov [esp], eax
785 call NAME(FS32_CHDIR)
786VBOXSF_TO_16 FS_CHDIR
787 retf 10h
788VBOXSF_EP16_END FS_CHDIR
789
790
791; @cproto int FS_CHGFILEPTR(PSFFSI psffsi, PVBOXSFFSD psffsd, LONG off, USHORT usMethod, USHORT IOflag)
792VBOXSF_EP16_BEGIN FS_CHGFILEPTR, 'FS_CHGFILEPTR'
793VBOXSF_TO_32 FS_CHGFILEPTR, 6*4
794 movzx ecx, word [ebp + 08h] ; IOflag
795 mov [esp + 5*4], ecx
796 movzx edx, word [ebp + 0ah] ; usMethod
797 mov [esp + 4*4], edx
798 mov eax, [ebp + 0ch] ; off
799 mov [esp + 2*4], eax
800 rol eax, 1 ; high dword - is there a better way than this?
801 and eax, 1
802 mov edx, 0ffffffffh
803 mul edx
804 mov [esp + 3*4], eax
805 ;VBOXSF_PSFFSD_2_FLAT 10h, 1*4 ; psffsd
806 VBOXSF_FARPTR_2_FLAT 10h, 1*4 ; psffsd
807 VBOXSF_FARPTR_2_FLAT 14h, 0*4 ; psffsi
808 call FS32_CHGFILEPTRL
809VBOXSF_TO_16 FS_CHGFILEPTR
810 retf 10h
811VBOXSF_EP16_END FS_CHGFILEPTR
812
813
814;;
815; @cproto int FS_CLOSE(USHORT type, USHORT IOflag, PSFFSI psffsi, PVBOXSFFSD psffsd)
816;
817VBOXSF_EP16_BEGIN FS_CLOSE, 'FS_CLOSE'
818VBOXSF_TO_32 FS_CLOSE, 4*4
819 ;VBOXSF_PSFFSD_2_FLAT 08h, 3*4 ; psffsd
820 VBOXSF_FARPTR_2_FLAT 08h, 3*4 ; psffsd
821 VBOXSF_FARPTR_2_FLAT 0ch, 2*4 ; psffsi
822 movzx ecx, word [ebp + 10h] ; IOflag
823 mov [esp + 1*4], ecx
824 movzx edx, word [ebp + 12h] ; type
825 mov [esp], edx
826 call NAME(FS32_CLOSE)
827VBOXSF_TO_16 FS_CLOSE
828 retf 0ch
829VBOXSF_EP16_END FS_CLOSE
830
831
832;;
833; @cproto int FS_COMMIT(USHORT type, USHORT IOflag, PSFFSI psffsi, PVBOXSFFSD psffsd)
834;
835VBOXSF_EP16_BEGIN FS_COMMIT, 'FS_COMMIT'
836VBOXSF_TO_32 FS_COMMIT, 4*4
837 ;VBOXSF_PSFFSD_2_FLAT 08h, 3*4 ; psffsd
838 VBOXSF_FARPTR_2_FLAT 08h, 3*4 ; psffsd
839 VBOXSF_FARPTR_2_FLAT 0ch, 2*4 ; psffsi
840 movzx ecx, word [ebp + 10h] ; IOflag
841 mov [esp + 1*4], ecx
842 movzx edx, word [ebp + 12h] ; type
843 mov [esp], edx
844 call NAME(FS32_COMMIT)
845VBOXSF_TO_16 FS_COMMIT
846 retf 0ch
847VBOXSF_EP16_END FS_COMMIT
848
849;;
850; @cproto int FS_COPY(USHORT flag, PCDFSI pcdfsi, PVBOXSFCD pcdfsd, PCSZ pszSrc, USHORT iSrcCurDirEnd
851; PCSZ pszDst, USHORT iDstCurDirEnd, USHORT nameType);
852VBOXSF_EP16_BEGIN FS_COPY, 'FS_COPY'
853VBOXSF_TO_32 FS_COPY, 8*4
854 movzx ecx, word [ebp + 08h] ; flag
855 mov [esp + 7*4], ecx
856 movzx edx, word [ebp + 0ah] ; iDstCurDirEnd
857 mov [esp + 6*4], edx
858 VBOXSF_FARPTR_2_FLAT 0ch, 5*4 ; pszDst
859 movzx eax, word [ebp + 10h] ; iSrcCurDirEnd
860 mov [esp + 4*4], eax
861 VBOXSF_FARPTR_2_FLAT 12h, 3*4 ; pszSrc
862 ;VBOXSF_PCDFSD_2_FLAT 16h, 2*4 ; psffsd
863 VBOXSF_FARPTR_2_FLAT 16h, 2*4 ; psffsd
864 VBOXSF_FARPTR_2_FLAT 1ah, 1*4 ; psffsi
865 movzx ecx, word [ebp + 1eh] ; flag
866 mov [esp], ecx
867 call NAME(FS32_COPY)
868VBOXSF_TO_16 FS_COPY
869 retf 18h
870VBOXSF_EP16_END FS_COPY
871
872
873;;
874; @cproto int FS_DELETE(PCDFSI pcdfsi, PVBOXSFCD pcdfsd, PCSZ pszFile, USHORT iCurDirEnd);
875VBOXSF_EP16_BEGIN FS_DELETE, 'FS_DELETE'
876VBOXSF_TO_32 FS_DELETE, 4*4
877 movzx ecx, word [ebp + 08h] ; iCurDirEnd
878 mov [esp + 3*4], ecx
879 VBOXSF_FARPTR_2_FLAT 0ah, 2*4 ; pszFile
880 ;VBOXSF_PCDFSD_2_FLAT 0eh, 1*4 ; pcdfsd
881 VBOXSF_FARPTR_2_FLAT 0eh, 1*4 ; pcdfsd
882 VBOXSF_FARPTR_2_FLAT 12h, 0*4 ; pcdfsi
883 call NAME(FS32_DELETE)
884VBOXSF_TO_16 FS_DELETE
885 retf 0eh
886VBOXSF_EP16_END FS_DELETE
887
888
889;;
890; @cproto int FS_DOPAGEIO(PSFFSI psffsi, PVBOXSFFSD psffsd, struct PageCmdHeader far *pList)
891VBOXSF_EP16_BEGIN FS_DOPAGEIO, 'FS_DOPAGEIO'
892VBOXSF_TO_32 FS_DOPAGEIO, 3*4
893 VBOXSF_FARPTR_2_FLAT 08h, 2*4 ; pList
894 ;VBOXSF_PSFFSD_2_FLAT 0ch, 1*4 ; psffsd
895 VBOXSF_FARPTR_2_FLAT 0ch, 1*4 ; psffsd
896 VBOXSF_FARPTR_2_FLAT 10h, 0*4 ; psffsi
897 call NAME(FS32_DOPAGEIO)
898VBOXSF_TO_16 FS_DOPAGEIO
899 retf 0ch
900VBOXSF_EP16_END FS_DOPAGEIO
901
902;;
903; @cproto void FS_EXIT(USHORT uid, USHORT pid, USHORT pdb)
904VBOXSF_EP16_BEGIN FS_EXIT, 'FS_EXIT'
905 ;
906 ; Initialized ring-0 yet? (this is a likely first entry point)
907 ;
908 push ds
909 mov ax, DATA16
910 mov ds, ax
911 test byte [NAME(g_fDoneRing0)], 1
912 jnz .DoneRing0
913 call NAME(VBoxSFR0Init16Bit)
914.DoneRing0:
915 pop ds
916
917VBOXSF_TO_32 FS_EXIT, 3*4
918 movzx ecx, word [ebp + 08h] ; pdb
919 mov [esp + 2*4], ecx
920 movzx edx, word [ebp + 0ah] ; pib
921 mov [esp + 1*4], edx
922 movzx eax, word [ebp + 0ch] ; uid
923 mov [esp], eax
924 call NAME(FS32_EXIT)
925VBOXSF_TO_16 FS_EXIT
926 retf 6h
927VBOXSF_EP16_END FS_EXIT
928
929
930;;
931; @cproto int FS_FILEATTRIBUTE(USHORT flag, PCDFSI pcdfsi, PVBOXSFCD pcdfsd, PCSZ pszName, USHORT iCurDirEnd, PUSHORT pAttr);
932;
933VBOXSF_EP16_BEGIN FS_FILEATTRIBUTE, 'FS_FILEATTRIBUTE'
934VBOXSF_TO_32 FS_FILEATTRIBUTE, 6*4
935 VBOXSF_FARPTR_2_FLAT 08h, 5*4 ; pAttr
936 movzx ecx, word [ebp + 0ch] ; iCurDirEnd
937 mov [esp + 4*4], ecx
938 VBOXSF_FARPTR_2_FLAT 0eh, 3*4 ; pszName
939 ;VBOXSF_PCDFSD_2_FLAT 12h, 2*4 ; pcdfsd
940 VBOXSF_FARPTR_2_FLAT 12h, 2*4 ; pcdfsd
941 VBOXSF_FARPTR_2_FLAT 16h, 1*4 ; pcdfsi
942 movzx edx, word [ebp + 1ah] ; flag
943 mov [esp], edx
944 call NAME(FS32_FILEATTRIBUTE)
945VBOXSF_TO_16 FS_FILEATTRIBUTE
946 retf 14h
947VBOXSF_EP16_END FS_FILEATTRIBUTE
948
949
950;;
951; @cproto int FS_FILEINFO(USHORT flag, PSFFSI psffsi, PVBOXSFFSD psffsd, USHORT level,
952; PBYTE pData, USHORT cbData, USHORT IOflag);
953VBOXSF_EP16_BEGIN FS_FILEINFO, 'FS_FILEINFO'
954VBOXSF_TO_32 FS_FILEINFO, 7*4
955 movzx ecx, word [ebp + 08h] ; IOflag
956 mov [esp + 6*4], ecx
957 movzx edx, word [ebp + 0ah] ; cbData
958 mov [esp + 5*4], edx
959 VBOXSF_FARPTR_2_FLAT 0ch, 4*4 ; pData
960 movzx eax, word [ebp + 10h] ; level
961 mov [esp + 3*4], eax
962 ;VBOXSF_PSFFSD_2_FLAT 12h, 2*4 ; psffsd
963 VBOXSF_FARPTR_2_FLAT 12h, 2*4 ; psffsd
964 VBOXSF_FARPTR_2_FLAT 16h, 1*4 ; psffsi
965 movzx ecx, word [ebp + 1ah] ; flag
966 mov [esp], ecx
967 call NAME(FS32_FILEINFO)
968VBOXSF_TO_16 FS_FILEINFO
969 retf 14h
970VBOXSF_EP16_END FS_FILEINFO
971
972
973;;
974; @cproto int FS_FILEIO(PSFFSI psffsi, PVBOXSFFSD psffsd, PBYTE pCmdList, USHORT cbCmdList,
975; PUSHORT poError, USHORT IOflag);
976VBOXSF_EP16_BEGIN FS_FILEIO, 'FS_FILEIO'
977VBOXSF_TO_32 FS_FILEIO, 6*4
978 movzx ecx, word [ebp + 08h] ; IOFlag
979 mov [esp + 5*4], ecx
980 VBOXSF_FARPTR_2_FLAT 0ah, 4*4 ; poError
981 movzx edx, word [ebp + 0eh] ; cbCmdList
982 mov [esp + 3*4], edx
983 VBOXSF_FARPTR_2_FLAT 10h, 2*4 ; pCmdList
984 ;VBOXSF_PSFFSD_2_FLAT 14h, 1*4 ; psffsd
985 VBOXSF_FARPTR_2_FLAT 14h, 1*4 ; psffsd
986 VBOXSF_FARPTR_2_FLAT 18h, 0*4 ; psffsi
987 call NAME(FS32_FILEIO)
988VBOXSF_TO_16 FS_FILEIO
989 retf 14h
990VBOXSF_EP16_END FS_FILEIO
991
992
993;;
994; @cproto int FS_FILELOCKS(PSFFSI psffsi, PVBOXSFFSD psffsd, struct filelock far *pUnLockRange
995; struct filelock far *pLockRange, ULONG timeout, ULONG flags)
996VBOXSF_EP16_BEGIN FS_FILELOCKS, 'FS_FILELOCKS'
997VBOXSF_TO_32 FS_FILELOCKS, 6*4
998 mov ecx, [ebp + 08h] ; flags
999 mov [esp + 5*4], ecx
1000 mov edx, [ebp + 0ch] ; timeout
1001 mov [esp + 4*4], edx
1002 VBOXSF_FARPTR_2_FLAT 10h, 3*4 ; pLockRange
1003 VBOXSF_FARPTR_2_FLAT 14h, 2*4 ; pUnLockRange
1004 ;VBOXSF_PSFFSD_2_FLAT 18h, 1*4 ; psffsd
1005 VBOXSF_FARPTR_2_FLAT 18h, 1*4 ; psffsd
1006 VBOXSF_FARPTR_2_FLAT 1ch, 0*4 ; psffsi
1007 call NAME(FS32_FILELOCKS)
1008VBOXSF_TO_16 FS_FILELOCKS
1009 retf 18h
1010VBOXSF_EP16_END FS_FILELOCKS
1011
1012
1013;;
1014; @cproto int FS_FILELOCKSL(PSFFSI psffsi, PVBOXSFFSD psffsd, struct filelockl far *pUnLockRange
1015; struct filelockl far *pLockRange, ULONG timeout, ULONG flags)
1016VBOXSF_EP16_BEGIN FS_FILELOCKSL, 'FS_FILELOCKSL'
1017VBOXSF_TO_32 FS_FILELOCKSL, 6*4
1018 mov ecx, [ebp + 08h] ; flags
1019 mov [esp + 5*4], ecx
1020 mov edx, [ebp + 0ch] ; timeout
1021 mov [esp + 4*4], edx
1022 VBOXSF_FARPTR_2_FLAT 10h, 3*4 ; pLockRange
1023 VBOXSF_FARPTR_2_FLAT 14h, 2*4 ; pUnLockRange
1024 ;VBOXSF_PSFFSD_2_FLAT 18h, 1*4 ; psffsd
1025 VBOXSF_FARPTR_2_FLAT 18h, 1*4 ; psffsd
1026 VBOXSF_FARPTR_2_FLAT 1ch, 0*4 ; psffsi
1027 call NAME(FS32_FILELOCKS)
1028VBOXSF_TO_16 FS_FILELOCKSL
1029 retf 18h
1030VBOXSF_EP16_END FS_FILELOCKSL
1031
1032
1033;;
1034; @cproto int FS_FINDCLOSE(PFSFSI pfsfsi, PVBOXSFFS pfsfsd);
1035;
1036VBOXSF_EP16_BEGIN FS_FINDCLOSE, 'FS_FINDCLOSE'
1037VBOXSF_TO_32 FS_FINDCLOSE, 2*4
1038 ;VBOXSF_PFSFSD_2_FLAT 08h, 1*4 ; pfsfsd
1039 VBOXSF_FARPTR_2_FLAT 08h, 1*4 ; pfsfsd
1040 VBOXSF_FARPTR_2_FLAT 0ch, 0*4 ; pfsfsi
1041 call NAME(FS32_FINDCLOSE)
1042VBOXSF_TO_16 FS_FINDCLOSE
1043 retf 8h
1044VBOXSF_EP16_END FS_FINDCLOSE
1045
1046
1047;;
1048; @cproto int FS_FINDFIRST(PCDFSI pcdfsi, PVBOXSFCD pcdfsd, PCSZ pszName, USHORT iCurDirEnd, USHORT attr,
1049; PFSFSI pfsfsi, PVBOXSFFS pfsfsd, PBYTE pbData, USHORT cbData, PUSHORT pcMatch,
1050; USHORT level, USHORT flags);
1051;
1052VBOXSF_EP16_BEGIN FS_FINDFIRST, 'FS_FINDFIRST'
1053VBOXSF_TO_32 FS_FINDFIRST, 12*4
1054 movzx ecx, word [ebp + 08h] ; flags
1055 mov [esp + 11*4], ecx
1056 movzx edx, word [ebp + 0ah] ; level
1057 mov [esp + 10*4], edx
1058 VBOXSF_FARPTR_2_FLAT 0ch, 9*4 ; pcMatch
1059 movzx eax, word [ebp + 10h] ; cbData
1060 mov [esp + 8*4], eax
1061 VBOXSF_FARPTR_2_FLAT 12h, 7*4 ; pbData
1062 VBOXSF_FARPTR_2_FLAT 16h, 6*4 ; pfsfsd
1063 VBOXSF_FARPTR_2_FLAT 1ah, 5*4 ; pfsfsi
1064 movzx ecx, word [ebp + 1eh] ; attr
1065 mov [esp + 4*4], ecx
1066 movzx edx, word [ebp + 20h] ; iCurDirEnd
1067 mov [esp + 3*4], edx
1068 VBOXSF_FARPTR_2_FLAT 22h, 2*4 ; pszName
1069 ;VBOXSF_PCDFSD_2_FLAT 26h, 1*4 ; pcdfsd
1070 VBOXSF_FARPTR_2_FLAT 26h, 1*4 ; pcdfsd
1071 VBOXSF_FARPTR_2_FLAT 2ah, 0*4 ; pcdfsi
1072 call NAME(FS32_FINDFIRST)
1073VBOXSF_TO_16 FS_FINDFIRST
1074 retf 26h
1075VBOXSF_EP16_END FS_FINDFIRST
1076
1077
1078;;
1079; @cproto int FS_FINDFROMNAME(PFSFSI pfsfsi, PVBOXSFFS pfsfsd, PBYTE pbData, USHORT cbData, PUSHORT pcMatch,
1080; USHORT level, ULONG position, PCSZ pszName, USHORT flag)
1081;
1082VBOXSF_EP16_BEGIN FS_FINDFROMNAME, 'FS_FINDFROMNAME'
1083VBOXSF_TO_32 FS_FINDFROMNAME, 9*4
1084 movzx ecx, word [ebp + 08h] ; flags
1085 mov [esp + 8*4], ecx
1086 VBOXSF_FARPTR_2_FLAT 0ah, 7*4 ; pszName
1087 mov edx, [ebp + 0eh] ; position
1088 mov [esp + 6*4], edx
1089 movzx eax, word [ebp + 12h] ; level
1090 mov [esp + 5*4], eax
1091 VBOXSF_FARPTR_2_FLAT 14h, 4*4 ; pcMatch
1092 movzx eax, word [ebp + 18h] ; cbData
1093 mov [esp + 3*4], eax
1094 VBOXSF_FARPTR_2_FLAT 1ah, 2*4 ; pbData
1095 ;VBOXSF_PFSFSD_2_FLAT 1eh, 1*4 ; pfsfsd
1096 VBOXSF_FARPTR_2_FLAT 1eh, 1*4 ; pfsfsd
1097 VBOXSF_FARPTR_2_FLAT 22h, 0*4 ; pfsfsi
1098 call NAME(FS32_FINDFROMNAME)
1099VBOXSF_TO_16 FS_FINDFROMNAME
1100 retf 1eh
1101VBOXSF_EP16_END FS_FINDFROMNAME
1102
1103
1104;;
1105; @cproto int FS_FINDNEXT(PFSFSI pfsfsi, PVBOXSFFS pfsfsd, PBYTE pbData, USHORT cbData, PUSHORT pcMatch,
1106; USHORT level, USHORT flag)
1107;
1108VBOXSF_EP16_BEGIN FS_FINDNEXT, 'FS_FINDNEXT'
1109VBOXSF_TO_32 FS_FINDNEXT, 7*4
1110 movzx ecx, word [ebp + 08h] ; flags
1111 mov [esp + 6*4], ecx
1112 movzx eax, word [ebp + 0ah] ; level
1113 mov [esp + 5*4], eax
1114 VBOXSF_FARPTR_2_FLAT 0ch, 4*4 ; pcMatch
1115 movzx eax, word [ebp + 10h] ; cbData
1116 mov [esp + 3*4], eax
1117 VBOXSF_FARPTR_2_FLAT 12h, 2*4 ; pbData
1118 ;VBOXSF_PFSFSD_2_FLAT 16h, 1*4 ; pfsfsd
1119 VBOXSF_FARPTR_2_FLAT 16h, 1*4 ; pfsfsd
1120 VBOXSF_FARPTR_2_FLAT 1ah, 0*4 ; pfsfsi
1121 call NAME(FS32_FINDNEXT)
1122VBOXSF_TO_16 FS_FINDNEXT
1123 retf 16h
1124VBOXSF_EP16_END FS_FINDNEXT
1125
1126
1127;;
1128; @cproto int FS_FINDNOTIFYCLOSE(USHORT handle);
1129;
1130VBOXSF_EP16_BEGIN FS_FINDNOTIFYCLOSE, 'FS_FINDNOTIFYCLOSE'
1131VBOXSF_TO_32 FS_FINDNOTIFYCLOSE, 1*4
1132 movzx ecx, word [ebp + 08h] ; handle
1133 mov [esp], ecx
1134 call NAME(FS32_FINDNOTIFYCLOSE)
1135VBOXSF_TO_16 FS_FINDNOTIFYCLOSE
1136 retf 2h
1137VBOXSF_EP16_END FS_FINDNOTIFYCLOSE
1138
1139
1140;;
1141; @cproto int FS_FINDNOTIFYFIRST(PCDFSI pcdfsi, PVBOXSFCD pcdfsd, PCSZ pszName, USHORT iCurDirEnd, USHORT attr,
1142; PUSHORT pHandle, PBYTE pbData, USHORT cbData, PUSHORT pcMatch,
1143; USHORT level, USHORT flags);
1144;
1145VBOXSF_EP16_BEGIN FS_FINDNOTIFYFIRST, 'FS_FINDNOTIFYFIRST'
1146VBOXSF_TO_32 FS_FINDNOTIFYFIRST, 11*4
1147 movzx ecx, word [ebp + 08h] ; flags
1148 mov [esp + 10*4], ecx
1149 movzx edx, word [ebp + 0ah] ; level
1150 mov [esp + 9*4], edx
1151 VBOXSF_FARPTR_2_FLAT 0ch, 8*4 ; pcMatch
1152 movzx eax, word [ebp + 10h] ; cbData
1153 mov [esp + 7*4], eax
1154 VBOXSF_FARPTR_2_FLAT 12h, 6*4 ; pbData
1155 VBOXSF_FARPTR_2_FLAT 16h, 5*4 ; pHandle
1156 movzx ecx, word [ebp + 1ah] ; attr
1157 mov [esp + 4*4], ecx
1158 movzx edx, word [ebp + 1ch] ; iCurDirEnd
1159 mov [esp + 3*4], edx
1160 VBOXSF_FARPTR_2_FLAT 1eh, 2*4 ; pszName
1161 ;VBOXSF_PCDFSD_2_FLAT 22h, 1*4 ; pcdfsd
1162 VBOXSF_FARPTR_2_FLAT 22h, 1*4 ; pcdfsd
1163 VBOXSF_FARPTR_2_FLAT 26h, 0*4 ; pcdfsi
1164 call NAME(FS32_FINDNOTIFYFIRST)
1165VBOXSF_TO_16 FS_FINDNOTIFYFIRST
1166 retf 22h
1167VBOXSF_EP16_END FS_FINDNOTIFYFIRST
1168
1169
1170;;
1171; @cproto int FS_FINDNOTIFYNEXT(USHORT handle, PBYTE pbData, USHORT cbData, PUSHORT pcMatch,
1172; USHORT level, ULONG timeout)
1173;
1174VBOXSF_EP16_BEGIN FS_FINDNOTIFYNEXT, 'FS_FINDNOTIFYNEXT'
1175VBOXSF_TO_32 FS_FINDNOTIFYNEXT, 6*4
1176 mov ecx, [ebp + 08h] ; timeout
1177 mov [esp + 5*4], ecx
1178 movzx edx, word [ebp + 0ch] ; level
1179 mov [esp + 4*4], edx
1180 VBOXSF_FARPTR_2_FLAT 0eh, 3*4 ; pcMatch
1181 movzx eax, word [ebp + 12h] ; cbData
1182 mov [esp + 2*4], eax
1183 VBOXSF_FARPTR_2_FLAT 14h, 1*4 ; pbData
1184 movzx ecx, word [ebp + 18h] ; handle
1185 mov [esp], ecx
1186 call NAME(FS32_FINDNOTIFYNEXT)
1187VBOXSF_TO_16 FS_FINDNOTIFYNEXT
1188 retf 12h
1189VBOXSF_EP16_END FS_FINDNOTIFYNEXT
1190
1191
1192;; @cproto int FS_FLUSHBUF(USHORT hVPB, USHORT flag);
1193VBOXSF_EP16_BEGIN FS_FLUSHBUF, 'FS_FLUSHBUF'
1194VBOXSF_TO_32 FS_FLUSHBUF, 2*4
1195 movzx edx, word [ebp + 08h] ; flag
1196 mov [esp + 1*4], edx
1197 movzx eax, word [ebp + 0ch] ; hVPB
1198 mov [esp + 0*4], eax
1199 call NAME(FS32_FLUSHBUF)
1200VBOXSF_TO_16 FS_FLUSHBUF
1201 retf 4h
1202VBOXSF_EP16_END FS_FLUSHBUF
1203
1204
1205;; @cproto int FS_FSCTL(union argdat far *pArgdat, USHORT iArgType, USHORT func,
1206; PVOID pParm, USHORT lenParm, PUSHORT plenParmIO,
1207; PVOID pData, USHORT lenData, PUSHORT plenDataIO);
1208VBOXSF_EP16_BEGIN FS_FSCTL, 'FS_FSCTL'
1209 ;
1210 ; Initialized ring-0 yet? (this is a likely first entry point)
1211 ;
1212 push ds
1213 mov ax, DATA16
1214 mov ds, ax
1215 test byte [NAME(g_fDoneRing0)], 1
1216 jnz .DoneRing0
1217 call NAME(VBoxSFR0Init16Bit)
1218.DoneRing0:
1219 pop ds
1220
1221VBOXSF_TO_32 FS_FSCTL, 9*4
1222 VBOXSF_FARPTR_2_FLAT 08h, 8*4 ; plenDataIO
1223 movzx ecx, word [ebp + 0ch] ; lenData
1224 mov [esp + 7*4], ecx
1225 VBOXSF_FARPTR_2_FLAT 0eh, 6*4 ; pData
1226 VBOXSF_FARPTR_2_FLAT 12h, 5*4 ; plenDataIO
1227 movzx ecx, word [ebp + 16h] ; lenData
1228 mov [esp + 4*4], ecx
1229 VBOXSF_FARPTR_2_FLAT 18h, 3*4 ; pData
1230 movzx edx, word [ebp + 1ch] ; func
1231 mov [esp + 2*4], edx
1232 movzx eax, word [ebp + 1eh] ; iArgType
1233 mov [esp + 1*4], eax
1234 VBOXSF_FARPTR_2_FLAT 20h, 0*4 ; pArgdat
1235 call NAME(FS32_FSCTL)
1236VBOXSF_TO_16 FS_FSCTL
1237 retf 1ch
1238VBOXSF_EP16_END FS_FSCTL
1239
1240
1241;; @cproto int FS_FSINFO(USHORT flag, USHORT hVPB, PBYTE pbData, USHORT cbData, USHORT level)
1242VBOXSF_EP16_BEGIN FS_FSINFO, 'FS_FSINFO'
1243VBOXSF_TO_32 FS_FSINFO, 5*4
1244 movzx ecx, word [ebp + 08h] ; level
1245 mov [esp + 4*4], ecx
1246 movzx edx, word [ebp + 0ah] ; cbData
1247 mov [esp + 3*4], edx
1248 VBOXSF_FARPTR_2_FLAT 0ch, 2*4 ; pbData
1249 movzx edx, word [ebp + 10h] ; hVPB
1250 mov [esp + 1*4], edx
1251 movzx eax, word [ebp + 12h] ; flag
1252 mov [esp + 0*4], eax
1253 call NAME(FS32_FSINFO)
1254VBOXSF_TO_16 FS_FSINFO
1255 retf 14h
1256VBOXSF_EP16_END FS_FSINFO
1257
1258
1259;;
1260; @cproto int FS_IOCTL(PSFFSI psffsi, PVBOXSFFSD psffsd, USHORT cat, USHORT func,
1261; PVOID pParm, USHORT lenParm, PUSHORT plenParmIO,
1262; PVOID pData, USHORT lenData, PUSHORT plenDataIO);
1263VBOXSF_EP16_BEGIN FS_IOCTL, 'FS_IOCTL'
1264VBOXSF_TO_32 FS_IOCTL, 10*4
1265 VBOXSF_FARPTR_2_FLAT 08h, 9*4 ; plenDataIO
1266 movzx ecx, word [ebp + 0ch] ; lenData
1267 mov [esp + 8*4], ecx
1268 VBOXSF_FARPTR_2_FLAT 0eh, 7*4 ; pData
1269 VBOXSF_FARPTR_2_FLAT 12h, 6*4 ; plenDataIO
1270 movzx ecx, word [ebp + 16h] ; lenData
1271 mov [esp + 5*4], ecx
1272 VBOXSF_FARPTR_2_FLAT 18h, 4*4 ; pData
1273 movzx edx, word [ebp + 1ch] ; cat
1274 mov [esp + 3*4], edx
1275 movzx eax, word [ebp + 1eh] ; func
1276 mov [esp + 2*4], eax
1277 ;VBOXSF_PSFFSD_2_FLAT 20h, 1*4 ; psffsd
1278 VBOXSF_FARPTR_2_FLAT 20h, 1*4 ; psffsd
1279 VBOXSF_FARPTR_2_FLAT 24h, 0*4 ; pData
1280 call NAME(FS32_IOCTL)
1281VBOXSF_TO_16 FS_IOCTL
1282 retf 20h
1283VBOXSF_EP16_END FS_IOCTL
1284
1285
1286;;
1287; @cproto int FS_MKDIR(PCDFSI pcdfsi, PVBOXSFCD pcdfsd, PCSZ pszName, USHORT iCurDirEnd,
1288; PBYTE pEABuf, USHORT flag);
1289VBOXSF_EP16_BEGIN FS_MKDIR, 'FS_MKDIR'
1290VBOXSF_TO_32 FS_MKDIR, 6*4
1291 movzx ecx, word [ebp + 08h] ; flag
1292 mov [esp + 5*4], ecx
1293 VBOXSF_FARPTR_2_FLAT 0ah, 4*4 ; pEABuf
1294 movzx edx, word [ebp + 0eh] ; iCurDirEnd
1295 mov [esp + 3*4], edx
1296 VBOXSF_FARPTR_2_FLAT 10h, 2*4 ; pszName
1297 ;VBOXSF_PCDFSD_2_FLAT 14h, 1*4 ; pcdfsd
1298 VBOXSF_FARPTR_2_FLAT 14h, 1*4 ; pcdfsd
1299 VBOXSF_FARPTR_2_FLAT 18h, 0*4 ; pcdfsi
1300 call NAME(FS32_MKDIR)
1301VBOXSF_TO_16 FS_MKDIR
1302 retf 14h
1303VBOXSF_EP16_END FS_MKDIR
1304
1305
1306;;
1307; @cproto int FS_MOUNT(USHORT flag, PVPFSI pvpfsi, PVBOXSFVP pvpfsd, USHORT hVPB, PCSZ pszBoot)
1308VBOXSF_EP16_BEGIN FS_MOUNT, 'FS_MOUNT'
1309 ;
1310 ; Initialized ring-0 yet? (this is a likely first entry point)
1311 ;
1312 push ds
1313 mov ax, DATA16
1314 mov ds, ax
1315 test byte [NAME(g_fDoneRing0)], 1
1316 jnz .DoneRing0
1317 call NAME(VBoxSFR0Init16Bit)
1318.DoneRing0:
1319 pop ds
1320
1321VBOXSF_TO_32 FS_MOUNT, 5*4
1322 VBOXSF_FARPTR_2_FLAT 08h, 4*4 ; pszBoot
1323 movzx ecx, word [ebp + 0ch] ; hVPB
1324 mov [esp + 3*4], ecx
1325 VBOXSF_FARPTR_2_FLAT 0eh, 2*4 ; pvpfsd
1326 VBOXSF_FARPTR_2_FLAT 12h, 1*4 ; pvpfsi
1327 movzx ecx, word [ebp + 16h] ; flag
1328 mov [esp], ecx
1329 call NAME(FS32_MOUNT)
1330VBOXSF_TO_16 FS_MOUNT
1331 retf 10h
1332VBOXSF_EP16_END FS_MOUNT
1333
1334
1335;;
1336; @cproto int FS_MOVE(PCDFSI pcdfsi, PVBOXSFCD pcdfsd, PCSZ pszSrc, USHORT iSrcCurDirEnd
1337; PCSZ pszDst, USHORT iDstCurDirEnd, USHORT type)
1338VBOXSF_EP16_BEGIN FS_MOVE, 'FS_MOVE'
1339VBOXSF_TO_32 FS_MOVE, 7*4
1340 movzx ecx, word [ebp + 08h] ; type
1341 mov [esp + 6*4], ecx
1342 movzx edx, word [ebp + 0ah] ; iDstCurDirEnd
1343 mov [esp + 5*4], edx
1344 VBOXSF_FARPTR_2_FLAT 0ch, 4*4 ; pszDst
1345 movzx eax, word [ebp + 10h] ; iSrcCurDirEnd
1346 mov [esp + 3*4], eax
1347 VBOXSF_FARPTR_2_FLAT 12h, 2*4 ; pszSrc
1348 ;VBOXSF_PCDFSD_2_FLAT 16h, 1*4 ; psffsd
1349 VBOXSF_FARPTR_2_FLAT 16h, 1*4 ; psffsd
1350 VBOXSF_FARPTR_2_FLAT 1ah, 0*4 ; psffsi
1351 call NAME(FS32_MOVE)
1352VBOXSF_TO_16 FS_MOVE
1353 retf 16h
1354VBOXSF_EP16_END FS_MOVE
1355
1356
1357;;
1358; @cproto int FS_NEWSIZE(PSFFSI psffsi, PVBOXSFFSD psffsd, ULONG cbFile, USHORT IOflag);
1359VBOXSF_EP16_BEGIN FS_NEWSIZE, 'FS_NEWSIZE'
1360VBOXSF_TO_32 FS_NEWSIZE, 5*4 ; thunking to longlong edition.
1361 movzx ecx, word [ebp + 08h] ; IOflag
1362 mov [esp + 4*4], ecx
1363 mov eax, [ebp + 0ah] ; cbFile (ULONG -> LONGLONG)
1364 mov dword [esp + 3*4], 0
1365 mov [esp + 2*4], eax
1366 ;VBOXSF_PSFFSD_2_FLAT 0eh, 1*4 ; psffsd
1367 VBOXSF_FARPTR_2_FLAT 0eh, 1*4 ; psffsd
1368 VBOXSF_FARPTR_2_FLAT 12h, 0*4 ; psffsi
1369 call NAME(FS32_NEWSIZEL)
1370VBOXSF_TO_16 FS_NEWSIZE
1371 retf 0eh
1372VBOXSF_EP16_END FS_NEWSIZE
1373
1374
1375;;
1376; @cproto int FS_NEWSIZEL(PSFFSI psffsi, PVBOXSFFSD psffsd, LONGLONG cbFile, USHORT IOflag);
1377VBOXSF_EP16_BEGIN FS_NEWSIZEL, 'FS_NEWSIZEL'
1378VBOXSF_TO_32 FS_NEWSIZEL, 5*4
1379 movzx ecx, word [ebp + 08h] ; IOflag
1380 mov [esp + 4*4], ecx
1381 mov eax, [ebp + 0ah] ; cbFile
1382 mov edx, [ebp + 0eh]
1383 mov [esp + 3*4], edx
1384 mov [esp + 2*4], eax
1385 ;VBOXSF_PSFFSD_2_FLAT 12h, 1*4 ; psffsd
1386 VBOXSF_FARPTR_2_FLAT 12h, 1*4 ; psffsd
1387 VBOXSF_FARPTR_2_FLAT 16h, 0*4 ; psffsi
1388 call NAME(FS32_NEWSIZEL)
1389VBOXSF_TO_16 FS_NEWSIZEL
1390 retf 12h
1391VBOXSF_EP16_END FS_NEWSIZEL
1392
1393
1394;;
1395; @cproto int FS_NMPIPE(PSFFSI psffsi, PVBOXSFFSD psffsd, USHORT OpType, union npoper far *pOpRec,
1396; PBYTE pData, PCSZ pszName);
1397VBOXSF_EP16_BEGIN FS_NMPIPE, 'FS_NMPIPE'
1398VBOXSF_TO_32 FS_NMPIPE, 6*4
1399 VBOXSF_FARPTR_2_FLAT 08h, 5*4 ; pszName
1400 VBOXSF_FARPTR_2_FLAT 0ch, 4*4 ; pData
1401 VBOXSF_FARPTR_2_FLAT 10h, 3*4 ; pOpRec
1402 movzx ecx, word [ebp + 14h] ; OpType
1403 mov [esp + 2*4], ecx
1404 VBOXSF_FARPTR_2_FLAT 16h, 1*4 ; psffsd (take care...)
1405 VBOXSF_FARPTR_2_FLAT 1ah, 0*4 ; psffsi
1406 call NAME(FS32_NMPIPE)
1407VBOXSF_TO_16 FS_NMPIPE
1408 retf 16h
1409VBOXSF_EP16_END FS_NMPIPE
1410
1411
1412;;
1413; @cproto int FS_OPENCREATE(PCDFSI pcdfsi, PVBOXSFCD pcdfsd, PCSZ pszName, USHORT iCurDirEnd,
1414; PSFFSI psffsi, PVBOXSFFSD psffsd, ULONG ulOpenMode, USHORT usOpenFlag,
1415; PUSHORT pusAction, USHORT usAttr, PBYTE pcEABuf, PUSHORT pfgenflag);
1416VBOXSF_EP16_BEGIN FS_OPENCREATE, 'FS_OPENCREATE'
1417VBOXSF_TO_32 FS_OPENCREATE, 12*4
1418 VBOXSF_FARPTR_2_FLAT 08h, 11*4 ; pfgenflag
1419 VBOXSF_FARPTR_2_FLAT 0ch, 10*4 ; pcEABuf
1420 movzx ecx, word [ebp + 10h] ; usAttr
1421 mov [esp + 9*4], ecx
1422 VBOXSF_FARPTR_2_FLAT 12h, 8*4 ; pusAction
1423 movzx edx, word [ebp + 16h] ; usOpenFlag
1424 mov [esp + 7*4], edx
1425 mov eax, [ebp + 18h] ; ulOpenMode
1426 mov [esp + 6*4], eax
1427 VBOXSF_FARPTR_2_FLAT 1ch, 5*4 ; psffsd (new, no short cuts)
1428 VBOXSF_FARPTR_2_FLAT 20h, 4*4 ; psffsi
1429 movzx ecx, word [ebp + 24h] ; iCurDirEnd
1430 mov [esp + 3*4], ecx
1431 VBOXSF_FARPTR_2_FLAT 26h, 2*4 ; pszName
1432 ;VBOXSF_PCDFSD_2_FLAT 2ah, 1*4 ; pcdfsd
1433 VBOXSF_FARPTR_2_FLAT 2ah, 1*4 ; pcdfsd
1434 VBOXSF_FARPTR_2_FLAT 2eh, 0*4 ; pcdfsi
1435 call NAME(FS32_OPENCREATE)
1436VBOXSF_TO_16 FS_OPENCREATE
1437 retf 42
1438VBOXSF_EP16_END FS_OPENCREATE
1439
1440
1441;;
1442; @cproto int FS_OPENPAGEFILE(PULONG pFlag, PULONG pcMaxReq, PCSZ pszName, PSFFSI psffsi, PVBOXSFFSD psffsd,
1443; USHORT ulOpenMode, USHORT usOpenFlag, USHORT usAttr, ULONG Reserved)
1444VBOXSF_EP16_BEGIN FS_OPENPAGEFILE, 'FS_OPENPAGEFILE'
1445VBOXSF_TO_32 FS_OPENPAGEFILE, 9*4
1446 mov ecx, [ebp + 08h] ; Reserved
1447 mov [esp + 8*4], ecx
1448 movzx edx, word [ebp + 0ch] ; usAttr
1449 mov [esp + 7*4], edx
1450 movzx eax, word [ebp + 0eh] ; usOpenFlag
1451 mov [esp + 6*4], eax
1452 movzx ecx, word [ebp + 10h] ; usOpenMode
1453 mov [esp + 5*4], ecx
1454 VBOXSF_FARPTR_2_FLAT 12h, 4*4 ; psffsd (new, no short cuts)
1455 VBOXSF_FARPTR_2_FLAT 16h, 3*4 ; psffsi
1456 VBOXSF_FARPTR_2_FLAT 1ah, 2*4 ; pszName
1457 VBOXSF_FARPTR_2_FLAT 1eh, 1*4 ; pcMaxReq
1458 VBOXSF_FARPTR_2_FLAT 22h, 0*4 ; pFlag
1459 call NAME(FS32_OPENPAGEFILE)
1460VBOXSF_TO_16 FS_OPENPAGEFILE
1461 retf 1eh
1462VBOXSF_EP16_END FS_OPENPAGEFILE
1463
1464
1465;;
1466; @cproto int FS_PATHINFO(USHORT flag, PCDFSI pcdfsi, PVBOXSFCD pcdfsd, PCSZ pszName, USHORT iCurDirEnt,
1467; USHORT level, PBYTE pData, USHORT cbData);
1468VBOXSF_EP16_BEGIN FS_PATHINFO, 'FS_PATHINFO'
1469VBOXSF_TO_32 FS_PATHINFO, 8*4
1470 movzx ecx, word [ebp + 08h] ; cbData
1471 mov [esp + 7*4], ecx
1472 VBOXSF_FARPTR_2_FLAT 0ah, 6*4 ; pData
1473 movzx edx, word [ebp + 0eh] ; level
1474 mov [esp + 5*4], edx
1475 movzx eax, word [ebp + 10h] ; iCurDirEnd
1476 mov [esp + 4*4], eax
1477 VBOXSF_FARPTR_2_FLAT 12h, 3*4 ; pszName
1478 ;VBOXSF_PCDFSD_2_FLAT 16h, 2*4 ; pcdfsd
1479 VBOXSF_FARPTR_2_FLAT 16h, 2*4 ; pcdfsd
1480 VBOXSF_FARPTR_2_FLAT 1ah, 1*4 ; pcdfsi
1481 movzx edx, word [ebp + 1eh] ; flag
1482 mov [esp], edx
1483 call NAME(FS32_PATHINFO)
1484VBOXSF_TO_16 FS_PATHINFO
1485 retf 18h
1486VBOXSF_EP16_END FS_PATHINFO
1487
1488
1489;; @cproto int FS_PROCESSNAME(PSZ pszName);
1490VBOXSF_EP16_BEGIN FS_PROCESSNAME, 'FS_PROCESSNAME'
1491VBOXSF_TO_32 FS_PROCESSNAME, 1*4
1492 VBOXSF_FARPTR_2_FLAT 08h, 0*4 ; pszName
1493 call NAME(FS32_PROCESSNAME)
1494VBOXSF_TO_16 FS_PROCESSNAME
1495 retf 4h
1496VBOXSF_EP16_END FS_PROCESSNAME
1497
1498
1499;;
1500; @cproto int FS_READ(PSFFSI psffsi, PVBOXSFFSD psffsd, PBYTE pbData, PUSHORT pcbData, USHORT IOflag)
1501VBOXSF_EP16_BEGIN FS_READ, 'FS_READ'
1502VBOXSF_TO_32 FS_READ, 6*4 ; extra local for ULONG cbDataTmp.
1503 push es
1504 movzx ecx, word [ebp + 08h] ; IOflag
1505 mov [esp + 4*4 + 2], ecx
1506 les dx, [ebp + 0ah] ; cbDataTmp = *pcbData;
1507 movzx edx, dx
1508 lea ecx, [esp + 5*4 + 2] ; pcbData = &cbDataTmp
1509 movzx eax, word [es:edx]
1510 mov [ecx], eax
1511 mov [esp + 3*4 + 2], ecx
1512 mov edx, DATA32
1513 mov es, edx
1514 VBOXSF_FARPTR_2_FLAT 0eh, 2*4 + 2 ; pbData
1515 ;VBOXSF_PSFFSD_2_FLAT 12h, 1*4 ; psffsd
1516 VBOXSF_FARPTR_2_FLAT 10h, 1*4 + 2 ; psffsd
1517 VBOXSF_FARPTR_2_FLAT 14h, 0*4 + 2 ; psffsi
1518 call FS32_READ
1519
1520 les dx, [ebp + 0ah] ; *pcbData = cbDataTmp;
1521 movzx edx, dx
1522 mov cx, [esp + 5*4 + 2]
1523 mov [es:edx], cx
1524 mov edx, DATA32
1525 mov es, edx
1526
1527VBOXSF_TO_16 FS_READ
1528
1529 pop es
1530 retf 12h
1531VBOXSF_EP16_END FS_READ
1532
1533
1534;;
1535; @cproto int FS_RMDIR(PCDFSI pcdfsi, PVBOXSFCD pcdfsd, PCSZ pszName, USHORT iCurDirEnd);
1536;
1537VBOXSF_EP16_BEGIN FS_RMDIR, 'FS_RMDIR'
1538VBOXSF_TO_32 FS_RMDIR, 4*4
1539 movzx edx, word [ebp + 08h] ; iCurDirEnd
1540 mov [esp + 3*4], edx
1541 VBOXSF_FARPTR_2_FLAT 0ah, 2*4 ; pszName
1542 ;VBOXSF_PCDFSD_2_FLAT 0eh, 1*4 ; pcdfsd
1543 VBOXSF_FARPTR_2_FLAT 0eh, 1*4 ; pcdfsd
1544 VBOXSF_FARPTR_2_FLAT 12h, 0*4 ; pcdfsi
1545 call NAME(FS32_RMDIR)
1546VBOXSF_TO_16 FS_RMDIR
1547 retf 14h
1548VBOXSF_EP16_END FS_RMDIR
1549
1550
1551;;
1552; @cproto int FS_SETSWAP(PSFFSI psffsi, PVBOXSFFSD psffsd);
1553;
1554VBOXSF_EP16_BEGIN FS_SETSWAP, 'FS_SETSWAP'
1555VBOXSF_TO_32 FS_SETSWAP, 2*4
1556 ;VBOXSF_PSFFSD_2_FLAT 08h, 1*4 ; psffsd
1557 VBOXSF_FARPTR_2_FLAT 08h, 1*4 ; psffsd
1558 VBOXSF_FARPTR_2_FLAT 0ch, 0*4 ; psffsi
1559 call NAME(FS32_SETSWAP)
1560VBOXSF_TO_16 FS_SETSWAP
1561 retf 8h
1562VBOXSF_EP16_END FS_SETSWAP
1563
1564
1565;;
1566; @cproto int FS_SHUTDOWN(USHORT type, ULONG reserved);
1567;
1568VBOXSF_EP16_BEGIN FS_SHUTDOWN, 'FS_SHUTDOWN'
1569VBOXSF_TO_32 FS_SHUTDOWN, 3*4
1570 mov ecx, [ebp + 08h] ; type
1571 mov [esp + 1*4], edx
1572 movzx edx, word [ebp + 0ah] ; reserved
1573 mov [esp], eax
1574 call NAME(FS32_SHUTDOWN)
1575VBOXSF_TO_16 FS_SHUTDOWN
1576 retf 6h
1577VBOXSF_EP16_END FS_SHUTDOWN
1578
1579
1580;;
1581; @cproto int FS_VERIFYUNCNAME(USHORT flag, PCSZ pszName)
1582;
1583VBOXSF_EP16_BEGIN FS_VERIFYUNCNAME, 'FS_VERIFYUNCNAME'
1584VBOXSF_TO_32 FS_VERIFYUNCNAME, 2*4
1585 VBOXSF_FARPTR_2_FLAT 08h, 1*4 ; pszName
1586 movzx edx, word [ebp + 0ch] ; flag
1587 mov [esp + 0*4], edx
1588 call NAME(FS32_VERIFYUNCNAME)
1589VBOXSF_TO_16 FS_VERIFYUNCNAME
1590 retf 6h
1591VBOXSF_EP16_END FS_VERIFYUNCNAME
1592
1593
1594;;
1595; @cproto int FS_WRITE(PSFFSI psffsi, PVBOXSFFSD psffsd, PBYTE pbData, PUSHORT pcbData, USHORT IOflag)
1596VBOXSF_EP16_BEGIN FS_WRITE, 'FS_WRITE'
1597VBOXSF_TO_32 FS_WRITE, 6*4 ; extra local for ULONG cbDataTmp.
1598 push es
1599 movzx ecx, word [ebp + 08h] ; IOflag
1600 mov [esp + 4*4 + 2], ecx
1601 les dx, [ebp + 0ah] ; cbDataTmp = *pcbData;
1602 movzx edx, dx
1603 lea ecx, [esp + 5*4 + 2] ; pcbData = &cbDataTmp
1604 movzx eax, word [es:edx]
1605 mov [ecx], eax
1606 mov [esp + 3*4 + 2], ecx
1607 mov edx, DATA32
1608 mov es, edx
1609 VBOXSF_FARPTR_2_FLAT 0ch, 2*4 + 2 ; pbData
1610 ;VBOXSF_PSFFSD_2_FLAT 12h, 1*4 ; psffsd
1611 VBOXSF_FARPTR_2_FLAT 10h, 1*4 + 2 ; psffsd
1612 VBOXSF_FARPTR_2_FLAT 14h, 0*4 + 2 ; psffsi
1613 call FS32_WRITE
1614
1615 les dx, [ebp + 0ah] ; *pcbData = cbDataTmp;
1616 movzx edx, dx
1617 mov cx, [esp + 5*4 + 2]
1618 mov [es:edx], cx
1619 mov edx, DATA32
1620 mov es, edx
1621
1622VBOXSF_TO_16 FS_WRITE
1623
1624 pop es
1625 retf 12h
1626VBOXSF_EP16_END FS_WRITE
1627
1628
1629
1630
1631
1632
1633;
1634;
1635; Init code starts here
1636; Init code starts here
1637; Init code starts here
1638;
1639;
1640
1641
1642;;
1643; Ring-3 Init (16-bit).
1644;
1645; @param pMiniFS [bp + 08h] The mini-FSD. (NULL)
1646; @param fpfnDevHlp [bp + 0ch] The address of the DevHlp router.
1647; @param pszCmdLine [bp + 10h] The config.sys command line.
1648;
1649VBOXSF_EP16_BEGIN FS_INIT, 'FS_INIT'
1650; DEBUG_STR16 'VBoxSF: FS_INIT - enter'
1651 push ebp
1652 mov ebp, esp
1653 push ds ; bp - 02h
1654 push es ; bp - 04h
1655 push esi ; bp - 08h
1656 push edi ; bp - 0ch
1657
1658 mov ax, DATA16
1659 mov ds, ax
1660 mov es, ax
1661
1662 ;
1663 ; Save the device help entry point.
1664 ;
1665 mov eax, [bp + 0ch]
1666 mov [NAME(g_fpfnDevHlp)], eax
1667
1668 ;
1669 ; Parse the command line.
1670 ; Doing this in assembly is kind of ugly...
1671 ;
1672 cmp word [bp + 10h + 2], 3
1673 jbe near .no_command_line
1674 lds si, [bp + 10h] ; ds:si -> command line iterator.
1675.parse_next:
1676
1677 ; skip leading blanks.
1678.parse_next_char:
1679 mov di, si ; DI = start of argument.
1680 lodsb
1681 cmp al, ' '
1682 je .parse_next_char
1683 cmp al, 9 ; tab
1684 je .parse_next_char
1685 cmp al, 0
1686 je near .parse_done
1687
1688 ; check for '/' or '-'
1689 cmp al, '/'
1690 je .parse_switch
1691 cmp al, '-'
1692 je .parse_switch
1693 jmp .parse_error
1694
1695 ; parse switches.
1696.parse_switch:
1697 lodsb
1698 cmp al, 0
1699 je .parse_error
1700 and al, ~20h ; uppercase
1701
1702 cmp al, 'V' ; /V - verbose
1703 je .parse_verbose
1704 cmp al, 'Q' ; /Q - quiet.
1705 je .parse_quiet
1706 jmp .parse_error
1707
1708.parse_verbose:
1709 mov byte [es:NAME(g_fVerbose)], 1
1710 jmp .parse_next
1711
1712.parse_quiet:
1713 mov byte [es:NAME(g_fVerbose)], 0
1714 jmp .parse_next
1715
1716.parse_error:
1717segment DATA16
1718.szSyntaxError:
1719 db 0dh, 0ah, 'VBoxSF.ifs: command line parse error at: ', 0
1720.szNewLine:
1721 db 0dh, 0ah, 0dh, 0ah, 0
1722segment CODE16
1723 mov bx, .szSyntaxError
1724 call NAME(FS_INIT_FPUTS)
1725
1726 push es
1727 push ds
1728 pop es
1729 mov bx, di
1730 call NAME(FS_INIT_FPUTS)
1731 pop es
1732
1733 mov bx, .szNewLine
1734 call NAME(FS_INIT_FPUTS)
1735
1736 mov ax, ERROR_INVALID_PARAMETER
1737 jmp .done
1738
1739.parse_done:
1740 mov ax, DATA16
1741 mov ds, ax
1742.no_command_line:
1743
1744 ;
1745 ; Write our greeting to STDOUT.
1746 ; APIRET _Pascal DosWrite(HFILE hf, PVOID pvBuf, USHORT cbBuf, PUSHORT pcbBytesWritten);
1747 ;
1748 cmp byte [NAME(g_fVerbose)], 0
1749 je near .quiet
1750segment DATA16
1751.szMessage:
1752 db 'VirtualBox Guest Additions IFS for OS/2', 0dh, 0ah, 0
1753segment CODE16
1754 mov bx, .szMessage
1755 call NAME(FS_INIT_FPUTS)
1756.quiet:
1757
1758 ; return success.
1759 xor eax, eax
1760.done:
1761 lea sp, [bp - 0ch]
1762 pop edi
1763 pop esi
1764 pop es
1765 pop ds
1766 mov esp, ebp
1767 pop ebp
1768 DEBUG_STR16 'VBoxSF: FS_INIT - leave'
1769 retf 0ch
1770VBOXSF_EP16_END FS_INIT
1771
1772
1773;;
1774; Dos16Write wrapper.
1775;
1776; @param es:bx String to print. (zero terminated)
1777; @uses nothing.
1778GLOBALNAME FS_INIT_FPUTS
1779 push bp
1780 mov bp, sp
1781 push es ; bp - 02h
1782 push ds ; bp - 04h
1783 push ax ; bp - 06h
1784 push bx ; bp - 08h
1785 push cx ; bp - 0ah
1786 push dx ; bp - 0ch
1787 push si ; bp - 0eh
1788 push di ; bp - 10h
1789
1790 ; cx = strlen(es:bx)
1791 xor al, al
1792 mov di, bx
1793 mov cx, 0ffffh
1794 cld
1795 repne scasb
1796 not cx
1797 dec cx
1798
1799 ; APIRET _Pascal DosWrite(HFILE hf, PVOID pvBuf, USHORT cbBuf, PUSHORT pcbBytesWritten);
1800 push cx
1801 mov ax, sp ; cbBytesWritten
1802 push 1 ; STDOUT
1803 push es ; pvBuf
1804 push bx
1805 push cx ; cbBuf
1806 push ss ; pcbBytesWritten
1807 push ax
1808%if 0 ; wlink/nasm generates a non-aliased fixup here which results in 16-bit offset with the flat 32-bit selector.
1809 call far DOS16WRITE
1810%else
1811 ; convert flat pointer to a far pointer using the tiled algorithm.
1812 mov ax, DATA32 wrt FLAT
1813 mov ds, ax
1814 mov eax, g_pfnDos16Write wrt FLAT
1815 movzx eax, word [eax + 2] ; High word of the flat address (in DATA32).
1816 shl ax, 3
1817 or ax, 0007h
1818 mov dx, DATA16
1819 mov ds, dx
1820 mov [NAME(g_fpfnDos16Write) + 2], ax ; Update the selector (in DATA16).
1821 ; do the call
1822 call far [NAME(g_fpfnDos16Write)]
1823%endif
1824
1825 lea sp, [bp - 10h]
1826 pop di
1827 pop si
1828 pop dx
1829 pop cx
1830 pop bx
1831 pop ax
1832 pop ds
1833 pop es
1834 pop bp
1835 ret
1836ENDPROC FS_INIT_FPUTS
1837
1838
1839
1840;;
1841; 16-bit ring-0 init routine.
1842;
1843; Called from various entrypoints likely to be the first to be invoked.
1844;
1845GLOBALNAME VBoxSFR0Init16Bit
1846 DEBUG_STR16 'VBoxSF: VBoxSFR0Init16Bit - enter'
1847 push ds
1848 push es
1849 push fs
1850 push gs
1851 push esi
1852 push edi
1853 push ebp
1854 mov ebp, esp
1855 and sp, 0fffch
1856
1857 ;
1858 ; Only try once.
1859 ;
1860 mov ax, DATA16
1861 mov ds, ax
1862 mov byte [NAME(g_fDoneRing0)], 1
1863
1864 ;
1865 ; Try attach to the VBoxGuest driver.
1866 ;
1867 mov bx, NAME(g_szVBoxGuestName)
1868 mov di, NAME(g_VBoxGuestAttachDD)
1869 mov dl, DevHlp_AttachDD
1870 call far [NAME(g_fpfnDevHlp)]
1871 jc .attach_attempt_done
1872
1873 push seg NAME(g_VBoxGuestIDC)
1874 push NAME(g_VBoxGuestIDC)
1875 call far [NAME(g_VBoxGuestAttachDD) + 6]
1876.attach_attempt_done:
1877
1878%ifndef DONT_LOCK_SEGMENTS
1879 ;
1880 ; Lock the two 16-bit segments.
1881 ;
1882 push DATA16
1883 call far FSH_FORCENOSWAP
1884 push CODE16
1885 call far FSH_FORCENOSWAP
1886 ; Wonder if this'll work if wlink could mark the two segments as ALIASed...
1887 ;push DATA32
1888 ;call far FSH_FORCENOSWAP
1889 ;push TEXT32
1890 ;call far FSH_FORCENOSWAP
1891%endif
1892
1893 ;
1894 ; Do 32-bit ring-0 init.
1895 ;
1896 ;jmp far dword NAME(VBoxSFR0Init16Bit_32) wrt FLAT
1897 db 066h
1898 db 0eah
1899 dd NAME(VBoxSFR0Init16Bit_32) ;wrt FLAT
1900 dw TEXT32 wrt FLAT
1901segment TEXT32
1902GLOBALNAME VBoxSFR0Init16Bit_32
1903 mov ax, DATA32 wrt FLAT
1904 mov ds, ax
1905 mov es, ax
1906
1907 call KernThunkStackTo32
1908 call NAME(VBoxSFR0Init)
1909 call KernThunkStackTo16
1910
1911 ;jmp far dword NAME(VBoxSFR0Init16Bit_16) wrt CODE16
1912 db 066h
1913 db 0eah
1914 dw NAME(VBoxSFR0Init16Bit_16) wrt CODE16
1915 dw CODE16
1916segment CODE16
1917GLOBALNAME VBoxSFR0Init16Bit_16
1918
1919 mov esp, ebp
1920 pop ebp
1921 pop edi
1922 pop esi
1923 pop gs
1924 pop fs
1925 pop es
1926 pop ds
1927 DEBUG_STR16 'VBoxSF: VBoxSFR0Init16Bit - leave'
1928 ret
1929ENDPROC VBoxSFR0Init16Bit
1930
1931
1932%ifdef DEBUG
1933;;
1934; print the string which offset is in AX (it's in the data segment).
1935; @uses AX
1936;
1937GLOBALNAME dbgstr16
1938 push ds
1939 push ebx
1940 push edx
1941
1942 mov bx, ax
1943 mov dx, 0504h ; RTLOG_DEBUG_PORT
1944 mov ax, DATA16
1945 mov ds, ax
1946
1947.next:
1948 mov al, [bx]
1949 or al, al
1950 jz .done
1951 inc bx
1952 out dx, al
1953 jmp .next
1954
1955.done:
1956 pop edx
1957 pop ebx
1958 pop ds
1959 ret
1960ENDPROC dbgstr16
1961%endif
1962
Note: See TracBrowser for help on using the repository browser.