Zhujnt
驱动牛犊
驱动牛犊
  • 注册日期2004-02-16
  • 最后登录2004-05-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1379回复:9

帮主--Tom_lyd ,请进!

楼主#
更多 发布于:2004-03-14 14:12
应用程序中...

HANDLE Device;
HANDLE CommEvent;
Device = CreateFile(
      VolumeName,
      GENERIC_READ | GENERIC_WRITE,
      FILE_SHARE_READ|FILE_SHARE_WRITE,
      NULL,
      OPEN_EXISTING,
      FILE_ATTRIBUTE_NORMAL,
      NULL
      );

if (Device == INVALID_HANDLE_VALUE)
{
      printf("设备不存在!");
      return;
}

CommEvent = CreateEvent( NULL,false,false,NULL );

if( !DeviceIoControl(
       Device,
       IO_REFERENCE_EVENT,
       (LPVOID)CommEvent,
       0,
       NULL,
       0,
       &dwReturn,
       NULL)
   )
{
CloseHandle( CommEvent );
printf("Error  in IOCTL_REGISTER_EVENT call");
return;
}

驱动程序中:

case IO_REFERENCE_EVENT:
{
      HANDLE    hEvent;
      OBJECT_HANDLE_INFORMATION objHandleInfo;

      hEvent = (HANDLE)IrpStack- >Parameters.DeviceIoControl.Type3InputBuffer;
      ntStatus = ObReferenceObjectByHandle(
hEvent,
GENERIC_ALL,
NULL,
KernelMode,
&pEventObject,
&objHandleInfo
);

     if(ntStatus != STATUS_SUCCESS)
    {
          DbgPrint("ObReferenceObjectByHandle failed! status = %x\n", ntStatus);
break;
    }

    DbgPrint("Referenct object sussfully!\n");
    break;
}
.................

  为什么老是
Error  in IOCTL_REGISTER_EVENT call

ObReferenceObjectByHandle failed

*学*
Tom_lyd
驱动大牛
驱动大牛
  • 注册日期2001-09-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-03-17 08:43
第一个问题:slwqw回答得非常正确。
第二个问题:你的uFileSize实际上取得是指针,而不是值,改成这样:
ULONGLONG uFileSize = *(ULONGLONG*)pIrp->AssociatedIrp.SystemBuffer;
Tom_lyd
Zhujnt
驱动牛犊
驱动牛犊
  • 注册日期2004-02-16
  • 最后登录2004-05-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-03-15 14:17
我想在应用中传一个值给驱动,怎么值变了???

应用中:

ULONGLONG uFileSize = 3242344;
DeviceIoControl(
        Device,
        IOCTL_NETDISK_OPEN_FILE,
        &uFileSize,
        sizeof(ULONGLONG),
        NULL,
        0,
        &bReturn,
        NULL
        );

驱动中:
case IOCTL_NETDISK_OPEN_FILE:
{
   ULONGLONG  uFileSize;
   uFileSize = (ULONGLONG)pIrp->AssociatedIrp.SystemBuffer;

   这时候uFileSize 怎么变成428870431了????
}



[编辑 -  3/15/04 by  Zhujnt]
*学*
slwqw
驱动大牛
驱动大牛
  • 注册日期2002-07-18
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望197点
  • 贡献值0点
  • 好评度147点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-03-15 11:16
再问个问题!
#define IOCTL_NETDISK_GETMEMORY CTL_CODE(0x8000,0x802,METHOD_BUFFERED,FILE_ANY_ACCESS)

//To Allocate the share memory
DriverVirtualAddress = ExAllocatePool(NonPagedPool, 500);
Mdl = IoAllocateMdl(DriverVirtualAddress, 500, FALSE, FALSE, NULL);
MmBuildMdlForNonPagedPool(Mdl);

但在upload()中.
//release the share memory
if( DriverVirtualAddress )
{
      ExFreePool( DriverVirtualAddress );
}
MmUnmapLockedPages(ApplicationVirtualAddress, Mdl);
DbgPrint("unloadedn");
 
我用的是win2000DDK  ,但net stop ***后,  没到"unloaded"
无法退出??
 


不能正常退出,原因就比较多了。只能具体问题具体分析,靠你自己去DEBUG了。
Zhujnt
驱动牛犊
驱动牛犊
  • 注册日期2004-02-16
  • 最后登录2004-05-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-03-15 09:08
再问个问题!
#define IOCTL_NETDISK_GETMEMORY CTL_CODE(0x8000,0x802,METHOD_BUFFERED,FILE_ANY_ACCESS)

//To Allocate the share memory
DriverVirtualAddress = ExAllocatePool(NonPagedPool, 500);
Mdl = IoAllocateMdl(DriverVirtualAddress, 500, FALSE, FALSE, NULL);
MmBuildMdlForNonPagedPool(Mdl);

但在upload()中.
//release the share memory
if( DriverVirtualAddress )
{
      ExFreePool( DriverVirtualAddress );
}
MmUnmapLockedPages(ApplicationVirtualAddress, Mdl);
DbgPrint("unloaded\n");
 
我用的是win2000DDK  ,但net stop ***后,  没到"unloaded"
无法退出??
*学*
Zhujnt
驱动牛犊
驱动牛犊
  • 注册日期2004-02-16
  • 最后登录2004-05-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-03-15 08:37
哈哈!~~~~~~~~~~~
大哥,我对你的敬仰由如我给你的20分 ;)
*学*
slwqw
驱动大牛
驱动大牛
  • 注册日期2002-07-18
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望197点
  • 贡献值0点
  • 好评度147点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-03-14 21:01
要象下面那样:

const   ULONG FILE_DEVICE_TDIFITLER = 0x8000;

#define IOCTL_SETEVENTHANDLE       CTL_CODE(FILE_DEVICE_TDIFITLER,0x802,METHOD_NEITHER,FILE_ANY_ACCESS)
Zhujnt
驱动牛犊
驱动牛犊
  • 注册日期2004-02-16
  • 最后登录2004-05-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-03-14 16:06
我指定缓冲方式是:
   DeviceObject->Flags |= DO_DIRECT_IO;

这样就不能用信号量通信吗?????????
*学*
Zhujnt
驱动牛犊
驱动牛犊
  • 注册日期2004-02-16
  • 最后登录2004-05-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-03-14 15:38
slwqw 您好!

CommEvent创建成功的.
但传到驱动中就变成0了???


怎么使IO_REFERENCE_EVENT用METHOD_NEITHER????


*学*
slwqw
驱动大牛
驱动大牛
  • 注册日期2002-07-18
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望197点
  • 贡献值0点
  • 好评度147点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-03-14 14:59
光看你的代码看不出什么问题,检查一下两种情况:

1、CommEvent是否成功建立?
2、IO_REFERENCE_EVENT是否已经使用METHOD_NEITHER(必须使用这种类型)?

使用单手左手打字真费劲 :D
游客

返回顶部