1. 程式人生 > >驅動開發學習一

驅動開發學習一

關於驅動開發確實是有難度的,我在這裡簡單記錄下簡單的程式碼

首先是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

如有侵權,請聯絡本人刪除