Phys32.cpp
上传用户:ason123
上传日期:2010-03-31
资源大小:177k
文件大小:3k
源码类别:

并口编程

开发平台:

C++ Builder

  1. // ---------------------------------------------------- //
  2. //                      WinIo v2.0                      //
  3. //  Direct Hardware Access Under Windows 9x/NT/2000/XP  //
  4. //           Copyright 1998-2002 Yariv Kaplan           //
  5. //               http://www.internals.com               //
  6. // ---------------------------------------------------- //
  7. #include <windows.h>
  8. #include <winioctl.h>
  9. #include "phys32.h"
  10. #include "..drvntwinio_nt.h"
  11. #include "winio.h"
  12. // VWIN32 DPMI services
  13. #define VWIN32_DPMI_CALL 0x2A0029
  14. // KERNEL32's undocumented VxDCall function is exported as ordinal #1
  15. DWORD (WINAPI *VxDCall)(DWORD Service, DWORD EAX_Reg, DWORD ECX_Reg);
  16. #define DPMICall(EAX_Reg, ECX_Reg) VxDCall(VWIN32_DPMI_CALL, EAX_Reg, ECX_Reg)
  17. PBYTE _stdcall MapPhysToLin(PBYTE pbPhysAddr, DWORD dwPhysSize, HANDLE *pPhysicalMemoryHandle)
  18. {
  19.   PBYTE pbLinAddr;
  20.   tagPhys32Struct Phys32Struct;
  21.   DWORD dwBytesReturned;
  22.   if (!IsWinIoInitialized)
  23.     return false;
  24.   if (IsNT)
  25.   {
  26.     Phys32Struct.dwPhysMemSizeInBytes = dwPhysSize;
  27.     Phys32Struct.pvPhysAddress = pbPhysAddr;
  28.     if (!DeviceIoControl(hDriver, IOCTL_WINIO_MAPPHYSTOLIN, &Phys32Struct,
  29.                          sizeof(tagPhys32Struct), &Phys32Struct, sizeof(tagPhys32Struct),
  30.                          &dwBytesReturned, NULL))
  31.       return NULL;
  32.     else
  33.     {
  34.       pbLinAddr = (PBYTE)((DWORD)Phys32Struct.pvPhysMemLin + (DWORD)pbPhysAddr - (DWORD)Phys32Struct.pvPhysAddress);
  35.       *pPhysicalMemoryHandle = Phys32Struct.PhysicalMemoryHandle;
  36.     }
  37.   }
  38.   else
  39.   {
  40.     _asm
  41.     {
  42.       Mov BX, WORD PTR [pbPhysAddr + 2]
  43.       Mov CX, WORD PTR [pbPhysAddr]
  44.       Mov SI, WORD PTR [dwPhysSize + 2]
  45.       Mov DI, WORD PTR [dwPhysSize]
  46.     }
  47.     // Call DPMI function MapPhysicalToLinear
  48.     DPMICall(0x800, (DWORD)pbPhysAddr);    
  49.     _asm
  50.     {
  51.       Jnc Success
  52.       Xor BX, BX
  53.       Xor CX, CX
  54.     Success:
  55.       Mov WORD PTR [pbLinAddr + 2], BX
  56.       Mov WORD PTR [pbLinAddr], CX
  57.     }
  58.   }
  59.   return pbLinAddr;
  60. }
  61. bool _stdcall UnmapPhysicalMemory(HANDLE PhysicalMemoryHandle, PBYTE pbLinAddr)
  62. {
  63.   tagPhys32Struct Phys32Struct;
  64.   DWORD dwBytesReturned;
  65.   if (IsNT)
  66.   {
  67.     if (!IsWinIoInitialized)
  68.       return false;
  69.     Phys32Struct.PhysicalMemoryHandle = PhysicalMemoryHandle;
  70.     Phys32Struct.pvPhysMemLin = pbLinAddr;
  71.     if (!DeviceIoControl(hDriver, IOCTL_WINIO_UNMAPPHYSADDR, &Phys32Struct,
  72.                          sizeof(tagPhys32Struct), NULL, 0, &dwBytesReturned, NULL))
  73.       return false;
  74.   }
  75.   return true;
  76. }
  77. // Support functions for Visual-Basic users
  78. bool _stdcall GetPhysLong(PBYTE pbPhysAddr, PDWORD pdwPhysVal)
  79. {
  80.   PDWORD pdwLinAddr;
  81.   HANDLE PhysicalMemoryHandle;
  82.   if (!IsWinIoInitialized)
  83.     return false;
  84.   pdwLinAddr = (PDWORD)MapPhysToLin(pbPhysAddr, 4, &PhysicalMemoryHandle);
  85.   if (pdwLinAddr == NULL)
  86.     return false;
  87.   *pdwPhysVal = *pdwLinAddr;
  88.   UnmapPhysicalMemory(PhysicalMemoryHandle, (PBYTE)pdwLinAddr);
  89.   return true;
  90. }
  91. bool _stdcall SetPhysLong(PBYTE pbPhysAddr, DWORD dwPhysVal)
  92. {
  93.   PDWORD pdwLinAddr;
  94.   HANDLE PhysicalMemoryHandle;
  95.   if (!IsWinIoInitialized)
  96.     return false;
  97.   pdwLinAddr = (PDWORD)MapPhysToLin(pbPhysAddr, 4, &PhysicalMemoryHandle);
  98.   if (pdwLinAddr == NULL)
  99.     return false;
  100.   *pdwLinAddr = dwPhysVal;
  101.   UnmapPhysicalMemory(PhysicalMemoryHandle, (PBYTE)pdwLinAddr);
  102.   return true;
  103. }