vild.asm
上传用户:xiaoan1112
上传日期:2013-04-11
资源大小:19621k
文件大小:4k
源码类别:

操作系统开发

开发平台:

Visual C++

  1. .386p
  2. LINE_STATUS    EQU  5
  3. MICROSOFT_OEM_ID    EQU  0
  4. SEWELL_OEM_ID       EQU  (298 SHL 5)
  5. INTERLNK_ID         EQU  0
  6. VILD_Device_ID EQU  SEWELL_OEM_ID OR INTERLNK_ID
  7. INCLUDE VMM.INC
  8. INCLUDE VTD.INC
  9. INCLUDE VCD.INC
  10. INCLUDE VSD.INC
  11. Declare_Virtual_Device VILD, 0, 72, VILD_Control, VILD_Device_ID, 
  12.        Undefined_Init_Order, VILD_V86_API_Handler, 
  13. VxD_DATA_SEG
  14. old_priority_flags  dd  ?
  15. can_use_flag_addr   dd  0
  16. VxD_DATA_ENDS
  17. VxD_LOCKED_CODE_SEG
  18. ;******************************************************************************
  19. ;
  20. ;   VILD_Control
  21. ;
  22. ;   DESCRIPTION:    dispatch control messages to the correct handlers
  23. ;
  24. ;   ENTRY:
  25. ;
  26. ;   EXIT:           Carry clear if no error
  27. ;
  28. ;   USES:
  29. ;
  30. ;==============================================================================
  31. BeginProc VILD_Control
  32.     cmp     eax, Sys_Critical_Exit
  33.     jne     SHORT VILD_Ctrl_Exit
  34.     mov     ecx, [can_use_flag_addr]
  35.     jecxz   VILD_Ctrl_Exit
  36.     mov     BYTE PTR [ecx], 0
  37. VILD_Ctrl_Exit:
  38.     clc
  39.     ret
  40. EndProc VILD_Control
  41. VxD_LOCKED_CODE_ENDS
  42. VxD_CODE_SEG
  43. ;******************************************************************************
  44. ;
  45. ;   VILD_V86_API_Handler
  46. ;
  47. BeginProc VILD_V86_API_Handler
  48.     pushfd
  49.     push    eax
  50.     mov     al, [ebp.Client_al]
  51.     cmp     al, 0
  52.     je      short Serial_Idle
  53.     cmp     al, 1
  54.     je      Set_VMStat_High_Pri_Back
  55.     cmp     al, 2
  56.     je      Reset_VMStat_High_Pri_Back
  57.     cmp     al, 5
  58.     je      short Parallel_Idle
  59.     cmp     al, -1
  60.     je      short Set_OK_Flag
  61.     pop     eax
  62.     popfd
  63.     ret
  64. EndProc VILD_V86_API_Handler
  65. BeginProc Set_OK_Flag
  66.     push    edi   
  67. ;
  68. ; This should be called only once by only one user, but we'll check
  69. ; to make sure.  If a second user is calling this then turn off the
  70. ; first one's flag.
  71. ;
  72.     mov     edi, [can_use_flag_addr]
  73.     test    edi, edi
  74.     jz      short SOF_Not_Totally_Stupid
  75.     mov     BYTE PTR [edi], 0
  76. SOF_Not_Totally_Stupid:
  77.     movzx   eax, [ebp.Client_DS]
  78.     shl     eax, 4
  79.     movzx   edi, [ebp.Client_DI]
  80.     add     edi, eax
  81.     mov     BYTE PTR [edi], 1
  82.     mov     [can_use_flag_addr], edi
  83.     pop     edi
  84.     pop     eax
  85.     popfd
  86.     ret
  87.  
  88. EndProc Set_OK_Flag
  89. BeginProc Serial_Idle
  90.     
  91.     push    edx
  92.     mov     dx, [ebp.Client_dx]
  93.     add     dl, LINE_STATUS
  94.     in      al, dx
  95.     sub     dl, LINE_STATUS
  96.     test    al, 20h
  97.     jz      short send_byte_fail
  98.     mov     al, [ebp.Client_bl]
  99.     out     dx, al
  100. send_byte_fail:
  101.     add     dl, LINE_STATUS
  102.     in      al, dx
  103.     sub     dl, LINE_STATUS
  104.     test    al, 1
  105.     jz      short set_error
  106.     in      al, dx
  107.     mov     [ebp.Client_al], al
  108.     and     [ebp.Client_flags], 0FFFEh  ; clear carry
  109.     jmp     short return
  110. set_error:    
  111.     or      [ebp.Client_flags], 1       ; set carry
  112. return:
  113.     pop     edx
  114.     pop     eax
  115.     popfd
  116.     ret
  117. EndProc Serial_Idle
  118.     
  119. BeginProc Parallel_Idle
  120.     
  121.     push    edx
  122.     mov     dx, [ebp.Client_dx]
  123.     mov     al, [ebp.Client_bl]
  124.     out     dx, al
  125.     inc     dx
  126.     in      al, dx
  127.     mov     [ebp.Client_al], al
  128.     pop     edx
  129.     pop     eax
  130.     popfd
  131.     ret
  132. EndProc Parallel_Idle
  133.     
  134. BeginProc Set_VMStat_High_Pri_Back
  135.     push    ecx
  136.     push    edx
  137.     push    esi
  138.     VMMcall Get_Time_Slice_Priority
  139.     mov     [old_priority_flags], eax
  140.     or      eax, VMStat_High_Pri_Back
  141.     VMMcall Set_Time_Slice_Priority
  142.     pop     esi
  143.     pop     edx
  144.     pop     ecx
  145.     pop     eax
  146.     popfd
  147.     ret
  148. EndProc Set_VMStat_High_Pri_Back
  149. BeginProc Reset_VMStat_High_Pri_Back
  150.     push    ecx
  151.     push    edx
  152.     push    esi
  153.     VMMcall Get_Time_Slice_Priority
  154.     mov     eax, [old_priority_flags]
  155.     VMMcall Set_Time_Slice_Priority
  156.     pop     esi
  157.     pop     edx
  158.     pop     ecx
  159.     pop     eax
  160.     popfd
  161.     ret
  162. EndProc Reset_VMStat_High_Pri_Back
  163. VxD_CODE_ENDS
  164. end