驱动层:- #include "ntddk.h"
- #define INITCODE code_seg("INIT")
- #define PAGECODE code_seg("PAGE")
- #pragma PAGECODE
- void MyDriverUnload(PDRIVER_OBJECT pDriverObject)
- {
- UNICODE_STRING symName;
- RtlInitUnicodeString(&symName, L"\\??\\FirstDeviceLinkName");
- if (pDriverObject->DeviceObject != NULL)
- {
- IoDeleteSymbolicLink(&symName);
- IoDeleteDevice(pDriverObject->DeviceObject);
- KdPrint(("Delete device success!"));
- }
- }
- #pragma INITCODE
- NTSTATUS CreateMyDevice(PDRIVER_OBJECT pDriverObject)
- {
- NTSTATUS Status;
- PDEVICE_OBJECT pDevObj;
- UNICODE_STRING DevName;
- UNICODE_STRING symName;
- RtlInitUnicodeString(&DevName, L"\\Device\\FirstDevice");
- Status = IoCreateDevice(pDriverObject, 0, &DevName, FILE_DEVICE_UNKNOWN,
- 0, TRUE, &pDevObj);
- if (!NT_SUCCESS(Status))
- {
- return Status;
- }
-
- pDevObj->Flags |= DO_BUFFERED_IO;
- RtlInitUnicodeString(&symName, L"\\??\\FirstDeviceLinkName");
- Status = IoCreateSymbolicLink(&symName, &DevName);
- if (!NT_SUCCESS(Status))
- {
- IoDeleteDevice(pDevObj);
- return Status;
- }
- return STATUS_SUCCESS;
- }
- #pragma PAGECODE
- NTSTATUS CreateCompleteRoutine(PDEVICE_OBJECT pDeviceObj, PIRP pIrp)
- {
- NTSTATUS Status;
- Status = STATUS_SUCCESS;
- KdPrint(("Create"));
- pIrp->IoStatus.Status = Status;
- pIrp->IoStatus.Information = 0;
- IoCompleteRequest(pIrp, IO_NO_INCREMENT);
- return Status;
- }
- #pragma PAGECODE
- NTSTATUS CloseCompleteRoutine(PDEVICE_OBJECT pDeviceObj, PIRP pIrp)
- {
- NTSTATUS Status;
- Status = STATUS_SUCCESS;
- KdPrint(("Close"));
- pIrp->IoStatus.Status = Status;
- pIrp->IoStatus.Information = 0;
- IoCompleteRequest(pIrp, IO_NO_INCREMENT);
- return Status;
- }
- #pragma PAGECODE
- NTSTATUS ReadCompleteRoutine(PDEVICE_OBJECT pDeviceObj, PIRP pIrp)
- {
- NTSTATUS Status;
- Status = STATUS_SUCCESS;
- KdPrint(("Read"));
- pIrp->IoStatus.Status = Status;
- pIrp->IoStatus.Information = 0;
- IoCompleteRequest(pIrp, IO_NO_INCREMENT);
- return Status;
- }
- #pragma PAGECODE
- NTSTATUS WriteCompleteRoutine(PDEVICE_OBJECT pDeviceObj, PIRP pIrp)
- {
- NTSTATUS Status;
- Status = STATUS_SUCCESS;
- KdPrint(("Write"));
- pIrp->IoStatus.Status = Status;
- pIrp->IoStatus.Information = 0;
- IoCompleteRequest(pIrp, IO_NO_INCREMENT);
- return Status;
- }
- #pragma INITCODE
- NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegistryPath)
- {
- NTSTATUS Status;
- Status = CreateMyDevice(pDriverObject);
- if (!NT_SUCCESS(Status))
- {
- KdPrint(("Create device failed!"));
- }
- else
- {
- KdPrint(("Create device success!"));
- KdPrint(("%wZ", pRegistryPath));
- }
- pDriverObject->MajorFunction[IRP_MJ_CREATE] = CreateCompleteRoutine;
- pDriverObject->MajorFunction[IRP_MJ_CLOSE] = CloseCompleteRoutine;
- pDriverObject->MajorFunction[IRP_MJ_READ] = ReadCompleteRoutine;
- pDriverObject->MajorFunction[IRP_MJ_WRITE] = WriteCompleteRoutine;
- pDriverObject->DriverUnload = MyDriverUnload;
- return STATUS_SUCCESS;
- }
复制代码 应用层:- void CCheckMyDriverDlg::OnButton1()
- {
- // TODO: Add your control notification handler code here
-
- HANDLE hDevice = CreateFile(TEXT("\\\\.\\FirstDeviceLinkName"), GENERIC_READ | GENERIC_WRITE, 0, NULL,
- OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
-
- if (hDevice == INVALID_HANDLE_VALUE)
- {
- CString str;
- str.Format("%d", GetLastError());
- AfxMessageBox("Open device failed! " + str);
- return;
- }
- CloseHandle(hDevice);
- }
复制代码 |