參考資訊:
https://wasm.in/
http://four-f.narod.ru/
https://github.com/steward-fu/ddk
main.c
#include <ntddk.h>
#include <wdf.h>
#define DEV_NAME L"\\Device\\MyDriver"
#define SYM_NAME L"\\DosDevices\\MyDriver"
#define IOCTL_TEST CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_BUFFERED, FILE_ANY_ACCESS)
void IrpFileCreate(WDFDEVICE myDevice, WDFREQUEST myRequest, WDFFILEOBJECT myFileObject)
{
DbgPrint("IRP_MJ_CREATE");
WdfRequestComplete(myRequest, STATUS_SUCCESS);
}
void IrpFileClose(WDFFILEOBJECT myFileObject)
{
DbgPrint("IRP_MJ_CLOSE");
}
void IrpIOCTL(WDFQUEUE myQueue, WDFREQUEST myRequest, size_t myOutLen, size_t myInLen, ULONG myCode)
{
if (myCode = IOCTL_TEST) {
DbgPrint("IOCTL_TEST");
}
WdfRequestComplete(myRequest, STATUS_SUCCESS);
}
NTSTATUS AddDevice(WDFDRIVER myDriver, PWDFDEVICE_INIT pMyDeviceInit)
{
WDFDEVICE device = { 0 };
UNICODE_STRING szDevName = { 0 };
UNICODE_STRING szSymName = { 0 };
WDF_IO_QUEUE_CONFIG io_cfg = { 0 };
WDF_FILEOBJECT_CONFIG file_cfg = { 0 };
RtlInitUnicodeString(&szDevName, DEV_NAME);
RtlInitUnicodeString(&szSymName, SYM_NAME);
WdfDeviceInitAssignName(pMyDeviceInit, &szDevName);
WdfDeviceInitSetIoType(pMyDeviceInit, WdfDeviceIoBuffered);
WDF_FILEOBJECT_CONFIG_INIT(&file_cfg, IrpFileCreate, IrpFileClose, NULL);
WdfDeviceInitSetFileObjectConfig(pMyDeviceInit, &file_cfg, WDF_NO_OBJECT_ATTRIBUTES);
WdfDeviceCreate(&pMyDeviceInit, WDF_NO_OBJECT_ATTRIBUTES, &device);
WdfDeviceCreateSymbolicLink(device, &szSymName);
WDF_IO_QUEUE_CONFIG_INIT_DEFAULT_QUEUE(&io_cfg, WdfIoQueueDispatchSequential);
io_cfg.EvtIoDeviceControl = IrpIOCTL;
return WdfIoQueueCreate(device, &io_cfg, WDF_NO_OBJECT_ATTRIBUTES, WDF_NO_HANDLE);
}
NTSTATUS DriverEntry(PDRIVER_OBJECT pMyDriver, PUNICODE_STRING pRegistry)
{
WDF_DRIVER_CONFIG config = { 0 };
WDF_DRIVER_CONFIG_INIT(&config, AddDevice);
return WdfDriverCreate(pMyDriver, pRegistry, WDF_NO_OBJECT_ATTRIBUTES, &config, WDF_NO_HANDLE);
}
app.c
#include <windows.h>
#include <winioctl.h>
#include <stdio.h>
#include <stdlib.h>
#define IOCTL_TEST CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_GET_BUF CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_SET_BUF CTL_CODE(FILE_DEVICE_UNKNOWN, 0x801, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_GET_DIR CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_OUT_DIRECT, FILE_ANY_ACCESS)
#define IOCTL_SET_DIR CTL_CODE(FILE_DEVICE_UNKNOWN, 0x801, METHOD_IN_DIRECT, FILE_ANY_ACCESS)
#define IOCTL_GET_NEI CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_NEITHER, FILE_ANY_ACCESS)
#define IOCTL_SET_NEI CTL_CODE(FILE_DEVICE_UNKNOWN, 0x801, METHOD_NEITHER, FILE_ANY_ACCESS)
int main(int argc, char **argv)
{
DWORD dwRet = 0;
HANDLE hFile = NULL;
char szBuffer[255] = { "I am error" };
hFile = CreateFile("\\\\.\\MyDriver", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
if (argc > 1) {
dwRet = strlen(szBuffer);
printf("SET: %s, %d\n", szBuffer, dwRet);
if (!strcmp(argv[1], "BUF")) {
DeviceIoControl(hFile, IOCTL_SET_BUF, szBuffer, dwRet, NULL, 0, &dwRet, NULL);
dwRet = 0;
memset(szBuffer, 0, sizeof(szBuffer));
DeviceIoControl(hFile, IOCTL_GET_BUF, NULL, 0, szBuffer, sizeof(szBuffer), &dwRet, NULL);
}
else if (!strcmp(argv[1], "DIR")) {
DeviceIoControl(hFile, IOCTL_SET_DIR, szBuffer, dwRet, NULL, 0, &dwRet, NULL);
dwRet = 0;
memset(szBuffer, 0, sizeof(szBuffer));
DeviceIoControl(hFile, IOCTL_GET_DIR, NULL, 0, szBuffer, sizeof(szBuffer), &dwRet, NULL);
}
else if (!strcmp(argv[1], "NEI")) {
DeviceIoControl(hFile, IOCTL_SET_NEI, szBuffer, dwRet, NULL, 0, &dwRet, NULL);
dwRet = 0;
memset(szBuffer, 0, sizeof(szBuffer));
DeviceIoControl(hFile, IOCTL_GET_NEI, NULL, 0, szBuffer, sizeof(szBuffer), &dwRet, NULL);
}
printf("GET: %s, %d\n", szBuffer, dwRet);
}
else {
DeviceIoControl(hFile, IOCTL_TEST, NULL, 0, NULL, 0, &dwRet, NULL);
}
CloseHandle(hFile);
return 0;
}
完成
