|
现在有个驱动代码,
没有错误,但是,怎么用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[i]));
- }
- 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[IRP_MJ_CREATE] = MyDispatch;
- pDriverObject->MajorFunction[IRP_MJ_CLOSE] = MyDispatch;
- pDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = MyIOCTL;
- CreateDevice(pDriverObject);
- return STATUS_SUCCESS;
复制代码 |
|