驅動開發學習一
阿新 • • 發佈:2018-12-22
關於驅動開發確實是有難度的,我在這裡簡單記錄下簡單的程式碼
首先是sys
//main.c #include<ntddk.h> //定義巨集 #define DEVICE_NAME "\\Device\\MyReadDevice" #define SYN_LINK_NAME "\\??\\MyRead" //全域性定義方便在多個函式中使用 PDEVICE_OBJECT pDevice; UNICODE_STRING DeviceName; NTSTATUS Unload(PDRIVER_OBJECT driver) { DbgPrint("this driver is loading\n然後是應用層開發"); return STATUS_SUCCESS; } //讀取函式操作 NTSTATUS MyDriverRead(PDEVICE_OBJECT driver, PIRP pirp) { NTSTATUS status; PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(pirp); ULONG ulReadlength = stack->Parameters.Read.Length; pirp->IoStatus.Status= STATUS_SUCCESS; pirp->IoStatus.Information = ulReadlength; //格式化讀取內容 memset(pirp->AssociatedIrp.SystemBuffer, 0xaa, ulReadlength); IoCompleteRequest(pirp, IO_NO_INCREMENT); //讀取完成標誌 DbgPrint("over\n"); return STATUS_SUCCESS; } NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING reg_path) {//PVOID test = NULL; //PUCHAR test1 = "aaaaaaaa"; //memcpy(test, test1, 4); RtlInitUnicodeString(&DeviceName, DEVICE_NAME); NTSTATUS status = IoCreateDevice(driver, 0, &DeviceName, FILE_DEVICE_UNKNOWN, 0, TRUE, &pDevice); //判斷是否載入成功 if (!NT_SUCCESS(status)) { DbgPrint("Create Device failed"); return STATUS_SUCCESS; } UNICODE_STRING SymLinkName = RTL_CONSTANT_STRING(SYN_LINK_NAME); status = IoCreateSymbolicLink(&SymLinkName, &DeviceName); if (!NT_SUCCESS(status)) { DbgPrint("Create SymLINKname faile\n"); return STATUS_SUCCESS; } driver->DriverUnload = Unload; //DbgPrint("this is my first Driver\n"); //設定符號讀取 driver->MajorFunction[IRP_MJ_READ] = MyDriverRead; pDevice->Flags |= DO_BUFFERED_IO; return STATUS_SUCCESS; }
我們選擇的是windows控制檯程式,這裡不做贅述
貼程式碼
//read.cpp #include "stdafx.h" #include<windows.h> int a; int _tmain(int argc, _TCHAR* argv[]) { //變數的初始化定義 HANDLE hDevice = CreateFile(L"\\\\.\\MyRead", GENERIC_READ | GENERIC_WRITE, 0, //分享 NULL, //安全檢測 OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hDevice == INVALID_HANDLE_VALUE) { printf("failed to obtain file handle device:" "%s with win32 error code:%d\n", "MYWDMDRIVER",GetLastError); return 1; } UCHAR buffer[10]; ULONG ulRead; BOOL bRet = ReadFile(hDevice, buffer, 10, &ulRead, NULL); if (bRet) { printf("Read %d bytes:", ulRead); for (int i = 0; i < (int)ulRead; i++) { printf("%02X",buffer[1]); } printf("\n"); } CloseHandle(hDevice); scanf("%d", &a); return 0; }
驅動之路漫漫,何處是歸處?
以上資料來自https://www.bilibili.com/video/av26193169/?p=2
如有侵權,請聯絡本人刪除