聚星亭

吾笨笨且懒散兮 急须改之而奋进
posts - 74, comments - 166, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

武汉--伤心的鱼 13:26:37
谁懂驱动和应用程序之间的通讯
武汉--伤心的鱼 13:26:47
我写的代码运行不了
武汉--伤心的鱼 13:26:53
请教啊
广州-夺宝 14:20:15
什么驱动?
武汉--伤心的鱼 14:25:07
一般系统驱动
广州-夺宝 14:26:54
什么类型的驱动?怎么和应用通信?
武汉--伤心的鱼 14:27:35
就是获取读取进程驱动
广州-夺宝 14:43:52
发源码、测试用例到群共享
武汉--伤心的鱼 14:46:40

武汉--伤心的鱼 14:47:07

void CDrivercomunicationDlg::OnButton3() //列进程
{
 
char cszDriverName[MAX_PATH]="list.sys";
    
char cszDriverFullPath[MAX_PATH]="D:\\sys\\drivercomunication\\list.sys";
 InstallDriver(cszDriverName,cszDriverFullPath);
//安装驱动
 StartDriver(cszDriverName,cszDriverFullPath);//启动驱动
 HANDLE hDevice;
 BOOL Status;
    ULONG dwReturn;
    
char outBuf[4096];
 hDevice 
=CreateFile("\\\\.\\list",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);//创建设备
 if(hDevice==INVALID_HANDLE_VALUE)
    {
        printf(
"createfile wrong\n");
        getchar();
    }
 
//发送句柄给驱动
 Status=DeviceIoControl(hDevice,IOCTL_PASSBUF,NULL,0,outBuf,sizeof(outBuf),&dwReturn,NULL);
    
if(!Status)
    {
      printf(
"Io wrong\n");
      getchar();
    }
    printf(
"%s\n",outBuf);
    Status 
= CloseHandle( hDevice );
    getchar();
 
//创建事件
 
//发送事件句柄给驱动程序
 StopDriver(cszDriverName,cszDriverFullPath);//停止驱动
 DeleteDriver(cszDriverName,cszDriverFullPath);//删除驱动
 RemoveDriver(cszDriverName,cszDriverFullPath);//卸载驱动
 
}
武汉
--伤心的鱼 14:47:45
NTSTATUS DispatchIoctl(PDEVICE_OBJECT pDevObject, PIRP pIrp)
//处理IRP函数
{
 PIO_STACK_LOCATION  irpStack;
    NTSTATUS  Status;
    PVOID    InPutBuffer;
    ULONG  ioControlCode;
    ULONG  OutPutLen;
    Status
=STATUS_SUCCESS;
    irpStack
=IoGetCurrentIrpStackLocation(pIrp);
    ioControlCode
=irpStack->Parameters.DeviceIoControl.IoControlCode;
    
switch(irpStack->MajorFunction)
 {
      
case  IRP_MJ_DEVICE_CONTROL:
          OutPutLen
=irpStack->Parameters.DeviceIoControl.OutputBufferLength;
          
switch(ioControlCode)
    {
         
case IOCTL_PASSBUF:
                    RtlCopyMemory(pIrp
->UserBuffer,xxx, OutPutLen);
                    
break;
               
default:
                    
break;
    }
          
break;
      
default:
          DbgPrint(
"no match control\n");
          
break;
 }
  pIrp
->IoStatus.Status = Status; 
  pIrp
->IoStatus.Information = 0
  IoCompleteRequest (pIrp, IO_NO_INCREMENT);
  
return  Status;
}

武汉--伤心的鱼 14:49:44
驱动没问题
武汉--伤心的鱼 14:50:01
DBGVIEW显示是正确的
武汉--伤心的鱼 14:50:43
就通信错误  ring3下程序获取不到数据


广州-夺宝 14:53:08
 RtlCopyMemory(pIrp->UserBuffer,xxx, OutPutLen);  ////拷到数据了吗?

武汉--伤心的鱼 14:53:17

武汉--伤心的鱼 14:53:21
就这出错

武汉--伤心的鱼 14:54:54
帮我看看程序什么原因
武汉--伤心的鱼 14:55:58


武汉--伤心的鱼 14:56:10
直接无法创建设备句柄
武汉--伤心的鱼 14:56:25
hDevice =CreateFile("\\\\.\\list",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);//创建设备
武汉--伤心的鱼 14:56:37
好像是这句问题
广州-夺宝 14:56:59
CloseHandle
武汉--伤心的鱼 14:57:34
 Status = CloseHandle( hDevice );有啊
广州-夺宝 14:57:47
驱动有问题
王道_北京 15:02:17
发代码来看看
武汉--伤心的鱼 15:02:35
群共享
武汉--伤心的鱼 15:02:39
sys.rar

王道_北京 15:05:02
cszDriverName
王道_北京 15:05:29
memset(cszDriverName,'\0',MAX_PATH)
武汉--伤心的鱼 15:06:16
 

status = IoCreateDevice(pDrvObject, 
    
0,
    
&ustrDevName, 
    FILE_DEVICE_UNKNOWN,
    
0,
    FALSE,
    
&pDevObject);

 dprintf(
"[list] Device Name %S",ustrDevName.Buffer);//获取驱动设备名字

 
if(!NT_SUCCESS(status))
 {
  dprintf(
"[list] IoCreateDevice = 0x%x\n", status);
  
return status;
 }

武汉--伤心的鱼 15:06:22
应该是这里问题
王道_北京 15:07:40
我没原码 不过以前碰到类似的情况是因为没初始话
武汉--伤心的鱼 15:07:41
yes
王道_北京 15:08:12
好了?
武汉--伤心的鱼 15:08:21
我在程序里面加载驱动   有用InstDrv.exe加载驱动
武汉--伤心的鱼 15:08:35
其中一个没卸载  就无法再创建了
王道_北京 15:08:57
 
武汉--伤心的鱼 15:09:41
那个问题解决了


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理