驱动和应用层通信列子
生活随笔
收集整理的這篇文章主要介紹了
驱动和应用层通信列子
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
驅(qū)動層,創(chuàng)建設(shè)備對象,實現(xiàn)讀寫函數(shù):
#include <ntddk.h>NTSTATUS Unload(PDRIVER_OBJECT driver) {DbgPrint("unload driver");return STATUS_SUCCESS; }NTSTATUS CompleteIrp(PIRP Irp, NTSTATUS status = STATUS_SUCCESS, ULONG_PTR info = 0) {Irp->IoStatus.Status = status; Irp->IoStatus.Information = info; IoCompleteRequest(Irp, 0); return status; }NTSTATUS ZeroRead(PDEVICE_OBJECT, PIRP Irp) {auto stack = IoGetCurrentIrpStackLocation(Irp);auto len = stack->Parameters.Read.Length;if (len == 0)return CompleteIrp(Irp, STATUS_INVALID_BUFFER_SIZE);auto buffer = MmGetSystemAddressForMdl(Irp->MdlAddress, NormalPagePriority);if (!buffer){return CompleteIrp(Irp, STATUS_INSUFFICIENT_RESOURCES);}memset(buffer, 0, len);return CompleteIrp(Irp, STATUS_SUCCESS, len); }NTSTATUS ZeroWrite(PDEVICE_OBJECT, PIRP Irp) {auto stack = IoGetCurrentIrpStackLocation(Irp); auto len = stack->Parameters.Write.Length;return CompleteIrp(Irp, STATUS_SUCCESS, len); }NTSTATUS CreateClose(PDEVICE_OBJECT, PIRP Irp) {return CompleteIrp(Irp); } extern "C" NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING RegPath) {DbgPrint("Driver Entry");driver->DriverUnload = (PDRIVER_UNLOAD)Unload;driver->MajorFunction[IRP_MJ_CREATE] = CreateClose;driver->MajorFunction[IRP_MJ_READ] = ZeroRead;driver->MajorFunction[IRP_MJ_WRITE] = ZeroWrite;driver->MajorFunction[IRP_MJ_CLOSE] = CreateClose;UNICODE_STRING devName = RTL_CONSTANT_STRING(L"\\Device\\Zero"); UNICODE_STRING symLink = RTL_CONSTANT_STRING(L"\\??\\Zero"); PDEVICE_OBJECT DeviceObject = nullptr;auto status = STATUS_SUCCESS;do{status = IoCreateDevice(driver, 0, &devName, FILE_DEVICE_UNKNOWN, 0, false, &DeviceObject);if (!NT_SUCCESS(status)){DbgPrint("CreateDevice Failed");break;}DeviceObject->Flags |= DO_DIRECT_IO;IoCreateSymbolicLink(&symLink, &devName);if (!NT_SUCCESS(status)){DbgPrint("CreateSymLink Failed");IoDeleteDevice(DeviceObject);break;}} while (FALSE);return status; }應(yīng)用層打開設(shè)備對象,并使用ReadFile讀數(shù)據(jù):
#include <windows.h> #include <iostream>int Error(const char* msg) {printf("%s: error=%d\n", msg, ::GetLastError()); return 1; } int _tmain(int argc, _TCHAR* argv[]) {HANDLE hFile = CreateFile(L"\\\\.\\Zero", GENERIC_READ | GENERIC_WRITE, 0, nullptr, OPEN_EXISTING, 0, nullptr);if (hFile == INVALID_HANDLE_VALUE){printf("OpenDevice Failed");return -1;}BYTE buffer[64];DWORD bytes;// store some non-zero datafor (int i = 0; i < sizeof(buffer); ++i) buffer[i] = i + 1;bool ok = ReadFile(hFile, buffer, 64, &bytes, nullptr);if (!ok){Error("ReadFailed");}long total = 0;for (auto i : buffer){total += i;}if (total != 0){printf("Wrong Read");}else{printf("ReadOK");}CloseHandle(hFile);return 0; } 《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的驱动和应用层通信列子的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: win7更新powershell到5.1
- 下一篇: version.dll劫持注入模版