主题:[原创]用MINGW编译WINDOWS驱动选项
强强
[专家分:4740] 发布于 2010-04-23 12:41:00
用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 "驱动文件名"
最后更新于:2010-04-23 15:14:00
回复列表 (共9个回复)
沙发
雪光风剑 [专家分:27190] 发布于 2010-04-24 11:40:00
研究精神,赞叹!
板凳
suzhoutaicang18 [专家分:360] 发布于 2010-04-24 21:00:00
顶一下 学习的精神
这几天有点玩的过头了
马上进入软考到计时了,FIGHTING
3 楼
强强 [专家分:4740] 发布于 2010-04-24 21:31:00
借这个帖子向各位再讨教一二.
用CODEBLOCKS中KMD工程生成的KMD能够正常加载及卸载,而用上述方法编译相同的源文件得出的驱动一加载之后就立刻重启,其实网上有一个介绍用MINGW编译驱动的文章,只是那个文章里的选项没有-SHARED这个,如果没有这个选项的话编译出的驱动加载的话提示驱动加载失败,加上这个选项之后编译出的驱动不出现加载失败这个对话框,但是立刻重启.如果谁知道的话请赐教为何是这样.用的是VIRTUAL PC WINDOWS 2000 SP4
4 楼
强强 [专家分:4740] 发布于 2010-04-25 20:43:00
不好意思,再顶一下,请大家告诉我正确的编译及连接命令
5 楼
cxxcomp [专家分:2370] 发布于 2010-04-25 21:18:00
看到强弟此贴。为自己所荒废的时间深感惭愧!学习...................
6 楼
强强 [专家分:4740] 发布于 2010-04-25 22:58:00
终于成功了,和大家分享一下:
编译语句不变
连接变成: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 楼
cxxcomp [专家分:2370] 发布于 2010-04-25 23:14:00
强弟,我咋恁佩服你呢!
8 楼
强强 [专家分:4740] 发布于 2010-04-26 08:37:00
To:cxxcomp兄,我只是个菜鸟而已,你才是高手,我要多向你学习.
9 楼
强强 [专家分:4740] 发布于 2010-04-27 10:23:00
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,供也有编写驱动想法的朋友们指正
我来回复