www.pudn.com > WinIoForVB.rar > Phys32.cpp


// ---------------------------------------------------- // 
//                      WinIo v2.0                      // 
//  Direct Hardware Access Under Windows 9x/NT/2000/XP  // 
//           Copyright 1998-2002 Yariv Kaplan           // 
//               http://www.internals.com               // 
// ---------------------------------------------------- // 
 
#include  
#include  
#include "phys32.h" 
#include "..\drv\nt\winio_nt.h" 
#include "winio.h" 
 
// VWIN32 DPMI services 
 
#define VWIN32_DPMI_CALL 0x2A0029 
 
// KERNEL32's undocumented VxDCall function is exported as ordinal #1 
 
DWORD (WINAPI *VxDCall)(DWORD Service, DWORD EAX_Reg, DWORD ECX_Reg); 
 
#define DPMICall(EAX_Reg, ECX_Reg) VxDCall(VWIN32_DPMI_CALL, EAX_Reg, ECX_Reg) 
 
 
PBYTE _stdcall MapPhysToLin(PBYTE pbPhysAddr, DWORD dwPhysSize, HANDLE *pPhysicalMemoryHandle) 
{ 
  PBYTE pbLinAddr; 
  tagPhys32Struct Phys32Struct; 
  DWORD dwBytesReturned; 
 
  if (!IsWinIoInitialized) 
    return false; 
 
  if (IsNT) 
  { 
    Phys32Struct.dwPhysMemSizeInBytes = dwPhysSize; 
    Phys32Struct.pvPhysAddress = pbPhysAddr; 
 
    if (!DeviceIoControl(hDriver, IOCTL_WINIO_MAPPHYSTOLIN, &Phys32Struct, 
                         sizeof(tagPhys32Struct), &Phys32Struct, sizeof(tagPhys32Struct), 
                         &dwBytesReturned, NULL)) 
      return NULL; 
    else 
    { 
      pbLinAddr = (PBYTE)((DWORD)Phys32Struct.pvPhysMemLin + (DWORD)pbPhysAddr - (DWORD)Phys32Struct.pvPhysAddress); 
      *pPhysicalMemoryHandle = Phys32Struct.PhysicalMemoryHandle; 
    } 
  } 
  else 
  { 
    _asm 
    { 
      Mov BX, WORD PTR [pbPhysAddr + 2] 
      Mov CX, WORD PTR [pbPhysAddr] 
      Mov SI, WORD PTR [dwPhysSize + 2] 
      Mov DI, WORD PTR [dwPhysSize] 
    } 
 
    // Call DPMI function MapPhysicalToLinear 
 
    DPMICall(0x800, (DWORD)pbPhysAddr);     
 
    _asm 
    { 
      Jnc Success 
      Xor BX, BX 
      Xor CX, CX 
 
    Success: 
 
      Mov WORD PTR [pbLinAddr + 2], BX 
      Mov WORD PTR [pbLinAddr], CX 
    } 
  } 
 
  return pbLinAddr; 
} 
 
 
bool _stdcall UnmapPhysicalMemory(HANDLE PhysicalMemoryHandle, PBYTE pbLinAddr) 
{ 
  tagPhys32Struct Phys32Struct; 
  DWORD dwBytesReturned; 
 
  if (IsNT) 
  { 
    if (!IsWinIoInitialized) 
      return false; 
 
    Phys32Struct.PhysicalMemoryHandle = PhysicalMemoryHandle; 
    Phys32Struct.pvPhysMemLin = pbLinAddr; 
 
    if (!DeviceIoControl(hDriver, IOCTL_WINIO_UNMAPPHYSADDR, &Phys32Struct, 
                         sizeof(tagPhys32Struct), NULL, 0, &dwBytesReturned, NULL)) 
      return false; 
  } 
 
  return true; 
} 
 
// Support functions for Visual-Basic users 
 
bool _stdcall GetPhysLong(PBYTE pbPhysAddr, PDWORD pdwPhysVal) 
{ 
  PDWORD pdwLinAddr; 
  HANDLE PhysicalMemoryHandle; 
 
  if (!IsWinIoInitialized) 
    return false; 
 
  pdwLinAddr = (PDWORD)MapPhysToLin(pbPhysAddr, 4, &PhysicalMemoryHandle); 
 
  if (pdwLinAddr == NULL) 
    return false; 
 
  *pdwPhysVal = *pdwLinAddr; 
 
  UnmapPhysicalMemory(PhysicalMemoryHandle, (PBYTE)pdwLinAddr); 
 
  return true; 
} 
 
 
bool _stdcall SetPhysLong(PBYTE pbPhysAddr, DWORD dwPhysVal) 
{ 
  PDWORD pdwLinAddr; 
  HANDLE PhysicalMemoryHandle; 
 
  if (!IsWinIoInitialized) 
    return false; 
 
  pdwLinAddr = (PDWORD)MapPhysToLin(pbPhysAddr, 4, &PhysicalMemoryHandle); 
 
  if (pdwLinAddr == NULL) 
    return false; 
 
  *pdwLinAddr = dwPhysVal; 
 
  UnmapPhysicalMemory(PhysicalMemoryHandle, (PBYTE)pdwLinAddr); 
 
  return true; 
}