回 帖 发 新 帖 刷新版面

主题:[原创]用MINGW编译WINDOWS驱动选项

用MINGW编译WINDOWS驱动选项,研究了好几天,和大家分享一下.
编译:gcc -o "OBJ文件名" -O3 -c "源文件名"
连接:ld "OBJ文件名" --subsystem=native --image-base=0x10000 --file-alignment=0x1000 --section-alignment=0x1000 --entry=_DriverEntry@8 -nostartfiles --nostdlib -shared -L "库路径" -l ntoskrnl -o "驱动文件名"

回复列表 (共9个回复)

沙发

研究精神,赞叹!

板凳

顶一下 学习的精神  
这几天有点玩的过头了 
马上进入软考到计时了,FIGHTING

3 楼

借这个帖子向各位再讨教一二.
用CODEBLOCKS中KMD工程生成的KMD能够正常加载及卸载,而用上述方法编译相同的源文件得出的驱动一加载之后就立刻重启,其实网上有一个介绍用MINGW编译驱动的文章,只是那个文章里的选项没有-SHARED这个,如果没有这个选项的话编译出的驱动加载的话提示驱动加载失败,加上这个选项之后编译出的驱动不出现加载失败这个对话框,但是立刻重启.如果谁知道的话请赐教为何是这样.用的是VIRTUAL PC WINDOWS 2000 SP4

4 楼

不好意思,再顶一下,请大家告诉我正确的编译及连接命令

5 楼

看到强弟此贴。为自己所荒废的时间深感惭愧!学习...................

6 楼

终于成功了,和大家分享一下:
编译语句不变
连接变成:ld Drv.obj --subsystem=native --image-base=0x10000 --file-alignment=0x20 --section-alignment=0x20 --entry=_DriverEntry -nostartfiles --nostdlib -L(库具体路径) -shared -l ntoskrnl -o Drv.sys
用这个连接终于成功了.哈哈.最重要的是两点变化,一个是把-SHARED移到-l前,一个是把两个对齐变成0X20
补充一点--entry=_DriverEntry如果在源文件中DriverEntry没加STDCALL的话生成的是没有@8的名称,如果源文件中加了STDCALL的话入口点就应该是_DriverEntry@8,根据实际情况调整,也可以用记事本打开OBJ文件看看到底是什么函数名.要用STDCALL调用。

7 楼

强弟,我咋恁佩服你呢!

8 楼

To:cxxcomp兄,我只是个菜鸟而已,你才是高手,我要多向你学习.

9 楼

Drv.h:
#pragma once
//
#include <ddk\ntddk.h>
//
typedef struct _DeviceExtension
{
    PDEVICE_OBJECT pThisDevice;
    UNICODE_STRING DeviceName;
    UNICODE_STRING SymboLinkName;
}DEVICE_EXTENSION,*PDEVICE_EXTENSION;
//
NTSTATUS STDCALL DriverEntry(IN PDRIVER_OBJECT,IN PUNICODE_STRING);
NTSTATUS STDCALL CreateDevice(IN PDRIVER_OBJECT);
void STDCALL DrvUnload(IN PDRIVER_OBJECT);
NTSTATUS STDCALL DrvDispatch(IN PDEVICE_OBJECT,IN PIRP);
//
#define INITCODE code_seg("init")
#define PAGEDCODE code_seg("page")
#define LOCKEDCODE code_seg()
#define INITDATA data_seg("init")
#define PAGEDDATA data_seg("page")
#define LOCKEDDATA data_seg()
//
Drv.c:
#include "Drv.h"
//
NTSTATUS STDCALL DriverEntry(IN PDRIVER_OBJECT pDriverObject,IN PUNICODE_STRING pRegistryPath)
{
    DbgPrint(" Enter Driver\n");
    NTSTATUS Status;
    pDriverObject->MajorFunction[IRP_MJ_CREATE]=DrvDispatch;
    pDriverObject->MajorFunction[IRP_MJ_CLOSE]=DrvDispatch;
    pDriverObject->MajorFunction[IRP_MJ_READ]=DrvDispatch;
    pDriverObject->MajorFunction[IRP_MJ_WRITE]=DrvDispatch;
    pDriverObject->DriverUnload=DrvUnload;
    Status=CreateDevice(pDriverObject);
    return Status;
}
//
NTSTATUS STDCALL CreateDevice(IN PDRIVER_OBJECT pDriverObject)
{
    DbgPrint("CreateDevice\n");
    NTSTATUS Status;
    PDEVICE_OBJECT pDeviceObject;
    PDEVICE_EXTENSION pDeviceExtension;
    UNICODE_STRING DeviceName;
    RtlInitUnicodeString(&DeviceName,L"\\Device\\Device");
    Status=IoCreateDevice(pDriverObject,sizeof(DEVICE_EXTENSION),&(UNICODE_STRING)DeviceName,FILE_DEVICE_UNKNOWN,0,TRUE,&pDeviceObject);
    if(!NT_SUCCESS(Status))
    {
        DbgPrint("Create Device Error\n");
        return Status;
    }
    DbgPrint("CreateDevice Successfully\n");
    pDeviceObject->Flags|=DO_BUFFERED_IO;
    pDeviceExtension=(PDEVICE_EXTENSION)pDeviceObject->DeviceExtension;
    pDeviceExtension->pThisDevice=pDeviceObject;
    pDeviceExtension->DeviceName=DeviceName;
    //Create SymboLink
    UNICODE_STRING SymboLink;
    RtlInitUnicodeString(&SymboLink,L"\\??\\SymboLink");
    pDeviceExtension->SymboLinkName=SymboLink;
    Status=IoCreateSymbolicLink(&SymboLink,&DeviceName);
    if(!NT_SUCCESS(Status))
    {
        IoDeleteDevice(pDeviceObject);
        return Status;
    }
    return Status;
}
//
void STDCALL DrvUnload(IN PDRIVER_OBJECT pDriverObject)
{
    DbgPrint("Driver Unload\n");
    PDEVICE_OBJECT pNextObject;
    pNextObject=pDriverObject->DeviceObject;
    while(pNextObject!=NULL)
    {
        PDEVICE_EXTENSION pDeviceExtension=(PDEVICE_EXTENSION)pNextObject->DeviceExtension;
        UNICODE_STRING pLinkName=pDeviceExtension->SymboLinkName;
        IoDeleteSymbolicLink(&pLinkName);
        pNextObject=pNextObject->NextDevice;
        IoDeleteDevice(pDeviceExtension->pThisDevice);
    }
    return;
}
//
NTSTATUS STDCALL DrvDispatch(IN PDEVICE_OBJECT pDeviceObject,IN PIRP pIrp)
{
    DbgPrint("DrvDispatch\n");
    return STATUS_SUCCESS;
}
仿照书上写的第一个KMD,供也有编写驱动想法的朋友们指正

我来回复

您尚未登录,请登录后再回复。点此登录或注册