用户层函数
HANDLE WINAPI CreateFile( 成功返回句柄 失败返回INVALID_HANDLE_VALUE
__in LPCTSTR lpFileName, 要打开文件或者驱动的名字
__in DWORD dwDesiredAccess, 要打开文件或者驱动的权限 GENERIC_READ | GENERIC_WRITE
__in DWORD dwShareMode, 文件或者驱动的共享模式 0 非共享
__in_opt LPSECURITY_ATTRIBUTES lpSecurityAttributes, 安全描述符 NULL
__in DWORD dwCreationDisposition, 驱动一般用 OPEN_EXISTING
__in DWORD dwFlagsAndAttributes, 一般用 FILE_ATTRIBUTE_NORMAL
__in_opt HANDLE hTemplateFile 模版文件,如果打开的是一个已经存在的文件,将会忽略这个参数。NULL
);
BOOL WINAPI CloseHandle(
__in HANDLE hObject 前面打开的句柄
);
BOOL WINAPI DeviceIoControl(
__in HANDLE hDevice, CreateFile打开的句柄
__in DWORD dwIoControlCode, 控制字段 CTL_CODE 类型的宏
__in_opt LPVOID lpInBuffer, 输入数据的缓冲区指针
__in DWORD nInBufferSize, 缓冲区的大小
__out_opt LPVOID lpOutBuffer, 输出数据的缓冲区指针
__in DWORD nOutBufferSize, 缓冲区的大小
__out_opt LPDWORD lpBytesReturned, 下面是NULL 这个参数不能为空 实际操作数
__inout_opt LPOVERLAPPED lpOverlapped NULL
);
#define CTL_CODE 引用该宏要引入 #include "winioctl.h"
(
DeviceType, 设备的类型 创建设备时间设置的设备类型一致 FILE_DEVICE_UNKNOWN
Function, 位于2048-4095之间 2048
Method, METHOD_BUFFERED METHOD_IN_DIRECT METHOD_OUT_DIRECT METHOD_NEITHER 四种交互模式 缓冲区 直接 其他读取方式
Access 权限 FILE_ANY_ACCESS
)
BOOL WINAPI WriteFile(
__in HANDLE hFile, 句柄
__in LPCVOID lpBuffer, 输入数据的缓冲区
__in DWORD nNumberOfBytesToWrite, 输入数据的字节数
__out_opt LPDWORD lpNumberOfBytesWritten, 真是操作的字节数
__inout_opt LPOVERLAPPED lpOverlapped NULL
);
BOOL WINAPI ReadFile(
__in HANDLE hFile, 句柄
__out LPVOID lpBuffer, 输出数据的缓冲区
__in DWORD nNumberOfBytesToRead, 读取数据的字节数
__out_opt LPDWORD lpNumberOfBytesRead, 实际读取的字节数
__inout_opt LPOVERLAPPED lpOverlapped NULL
);
PVOID MmGetSystemAddressForMdlSafe( 直接访问模式的 内存地址的映射地址读取函数
[in] PMDL Mdl, pIrp->MdlAddress
[in] MM_PAGE_PRIORITY Priority NormalPagePriority 一般用这个
);
exe 代码部分 MFC VC6.0
HANDLE ddkh;
int a[2];
int b;
ULONG c;
int key;
// UpdateData(true);
// m_sum=m_x+m_y;
// UpdateData(false);
ddkh=CreateFile(
".//firstddk", // Òª´ò¿ªÎļþ»òÕßÇý¶¯µÄÃû×Ö
GENERIC_READ | GENERIC_WRITE, // Òª´ò¿ªÎļþ»òÕßÇý¶¯µÄȨÏÞ GENERIC_READ | GENERIC_WRITE
0, // Îļþ»òÕßÇý¶¯µÄ¹²Ïíģʽ 0 ·Ç¹²Ïí
NULL, // °²È«ÃèÊö·û NULL
OPEN_EXISTING, // Çý¶¯Ò»°ãÓà OPEN_EXISTING
FILE_ATTRIBUTE_NORMAL, // Ò»°ãÓÃ FILE_ATTRIBUTE_NORMAL
NULL // Ä£°æÎļþ£¬Èç¹û´ò¿ªµÄÊÇÒ»¸öÒѾ´æÔÚµÄÎļþ£¬½«»áºöÂÔÕâ¸ö²ÎÊý¡£NULL
);
if(ddkh==INVALID_HANDLE_VALUE)
{
MessageBox("´ò¿ªÇý¶¯Ê§°Ü",NULL,MB_ICONEXCLAMATION);
return ;
}
else
{
MessageBox("´ò¿ªÇý¶¯³É¹¦",NULL,MB_ICONEXCLAMATION);
}
UpdateData(true);
a[0]=m_x;
a[1]=m_y;
key=DeviceIoControl(
ddkh, // CreateFile´ò¿ªµÄ¾ä±ú
CODE, // ¿ØÖÆ×Ö¶Î
a, // ÊäÈëÊý¾ÝµÄ»º³åÇøÖ¸Õë
8, // »º³åÇøµÄ´óС
&b, // Êä³öÊý¾ÝµÄ»º³åÇøÖ¸Õë
4, // »º³åÇøµÄ´óС
&c, //
NULL // NULL
);
if(key==0)
{
MessageBox("»º³åÇø¶Áдʧ°Ü",NULL,MB_ICONEXCLAMATION);
}
else
{
m_sum=b;
UpdateData(false);
}
CloseHandle(ddkh);
SYS 相应的 派遣函数的代码 DDK 1830
NTSTATUS ddk_add(PDEVICE_OBJECT DeviceObject,PIRP Irp)
{
int *a;
int x;
a=(int *)Irp->AssociatedIrp.SystemBuffer; //读取传入的数据所在内存地址的指针
// *a=*a+*(a+1);
// *(int *)Irp->AssociatedIrp.SystemBuffer=*a;
_asm
{
mov eax,a
mov ebx,[eax]
add ebx,[eax+4]
mov [eax],ebx
}
Irp->IoStatus.Information=4;
Irp->IoStatus.Status=STATUS_SUCCESS;
IoCompleteRequest(Irp,IO_NO_INCREMENT);
return STATUS_SUCCESS;
}