home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / magazine / msysjour / vol07 / 06 / vxd / cr3.asm < prev    next >
Assembly Source File  |  1992-10-01  |  6KB  |  162 lines

  1. comment~
  2. CR3.ASM -- Virtual CR3 Device
  3. from Microsoft Systems Journal, October 1992
  4. Copyright (c) 1992 Andrew Schulman.  All rights reserved.
  5.  
  6. Provides applications running under Windows Enhanced mode (Windows
  7. apps, real-mode DOS apps, and protected-mode DOS apps) with access
  8. to the CR3 register.  CR3 contains the _physical_ base address of
  9. the page directory, which in turn contains physical addresses of
  10. page tables.  A program calls CR3.386 using its V86 or PM API; the
  11. API entry point is retrieved with INT 2Fh AX=1684h BX=28C2h (CR3.386's
  12. device ID).  The entry point is called with AX=1 to get CR3 into DX:AX:
  13.    unsigned long (far *cr3_vxd)(void);
  14.    unsigned long cr3;
  15.    cr3_vxd = GetDeviceAPI(0x28C2);    // call 2F/1684
  16.    if (cr3_vxd) {
  17.       _asm mov ax, 1
  18.       cr3 = (*cr3_vxd)();
  19.       }
  20.    else fail("Requires device=cr3.386 in SYSTEM.INI [386Enh]");
  21. The returned address is _physical_, not linear, and must be mapped in
  22. using a service such as DPMI INT 31h AX=0800h.     
  23.  
  24. To build:
  25.    set include=\ddk\include
  26.    masm5 -p -w2 cr3;
  27.    link386 cr3,cr3.386,,,cr3.def
  28.    addhdr cr3.386
  29.  
  30. Add device=cr3.386 to SYSTEM.INI [386Enh]
  31. ~
  32.  
  33. .386p
  34.  
  35. INCLUDE VMM.INC
  36.  
  37. ;*****************************************************************************
  38. ;                   E Q U A T E S
  39. ;*****************************************************************************
  40.  
  41. ; The device ID -- get your own ID from vxdid@microsoft.com
  42. RUNNING_DOG_OEM     EQU 326
  43. CR3_DEVICE_ID       EQU 2
  44. CR3_VxD_ID          EQU (RUNNING_DOG_OEM SHL 5) OR CR3_DEVICE_ID  ; 28C2h
  45. VERS_MAJ            EQU 1
  46. VERS_MIN            EQU 0
  47. VERSION             EQU ((VERS_MAJ SHL 8) OR VERS_MIN)
  48.  
  49. CFlag               EQU 1
  50.  
  51. ;*****************************************************************************
  52. ;        V I R T U A L   D E V I C E   D E C L A R A T I O N
  53. ;*****************************************************************************
  54.  
  55. ; Together with an optional Service_Table (not used here), 
  56. ; this will become CR3_DDB in the .386 file
  57. Declare_Virtual_Device CR3, VERS_MAJ, VERS_MIN, CR3_VxD_Control, \
  58.     CR3_VxD_ID, Undefined_Init_Order, \
  59.     CR3_API_Handler, CR3_API_Handler,
  60.  
  61. ;*****************************************************************************
  62. ;           R E A L   M O D E   I N I T I A L I Z A T I O N
  63. ;*****************************************************************************
  64.  
  65. ; This segment of 16-bit real mode code is optional.  Displaying a
  66. ; copyright message here is obnoxious, but it's a good example of how
  67. ; a VxD can contain 16-bit real mode code.  Unfortunately it's only
  68. ; available during Windows initialization.
  69.  
  70. VXD_REAL_INIT_SEG
  71.  
  72. real_init proc near
  73.     mov ah, 9
  74.     mov dx, offset copyright
  75.     int 21h
  76.     xor ax, ax          ; set up to tell Windows it's okay 
  77.     xor bx, bx          ; to keep loading this VxD
  78.     xor si, si
  79.     xor edx, edx
  80.     ret
  81. real_init endp
  82.  
  83. copyright   db  'CR3.386 -- CR3 Access VxD v. 1.0',0dh,0ah
  84.             db  'Copyright (c) 1992 Andrew Schulman. All Rights Reserved.'
  85.             db  0dh,0ah,'$'
  86.  
  87. VXD_REAL_INIT_ENDS
  88.  
  89. ;*****************************************************************************
  90. ;           L O C K E D   C O D E   S E G M E N T
  91. ;*****************************************************************************
  92.  
  93. VxD_LOCKED_CODE_SEG
  94.  
  95. ; This VxD doesn't make any use of Control events.  VxDs 
  96. ; can handle events such as Create_VM, VM_Resume, Debug_Query,
  97. ; etc. in here
  98. BeginProc CR3_VxD_Control
  99.     clc
  100.     ret
  101. EndProc CR3_VxD_Control
  102.  
  103. VxD_LOCKED_CODE_ENDS
  104.  
  105. ;*****************************************************************************
  106. ;               O N L Y   D A T A   S E G M E N T
  107. ;*****************************************************************************
  108.  
  109. VxD_DATA_SEG
  110.  
  111. ; API jump table: this VxD API supports only two functions
  112. CR3_API_Call    label dword
  113.                 dd  offset32 Get_Version        ; AX=0
  114.                 dd  offset32 Get_CR3            ; AX=1
  115.  
  116. CR3_API_MaxCall EQU ( $ - CR3_API_Call ) / 4
  117.  
  118. VxD_DATA_ENDS
  119.  
  120. ;*****************************************************************************
  121. ;          M O V E A B L E   C O D E   S E G M E N T
  122. ;*****************************************************************************
  123.  
  124. VxD_CODE_SEG
  125.  
  126. ; This is the handler for both V86 and PM API calls.  Its address
  127. ; is installed (for both modes) in the Declare_Virtal_Device statement.
  128. BeginProc   CR3_API_Handler
  129.     movzx   eax, [ebp.Client_AX]            ; get caller's AX register
  130.     cmp     eax, CR3_API_MaxCall            ; valid function number?
  131.     jae     short fail
  132.     and     [ebp.Client_EFlags], NOT CFlag  ; clear carry for success
  133.     call    CR3_API_Call[eax * 4]           ; call through table
  134.     ret
  135. fail:
  136.     or      [ebp.Client_EFlags], CFlag
  137.     ret
  138. EndProc     CR3_API_Handler
  139.  
  140. ; API function AX=0 (CR3_Get_Version).  Yawn!
  141. BeginProc   Get_Version
  142.     mov     [ebp.Client_AX], VERSION
  143.     ret
  144. EndProc     Get_Version
  145.  
  146. ; API function AX=1 (CR3_Get_CR3).  Put the contents
  147. ; of CR3 into caller's DX:AX registers (figure that most
  148. ; clients will be 16-bit).
  149. BeginProc   Get_CR3
  150.     mov     eax, cr3    ; <--- the whole point of this VxD!!
  151.     mov     edx, eax    ; get EAX into DX:AX
  152.     shr     edx, 16
  153.     mov     [ebp.Client_DX], dx     ; move into caller's registers
  154.     mov     [ebp.Client_AX], ax
  155.     ret
  156. EndProc     Get_CR3
  157.  
  158. VxD_CODE_ENDS
  159.  
  160.     END
  161.  
  162.