这是一个驱动访问物理内存的小例子,但凡驱动都不可避免稳定性,
因此就尽量少在里面干其他事 :)
演示访问物理内存 0xf0000 ----0xfffff空间 64K的物理内存(其实是SMBIOS段)
MemQuery.h
#pragma
once
#include " ntifs_ex.h "
typedef struct _DEVICE_EXTENSION
{
ULONG StateVariable;
} DEVICE_EXTENSION, * PDEVICE_EXTENSION;
//
// Define the various device type values. Note that values used by Microsoft
// Corporation are in the range 0-0x7FFF(32767), and 0x8000(32768)-0xFFFF(65535)
// are reserved for use by customers.
//
#define FILE_DEVICE_MEMQUERY 0x8000
//
// Macro definition for defining IOCTL and FSCTL function control codes. Note
// that function codes 0-0x7FF(2047) are reserved for Microsoft Corporation,
// and 0x800(2048)-0xFFF(4095) are reserved for customers.
//
#define MEMQUERY_IOCTL_BASE 0x800
//
// The device driver IOCTLs
//
#define CTL_CODE_MEMQUERY(i) CTL_CODE(FILE_DEVICE_MEMQUERY, MEMQUERY_IOCTL_BASE+i, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_MEMQUERY_QUERYBIOS CTL_CODE_MEMQUERY(0)
//
// Name that Win32 front end will use to open the MemQuery device
//
#define MEMQUERY_DEVICE_NAME_WIN32 "//./MemQuery"
#if DBG
#define dprintf DbgPrint
#else
#define dprintf
#endif
#define kprintf DbgPrint
#define NT_DEVICE_NAME L"/Device/MemQuery"
#define DOS_DEVICE_NAME L"/DosDevices/MemQuery"
#include " ntifs_ex.h "
typedef struct _DEVICE_EXTENSION
{
ULONG StateVariable;
} DEVICE_EXTENSION, * PDEVICE_EXTENSION;
//
// Define the various device type values. Note that values used by Microsoft
// Corporation are in the range 0-0x7FFF(32767), and 0x8000(32768)-0xFFFF(65535)
// are reserved for use by customers.
//
#define FILE_DEVICE_MEMQUERY 0x8000
//
// Macro definition for defining IOCTL and FSCTL function control codes. Note
// that function codes 0-0x7FF(2047) are reserved for Microsoft Corporation,
// and 0x800(2048)-0xFFF(4095) are reserved for customers.
//
#define MEMQUERY_IOCTL_BASE 0x800
//
// The device driver IOCTLs
//
#define CTL_CODE_MEMQUERY(i) CTL_CODE(FILE_DEVICE_MEMQUERY, MEMQUERY_IOCTL_BASE+i, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_MEMQUERY_QUERYBIOS CTL_CODE_MEMQUERY(0)
//
// Name that Win32 front end will use to open the MemQuery device
//
#define MEMQUERY_DEVICE_NAME_WIN32 "//./MemQuery"
#if DBG
#define dprintf DbgPrint
#else
#define dprintf
#endif
#define kprintf DbgPrint
#define NT_DEVICE_NAME L"/Device/MemQuery"
#define DOS_DEVICE_NAME L"/DosDevices/MemQuery"
MemQuery.cpp
#include
"
MemQuery.h
"
NTSTATUS MemQueryDispatchCreate(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp);
NTSTATUS MemQueryDispatchClose(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp);
NTSTATUS MemQueryDispatchDeviceControl(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp);
VOID MemQueryUnload(IN PDRIVER_OBJECT DriverObject);
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath)
{
dprintf( " MemQuery DriverEntry: %S " , RegistryPath -> Buffer);
UNICODE_STRING ntDeviceName;
RtlInitUnicodeString( & ntDeviceName, NT_DEVICE_NAME);
PDEVICE_OBJECT DeviceObject = NULL;
NTSTATUS ntStatus = IoCreateDevice(
DriverObject,
sizeof (DEVICE_EXTENSION),
& ntDeviceName,
FILE_DEVICE_MEMQUERY,
0 ,
TRUE,
& DeviceObject
);
if ( ! NT_SUCCESS(ntStatus))
{
dprintf( " MemQuery IoCreateDevice=0x%x " , ntStatus);
return ntStatus;
}
PDEVICE_EXTENSION DeviceExtension = (PDEVICE_EXTENSION)DeviceObject -> DeviceExtension;
UNICODE_STRING dosDeviceName;
RtlInitUnicodeString( & dosDeviceName, DOS_DEVICE_NAME);
ntStatus = IoCreateSymbolicLink( & dosDeviceName, & ntDeviceName);
if ( ! NT_SUCCESS(ntStatus))
{
IoDeleteDevice(DeviceObject);
return ntStatus;
}
DriverObject -> MajorFunction[IRP_MJ_CREATE] = MemQueryDispatchCreate;
DriverObject -> MajorFunction[IRP_MJ_CLOSE] = MemQueryDispatchClose;
DriverObject -> MajorFunction[IRP_MJ_DEVICE_CONTROL] = MemQueryDispatchDeviceControl;
DriverObject -> DriverUnload = MemQueryUnload;
return ntStatus;
}
NTSTATUS MemQueryDispatchCreate(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp)
{
NTSTATUS ntStatus;
Irp -> IoStatus.Status = STATUS_SUCCESS;
Irp -> IoStatus.Information = 0 ;
dprintf( " MemQuery IRP_MJ_CREATE " );
ntStatus = Irp -> IoStatus.Status;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return ntStatus;
}
NTSTATUS MemQueryDispatchClose(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp)
{
NTSTATUS ntStatus;
Irp -> IoStatus.Status = STATUS_SUCCESS;
Irp -> IoStatus.Information = 0 ;
dprintf( " MemQuery IRP_MJ_CLOSE " );
ntStatus = Irp -> IoStatus.Status;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return ntStatus;
}
NTSTATUS MemQueryDispatchDeviceControl(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp)
{
NTSTATUS ntStatus;
PIO_STACK_LOCATION IrpStack = IoGetCurrentIrpStackLocation(Irp);
PDEVICE_EXTENSION DeviceExtension = (PDEVICE_EXTENSION)DeviceObject -> DeviceExtension;
PVOID lpInOutBuffer;
ULONG nInBufferSize, nOutBufferSize, dwIoControlCode;
Irp -> IoStatus.Status = STATUS_SUCCESS;
Irp -> IoStatus.Information = 0 ;
lpInOutBuffer = Irp -> AssociatedIrp.SystemBuffer;
nInBufferSize = IrpStack -> Parameters.DeviceIoControl.InputBufferLength;
nOutBufferSize = IrpStack -> Parameters.DeviceIoControl.OutputBufferLength;
dprintf( " MemQuery IRP_MJ_DEVICE_CONTROL " );
dwIoControlCode = IrpStack -> Parameters.DeviceIoControl.IoControlCode;
switch (dwIoControlCode)
{
case IOCTL_MEMQUERY_QUERYBIOS:
{
if (nOutBufferSize < 64 * 1024 )
{
Irp -> IoStatus.Status = STATUS_INVALID_PARAMETER;
dprintf( " nOutBufferSize<64*1024 " );
}
else
{
PHYSICAL_ADDRESS paddr;
paddr.QuadPart = (__int64) 0x000f0000 ;
PVOID maped = MmMapIoSpace(paddr, 64 * 1024 , MmNonCached);
dprintf( " We start map io space,mapped addr is %p " ,maped);
if (maped != NULL)
{
READ_REGISTER_BUFFER_UCHAR((PUCHAR)maped, (PUCHAR)lpInOutBuffer, 64 * 1024 );
MmUnmapIoSpace(maped, 64 * 1024 );
Irp -> IoStatus.Information = 64 * 1024 ;
}
else
{
Irp -> IoStatus.Status = STATUS_INVALID_PARAMETER;
dprintf( " MmMapIoSpace return NULL " );
}
}
break ;
}
default :
Irp -> IoStatus.Status = STATUS_INVALID_PARAMETER;
dprintf( " MemQuery unknown IRP_MJ_DEVICE_CONTROL " );
break ;
}
ntStatus = Irp -> IoStatus.Status;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return ntStatus;
}
VOID MemQueryUnload(IN PDRIVER_OBJECT DriverObject)
{
UNICODE_STRING dosDeviceName;
RtlInitUnicodeString( & dosDeviceName, DOS_DEVICE_NAME);
IoDeleteSymbolicLink( & dosDeviceName);
IoDeleteDevice(DriverObject -> DeviceObject);
dprintf( " MemQuery unloaded " );
}
NTSTATUS MemQueryDispatchCreate(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp);
NTSTATUS MemQueryDispatchClose(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp);
NTSTATUS MemQueryDispatchDeviceControl(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp);
VOID MemQueryUnload(IN PDRIVER_OBJECT DriverObject);
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath)
{
dprintf( " MemQuery DriverEntry: %S " , RegistryPath -> Buffer);
UNICODE_STRING ntDeviceName;
RtlInitUnicodeString( & ntDeviceName, NT_DEVICE_NAME);
PDEVICE_OBJECT DeviceObject = NULL;
NTSTATUS ntStatus = IoCreateDevice(
DriverObject,
sizeof (DEVICE_EXTENSION),
& ntDeviceName,
FILE_DEVICE_MEMQUERY,
0 ,
TRUE,
& DeviceObject
);
if ( ! NT_SUCCESS(ntStatus))
{
dprintf( " MemQuery IoCreateDevice=0x%x " , ntStatus);
return ntStatus;
}
PDEVICE_EXTENSION DeviceExtension = (PDEVICE_EXTENSION)DeviceObject -> DeviceExtension;
UNICODE_STRING dosDeviceName;
RtlInitUnicodeString( & dosDeviceName, DOS_DEVICE_NAME);
ntStatus = IoCreateSymbolicLink( & dosDeviceName, & ntDeviceName);
if ( ! NT_SUCCESS(ntStatus))
{
IoDeleteDevice(DeviceObject);
return ntStatus;
}
DriverObject -> MajorFunction[IRP_MJ_CREATE] = MemQueryDispatchCreate;
DriverObject -> MajorFunction[IRP_MJ_CLOSE] = MemQueryDispatchClose;
DriverObject -> MajorFunction[IRP_MJ_DEVICE_CONTROL] = MemQueryDispatchDeviceControl;
DriverObject -> DriverUnload = MemQueryUnload;
return ntStatus;
}
NTSTATUS MemQueryDispatchCreate(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp)
{
NTSTATUS ntStatus;
Irp -> IoStatus.Status = STATUS_SUCCESS;
Irp -> IoStatus.Information = 0 ;
dprintf( " MemQuery IRP_MJ_CREATE " );
ntStatus = Irp -> IoStatus.Status;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return ntStatus;
}
NTSTATUS MemQueryDispatchClose(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp)
{
NTSTATUS ntStatus;
Irp -> IoStatus.Status = STATUS_SUCCESS;
Irp -> IoStatus.Information = 0 ;
dprintf( " MemQuery IRP_MJ_CLOSE " );
ntStatus = Irp -> IoStatus.Status;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return ntStatus;
}
NTSTATUS MemQueryDispatchDeviceControl(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp)
{
NTSTATUS ntStatus;
PIO_STACK_LOCATION IrpStack = IoGetCurrentIrpStackLocation(Irp);
PDEVICE_EXTENSION DeviceExtension = (PDEVICE_EXTENSION)DeviceObject -> DeviceExtension;
PVOID lpInOutBuffer;
ULONG nInBufferSize, nOutBufferSize, dwIoControlCode;
Irp -> IoStatus.Status = STATUS_SUCCESS;
Irp -> IoStatus.Information = 0 ;
lpInOutBuffer = Irp -> AssociatedIrp.SystemBuffer;
nInBufferSize = IrpStack -> Parameters.DeviceIoControl.InputBufferLength;
nOutBufferSize = IrpStack -> Parameters.DeviceIoControl.OutputBufferLength;
dprintf( " MemQuery IRP_MJ_DEVICE_CONTROL " );
dwIoControlCode = IrpStack -> Parameters.DeviceIoControl.IoControlCode;
switch (dwIoControlCode)
{
case IOCTL_MEMQUERY_QUERYBIOS:
{
if (nOutBufferSize < 64 * 1024 )
{
Irp -> IoStatus.Status = STATUS_INVALID_PARAMETER;
dprintf( " nOutBufferSize<64*1024 " );
}
else
{
PHYSICAL_ADDRESS paddr;
paddr.QuadPart = (__int64) 0x000f0000 ;
PVOID maped = MmMapIoSpace(paddr, 64 * 1024 , MmNonCached);
dprintf( " We start map io space,mapped addr is %p " ,maped);
if (maped != NULL)
{
READ_REGISTER_BUFFER_UCHAR((PUCHAR)maped, (PUCHAR)lpInOutBuffer, 64 * 1024 );
MmUnmapIoSpace(maped, 64 * 1024 );
Irp -> IoStatus.Information = 64 * 1024 ;
}
else
{
Irp -> IoStatus.Status = STATUS_INVALID_PARAMETER;
dprintf( " MmMapIoSpace return NULL " );
}
}
break ;
}
default :
Irp -> IoStatus.Status = STATUS_INVALID_PARAMETER;
dprintf( " MemQuery unknown IRP_MJ_DEVICE_CONTROL " );
break ;
}
ntStatus = Irp -> IoStatus.Status;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return ntStatus;
}
VOID MemQueryUnload(IN PDRIVER_OBJECT DriverObject)
{
UNICODE_STRING dosDeviceName;
RtlInitUnicodeString( & dosDeviceName, DOS_DEVICE_NAME);
IoDeleteSymbolicLink( & dosDeviceName);
IoDeleteDevice(DriverObject -> DeviceObject);
dprintf( " MemQuery unloaded " );
}
下面的小程序演示如何调用这个驱动并获得目标段的数据:
#pragma
once
#define WIN32_LEAN_AND_MEAN
#include < Windows.h >
#include < WinSvc.h >
#include < winioctl.h >
#include < stdlib.h >
#include < stdio.h >
#include < vector >
#define FILE_DEVICE_MEMQUERY 0x8000
using namespace std;
//
// Macro definition for defining IOCTL and FSCTL function control codes. Note
// that function codes 0-0x7FF(2047) are reserved for Microsoft Corporation,
// and 0x800(2048)-0xFFF(4095) are reserved for customers.
//
#define MEMQUERY_IOCTL_BASE 0x800
//
// The device driver IOCTLs
//
#define CTL_CODE_MEMQUERY(i) CTL_CODE(FILE_DEVICE_MEMQUERY, MEMQUERY_IOCTL_BASE+i, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_MEMQUERY_QUERYBIOS CTL_CODE_MEMQUERY(0)
typedef struct _tagPhyMemStruct
{
BYTE pBuf[ 0x1001 ];
// _tagPhyMemStruct()
// {
// memset( szBuf, 0 , 0x1001 );
// };
}PHYMEM_STRUCT;
vector < PHYMEM_STRUCT *> vtPhymemItems;
class MemDriver
{
public :
MemDriver(){_handle = NULL;}
~ MemDriver(){ if (_handle != NULL)CloseHandle(_handle);}
bool InstallAndStart();
bool UnInstall();
public :
bool OpenDriver();
void QueryBiosMemory();
private :
HANDLE _handle;
};
#define DRIVERNAME "MemQuery"
#define DRIVERFILANAME "MemQuery.sys"
bool MemDriver::UnInstall()
{
SC_HANDLE scmHandle = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
if (scmHandle != 0 )
{
SC_HANDLE handle = OpenService(scmHandle,DRIVERNAME,SERVICE_ALL_ACCESS);
if (handle != 0 )
{
SERVICE_STATUS status;
ControlService(handle,SERVICE_CONTROL_STOP, & status);
DeleteService(handle);
CloseServiceHandle(handle);
}
CloseServiceHandle(scmHandle);
}
return true ;
}
bool MemDriver::InstallAndStart()
{
char systemDir[MAX_PATH];
GetSystemDirectory(systemDir,MAX_PATH);
strcat(systemDir, " /drivers/ " );
strcat(systemDir,DRIVERFILANAME);
UnInstall();
SetFileAttributes(systemDir, 0 );
DeleteFile(systemDir);
if (CopyFile( " I:/BiosQuery/MemQuery/Debug/MemQuery.sys " ,systemDir,FALSE) == 0 )
return false ;
SC_HANDLE scmHandle = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
if (scmHandle == 0 )
return false ;
SC_HANDLE newDriver = CreateService(scmHandle,DRIVERNAME,DRIVERNAME,SERVICE_ALL_ACCESS,SERVICE_KERNEL_DRIVER,SERVICE_DEMAND_START,SERVICE_ERROR_IGNORE,systemDir,NULL,NULL,NULL,NULL,NULL);
if (newDriver != NULL)
{
const char * args = NULL;
StartService(newDriver, 0 , & args);
CloseServiceHandle(newDriver);
}
CloseServiceHandle(scmHandle);
return true ;
}
bool MemDriver::OpenDriver()
{
char drvName[MAX_PATH];
wsprintf(drvName, " //./%s " ,DRIVERNAME);
_handle = CreateFile(drvName,GENERIC_ALL, 0 ,NULL,OPEN_EXISTING, 0 , 0 );
if (_handle == INVALID_HANDLE_VALUE)
{
return false ;
}
return true ;
}
void MemDriver::QueryBiosMemory()
{
static char outbuf[ 64 * 1024 ];
DWORD retLen = sizeof (outbuf);
memset( & outbuf, 0 , sizeof (outbuf));
int inbuf = 0 ;
if ( ! DeviceIoControl(_handle,IOCTL_MEMQUERY_QUERYBIOS, & inbuf, sizeof (inbuf), & outbuf, sizeof (outbuf), & retLen,NULL))
{
// 在这个数据里面
return ;
}
int j = 1 ;
PHYMEM_STRUCT * phyMem = new PHYMEM_STRUCT;
BYTE pTempBuf[ 0x1000 + 1 ];
memset( pTempBuf, 0 , sizeof ( pTempBuf ) );
for ( DWORD dwBase0 = 0xf0000 ; dwBase0 < 0xfffff ; dwBase0 += 0x1000 )
{
DWORD dwLength = 0 ;
memcpy(pTempBuf, & outbuf[dwLength], 0x1000 );
memset(phyMem -> pBuf, 0 , 0x1001 );
memcpy(phyMem -> pBuf,pTempBuf, 0x1000 );
vtPhymemItems.push_back(phyMem);
dwLength += 0x1000 ;
}
DWORD dwLength1 = 0x1000 ;
for ( int i = 0 ; i < ( dwLength1 - 4 ); ++ i)
{
if (strncmp(( char * ) & outbuf[i], " _SM_ " , 4 ) == 0 )
MessageBox(NULL, "" , " " ,MB_OK);
}
}
MemDriver gMemDriver;
int main( int argc, char * argv[])
{
gMemDriver.UnInstall();
gMemDriver.InstallAndStart();
gMemDriver.OpenDriver();
gMemDriver.QueryBiosMemory();
gMemDriver.UnInstall();
return 0 ;
}
#define WIN32_LEAN_AND_MEAN
#include < Windows.h >
#include < WinSvc.h >
#include < winioctl.h >
#include < stdlib.h >
#include < stdio.h >
#include < vector >
#define FILE_DEVICE_MEMQUERY 0x8000
using namespace std;
//
// Macro definition for defining IOCTL and FSCTL function control codes. Note
// that function codes 0-0x7FF(2047) are reserved for Microsoft Corporation,
// and 0x800(2048)-0xFFF(4095) are reserved for customers.
//
#define MEMQUERY_IOCTL_BASE 0x800
//
// The device driver IOCTLs
//
#define CTL_CODE_MEMQUERY(i) CTL_CODE(FILE_DEVICE_MEMQUERY, MEMQUERY_IOCTL_BASE+i, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_MEMQUERY_QUERYBIOS CTL_CODE_MEMQUERY(0)
typedef struct _tagPhyMemStruct
{
BYTE pBuf[ 0x1001 ];
// _tagPhyMemStruct()
// {
// memset( szBuf, 0 , 0x1001 );
// };
}PHYMEM_STRUCT;
vector < PHYMEM_STRUCT *> vtPhymemItems;
class MemDriver
{
public :
MemDriver(){_handle = NULL;}
~ MemDriver(){ if (_handle != NULL)CloseHandle(_handle);}
bool InstallAndStart();
bool UnInstall();
public :
bool OpenDriver();
void QueryBiosMemory();
private :
HANDLE _handle;
};
#define DRIVERNAME "MemQuery"
#define DRIVERFILANAME "MemQuery.sys"
bool MemDriver::UnInstall()
{
SC_HANDLE scmHandle = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
if (scmHandle != 0 )
{
SC_HANDLE handle = OpenService(scmHandle,DRIVERNAME,SERVICE_ALL_ACCESS);
if (handle != 0 )
{
SERVICE_STATUS status;
ControlService(handle,SERVICE_CONTROL_STOP, & status);
DeleteService(handle);
CloseServiceHandle(handle);
}
CloseServiceHandle(scmHandle);
}
return true ;
}
bool MemDriver::InstallAndStart()
{
char systemDir[MAX_PATH];
GetSystemDirectory(systemDir,MAX_PATH);
strcat(systemDir, " /drivers/ " );
strcat(systemDir,DRIVERFILANAME);
UnInstall();
SetFileAttributes(systemDir, 0 );
DeleteFile(systemDir);
if (CopyFile( " I:/BiosQuery/MemQuery/Debug/MemQuery.sys " ,systemDir,FALSE) == 0 )
return false ;
SC_HANDLE scmHandle = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
if (scmHandle == 0 )
return false ;
SC_HANDLE newDriver = CreateService(scmHandle,DRIVERNAME,DRIVERNAME,SERVICE_ALL_ACCESS,SERVICE_KERNEL_DRIVER,SERVICE_DEMAND_START,SERVICE_ERROR_IGNORE,systemDir,NULL,NULL,NULL,NULL,NULL);
if (newDriver != NULL)
{
const char * args = NULL;
StartService(newDriver, 0 , & args);
CloseServiceHandle(newDriver);
}
CloseServiceHandle(scmHandle);
return true ;
}
bool MemDriver::OpenDriver()
{
char drvName[MAX_PATH];
wsprintf(drvName, " //./%s " ,DRIVERNAME);
_handle = CreateFile(drvName,GENERIC_ALL, 0 ,NULL,OPEN_EXISTING, 0 , 0 );
if (_handle == INVALID_HANDLE_VALUE)
{
return false ;
}
return true ;
}
void MemDriver::QueryBiosMemory()
{
static char outbuf[ 64 * 1024 ];
DWORD retLen = sizeof (outbuf);
memset( & outbuf, 0 , sizeof (outbuf));
int inbuf = 0 ;
if ( ! DeviceIoControl(_handle,IOCTL_MEMQUERY_QUERYBIOS, & inbuf, sizeof (inbuf), & outbuf, sizeof (outbuf), & retLen,NULL))
{
// 在这个数据里面
return ;
}
int j = 1 ;
PHYMEM_STRUCT * phyMem = new PHYMEM_STRUCT;
BYTE pTempBuf[ 0x1000 + 1 ];
memset( pTempBuf, 0 , sizeof ( pTempBuf ) );
for ( DWORD dwBase0 = 0xf0000 ; dwBase0 < 0xfffff ; dwBase0 += 0x1000 )
{
DWORD dwLength = 0 ;
memcpy(pTempBuf, & outbuf[dwLength], 0x1000 );
memset(phyMem -> pBuf, 0 , 0x1001 );
memcpy(phyMem -> pBuf,pTempBuf, 0x1000 );
vtPhymemItems.push_back(phyMem);
dwLength += 0x1000 ;
}
DWORD dwLength1 = 0x1000 ;
for ( int i = 0 ; i < ( dwLength1 - 4 ); ++ i)
{
if (strncmp(( char * ) & outbuf[i], " _SM_ " , 4 ) == 0 )
MessageBox(NULL, "" , " " ,MB_OK);
}
}
MemDriver gMemDriver;
int main( int argc, char * argv[])
{
gMemDriver.UnInstall();
gMemDriver.InstallAndStart();
gMemDriver.OpenDriver();
gMemDriver.QueryBiosMemory();
gMemDriver.UnInstall();
return 0 ;
}