初学驱动编写遇到的问题

lfp2003 2004-12-19 08:46:23
我看了些别人写的简单的驱动程序的代码就学着自己写,我不知道为什么有问题,请大家指教
NTSTATUS Read(IN PDEVICE_OBJECT DeviceObject, IN PIRP pIrp)
{
NTSTATUS ntStatus;
pIrp->IoStatus.Status=STATUS_SUCCESS;
IoGetCurrentIrpStackLocation(pIrp);
void *p=pIrp->AssociatedIrp.SystemBuffer;
void *s=ExAllocatePool( PagedPool, 8 );
RtlZeroMemory(s,8);
// if (p!=NULL)
RtlCopyMemory(p,s,8);
IoCompleteRequest( pIrp, IO_NO_INCREMENT );
return ntStatus = pIrp->IoStatus.Status;

}
我只想在让它给应用程序返回全零的值,但是在应用程序中用ReadFile却导致机器重起,后来我加上if (p!=NULL)就没事了,为什么p会是空指针呢?我看别人的都是这么写的呀.
以下是应用程序的代码
用CreateFile打开没有问题,
然后是char buf[8];
DWORD len=0;
ReadFile(handle,buf,8,&len,NULL);
...全文
126 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
lfp2003 2005-01-05
  • 打赏
  • 举报
回复
自己搞定了,要加Irp->IoCompletion=4
lfp2003 2004-12-25
  • 打赏
  • 举报
回复
感谢seaquester,我加上Fdo->Flags |= DO_BUFFERED_IO;后不会再出错重起了,不过ReadFile还是不能得到值,我把DriverEntry也贴上来,帮我看看
NTSTATUS DriverEntry(
IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath
)
{
PDEVICE_OBJECT pDeviceObject = NULL;
WCHAR name[]=L"\\Device\\driver1";
UNICODE_STRING Uname;
RtlInitUnicodeString(&Uname,name);
WCHAR namel[]=L"\\??\\mydriver";
UNICODE_STRING Lname;
RtlInitUnicodeString(&Lname,namel);
Status = IoCreateDevice(
DriverObject,
0,
&Uname,
FILE_DEVICE_UNKNOWN,
0,
true,
&pDeviceObject
);
// pDeviceObject->Flags|=DO_BUFFERED_IO ;
IoCreateSymbolicLink(&Lname,&Uname);
if ( NT_SUCCESS(Status) ) {
DriverObject->MajorFunction[IRP_MJ_CLOSE= Close;
DriverObject->MajorFunction[IRP_MJ_CREATE]= Create;
DriverObject->MajorFunction[IRP_MJ_REA]= Read;
DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL]=DriverDispatch;
DriverObject->DriverUnload = Unload;
}

return Status;
}
seaquester 2004-12-20
  • 打赏
  • 举报
回复
在AddDevice里面创建设备后有没有设置 DO_BUFFERED_IO 标志?

Fdo->Flags |= DO_BUFFERED_IO;

21,597

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧