ok100fen 发表于 2010-8-10 22:00:43

换种方式,继续请教,谢谢

现在有个驱动代码,
没有错误,但是,怎么用VB,来与它通信?
麻烦那些大牛,给个VB代码
也就是说,如何根据驱动的参数来写VB的代码
我想领会一下驱动通信
谢谢大家



#include "ntddk.h"
#define IOCTL_TEST1 CTL_CODE(\
FILE_DEVICE_UNKNOWN, \
0x800, \
METHOD_BUFFERED, \
FILE_ANY_ACCESS)
VOID Unload(IN PDRIVER_OBJECT pDriverObject)
{
UNICODE_STRING symLinkName;
RtlInitUnicodeString(&symLinkName,L"\\??\\HelloDDK");
IoDeleteSymbolicLink(&symLinkName);
IoDeleteDevice(pDriverObject->DeviceObject);
KdPrint(("Device Delete Success\n"));
}
NTSTATUS MyDispatch(IN PDEVICE_OBJECT device,IN PIRP irp)
{
PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(irp);

irp->IoStatus.Status = STATUS_SUCCESS;
irp->IoStatus.Information = 0;

if (stack->MajorFunction==IRP_MJ_CREATE)
{
KdPrint(("IRP_MJ_CREATE\n"));
}
if (stack->MajorFunction==IRP_MJ_CLOSE)
{
KdPrint(("IRP_MJ_CLOSE\n"));
}

IoCompleteRequest( irp, IO_NO_INCREMENT );

return STATUS_SUCCESS;
}
NTSTATUS CreateDevice (
      IN PDRIVER_OBJECT pDriverObject)
{
NTSTATUS status;
PDEVICE_OBJECT pDevObj;

//创建设备名称
UNICODE_STRING devName;
UNICODE_STRING symLinkName;

RtlInitUnicodeString(&devName,L"\\Device\\MyDDKDevice");
RtlInitUnicodeString(&symLinkName,L"\\??\\HelloDDK");

//创建设备
status = IoCreateDevice( pDriverObject,
      0,
      &devName,
      FILE_DEVICE_UNKNOWN,
      0, TRUE,
      &pDevObj );
if (!NT_SUCCESS(status))
{
return status;
}
pDevObj->Flags |= DO_BUFFERED_IO;
//创建符号链接

status = IoCreateSymbolicLink( &symLinkName,&devName );
if (!NT_SUCCESS(status))
{
IoDeleteDevice( pDevObj );
return status;
}
return STATUS_SUCCESS;
}
NTSTATUS MyIOCTL(IN PDEVICE_OBJECT pDevObj,
         IN PIRP pIrp)
{
NTSTATUS status = STATUS_SUCCESS;
UCHAR* InputBuffer=NULL;
ULONG i=0;
//得到当前堆栈
PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(pIrp);
//得到输入缓冲区大小
ULONG cbin = stack->Parameters.DeviceIoControl.InputBufferLength;
//得到IOCTL码
ULONG code = stack->Parameters.DeviceIoControl.IoControlCode;
switch (code)
{      // process request
case IOCTL_TEST1:
{
   KdPrint(("IOCTL_TEST1\n"));
   //缓冲区方式IOCTL
   //显示输入缓冲区数据
   InputBuffer = (UCHAR*)pIrp->AssociatedIrp.SystemBuffer;
   for (i=0;i<cbin;i++)
   {
    KdPrint(("%X\n",InputBuffer));
   }
   break;
}
default:
   status = STATUS_INVALID_VARIANT;
}
// 完成IRP
pIrp->IoStatus.Status = status;
pIrp->IoStatus.Information = 0; // bytes xfered
IoCompleteRequest( pIrp, IO_NO_INCREMENT );
return status;
}
NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject,IN PUNICODE_STRING theRegistryPath)
{
pDriverObject->DriverUnload = Unload;

pDriverObject->MajorFunction = MyDispatch;
pDriverObject->MajorFunction = MyDispatch;
pDriverObject->MajorFunction = MyIOCTL;
CreateDevice(pDriverObject);
return STATUS_SUCCESS;

ok100fen 发表于 2010-8-10 22:44:37

附上VB代码
希望小李同学给我改改

Tesla.Angela 发表于 2010-8-10 22:55:12

我看xiaoly被你气糊涂了

ok100fen 发表于 2010-8-10 23:09:22

呵呵,那就TA帮帮忙吧

向小李老师道歉~

俺太菜了~:)

Tesla.Angela 发表于 2010-8-10 23:57:45

这个我也不会,你还是用回我给你的模板吧。

ok100fen 发表于 2010-8-11 00:02:17

模板的VB部分那句代码填写什么?

ok100fen 发表于 2010-8-11 00:13:10

TA兄弟,
把你的那个模板的VB代码补上吧

还有,我以前用你提供的工具能成功编译你的那个模板
后来我有装了一个ddk,编译你的模板,就出错
不知道什么原因呢

xiaoly99 发表于 2010-8-11 19:56:49

你那个代码,用四个字来说,就是"垃圾代码".
你这个修改好的压缩包都要389KB,而我的Dew也只有247KB.
我已经修改好了,把完整的垃圾代码传上来.
还有,不是我打击OK大哥.您这份驱动代码应该不是您写的吧.您说过只提一个问题,现在不断的提问题,提问题,提了多少个问题?您却还是搞不懂Ioctl,连最起码的Ioctl Code都搞不懂.连字符串都......不说了,不然又要被某些"Zzzianses"说打击新手了.

本网站最菜的人 发表于 2010-8-11 22:24:32

ok100fen 发表于 2010-8-11 22:52:45

DbgPrint("输入缓冲数据内容:%u 输入缓冲数据长度:%u",*(PULONG)pIrp->AssociatedIrp.SystemBuffer,cbin);


红色的地方还是不明白怎么回事
呵呵,高手,解释一下
谢谢

zEr0 发表于 2010-8-19 10:22:23

谢谢xiaoly99 分享!
页: [1]
查看完整版本: 换种方式,继续请教,谢谢