换种方式,继续请教,谢谢
现在有个驱动代码,没有错误,但是,怎么用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;
附上VB代码
希望小李同学给我改改 我看xiaoly被你气糊涂了 呵呵,那就TA帮帮忙吧
向小李老师道歉~
俺太菜了~:) 这个我也不会,你还是用回我给你的模板吧。 模板的VB部分那句代码填写什么? TA兄弟,
把你的那个模板的VB代码补上吧
还有,我以前用你提供的工具能成功编译你的那个模板
后来我有装了一个ddk,编译你的模板,就出错
不知道什么原因呢 你那个代码,用四个字来说,就是"垃圾代码".
你这个修改好的压缩包都要389KB,而我的Dew也只有247KB.
我已经修改好了,把完整的垃圾代码传上来.
还有,不是我打击OK大哥.您这份驱动代码应该不是您写的吧.您说过只提一个问题,现在不断的提问题,提问题,提了多少个问题?您却还是搞不懂Ioctl,连最起码的Ioctl Code都搞不懂.连字符串都......不说了,不然又要被某些"Zzzianses"说打击新手了. DbgPrint("输入缓冲数据内容:%u 输入缓冲数据长度:%u",*(PULONG)pIrp->AssociatedIrp.SystemBuffer,cbin);
红色的地方还是不明白怎么回事
呵呵,高手,解释一下
谢谢 谢谢xiaoly99 分享!
页:
[1]