#include <iostream>
#include<Windows.h>
#define CW_DEV_SYM L"\\\\.\\slbkcdo_3948d33e"
int main() {
HANDLE device = NULL;
device = CreateFile(CW_DEV_SYM,GENERIC_READ|GENERIC_WRITE,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_SYSTEM,0);
if (device==INVALID_HANDLE_VALUE) {
printf("coworker demo:Open device failed.\r\n");
return -1;
}
else {
printf("coworker demo: Open device successfully. \r\n");
}
CloseHandle(device);
}
#include<ntddk.h>
#include<ntstrsafe.h>
VOID DriverUnload(PDRIVER_OBJECT driver) {
DbgPrint("first:Our driver is unloading...\r\n");
}
#define CWK_CDO_SYB_NAME L"\\??\\slbkcdo_3948d33e"
PDEVICE_OBJECT g_co = { 0 };
const GUID guid =
{ 0x8a32b368, 0x3249, 0x12e1, {0x92,0x16, 0x46, 0x1a, 0x21, 0x30, 0x29, 0x06} };
NTSTATUS InitDeviceAndSymbolic(IN PDRIVER_OBJECT driver) {
UNICODE_STRING cdo_name = RTL_CONSTANT_STRING(L"\\Device\\cwk_3948d33e");
NTSTATUS status = NULL;
NTSTATUS driverStatus = NULL;
UNICODE_STRING cdo_syb = RTL_CONSTANT_STRING(CWK_CDO_SYB_NAME);
IoDeleteSymbolicLink(&cdo_syb);
driverStatus = IoCreateDevice(driver, 0, &cdo_name, FILE_DEVICE_UNKNOWN, FILE_DEVICE_SECURE_OPEN
, FALSE, &g_co);
status = IoCreateSymbolicLink(&cdo_syb, &cdo_name);
if (!NT_SUCCESS(status)) {
return status;
}
else {
DbgPrint("成功");
}
}
NTSTATUS cwkDispatch(IN PDEVICE_OBJECT dev,IN PIRP irp) {
ULONG_PTR ret_len=sizeof(ULONG_PTR);
PIO_STACK_LOCATION irpsp = IoGetCurrentIrpStackLocation(irp);
#if DBG
__asm int 3
#endif
if (dev == g_co) {
if (irpsp->MajorFunction == IRP_MJ_CREATE || irpsp->MajorFunction == IRP_MJ_CLOSE) {
DbgPrint("IRP_MJ_CREATE||IRP_MJ_CLOSE STATUS=TURE");
irp->IoStatus.Information = ret_len;
irp->IoStatus.Status = STATUS_SUCCESS;
IoCompleteRequest(irp,IO_NO_INCREMENT);
return STATUS_SUCCESS;
}
if (irpsp->MajorFunction==IRP_MJ_DEVICE_CONTROL) {
DbgPrint("IRP_MJ_DEVICE_CONTROL STATUS=TRUE");
irp->IoStatus.Information = ret_len;
irp->IoStatus.Status = STATUS_SUCCESS;
IoCompleteRequest(irp, IO_NO_INCREMENT);
return STATUS_SUCCESS;
}
}
IoCompleteRequest(irp, IO_NO_INCREMENT);
return STATUS_SUCCESS;
}
NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING reg_path) {
ULONG i;
DbgPrint("内核通信测试DEMO");
InitDeviceAndSymbolic(driver);
for (i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++) {
driver->MajorFunction[i] = cwkDispatch;
}
driver->DriverUnload = DriverUnload;
return STATUS_SUCCESS;
}