EXE与SYS通信(其他模式)
来源:互联网 发布:淘宝任务平台 app 编辑:程序博客网 时间:2024/05/21 07:03
EXE部分
head.h
- #ifndef CTL_CODE
- #pragma message("\n \n-----------EXE . Include winioctl.h ")
- #include<winioctl.h> //CTL_CODE ntddk.h wdm.h
- #else
- #pragma message("\n \n----------SYS NO Include winioctl.h ")
- #endif
-
- #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_NEITHER,FILE_ANY_ACCESS)
- #define sub_code CTL_CODE(FILE_DEVICE_UNKNOWN, 0x801, METHOD_NEITHER,FILE_ANY_ACCESS)
main.cpp
- #include <stdio.h>
- #include <tchar.h>
- #include <windows.h>
- #include "head.h"
-
-
- int add (HANDLE hDevice ,int a,int b)
- {
- int port[2]={a,b};
- int bufret=0;
- ULONG dwWrite=0;
- DeviceIoControl(hDevice,add_code,&port,sizeof(port),&bufret,sizeof(bufret),&dwWrite,NULL);
- return bufret;
-
- }
- int main (void)
- {
- getchar();
- getchar();
- HANDLE hDevice=CreateFile(TEXT("\\\\.\\My_DriverLinkName"),
- GENERIC_READ|GENERIC_WRITE,
- 0,
- NULL,
- OPEN_EXISTING,
- FILE_ATTRIBUTE_NORMAL,
- NULL);
- if (hDevice==INVALID_HANDLE_VALUE)
- {
- printf("打开设备失败\n");
- getchar();
- getchar();
- return 0;
- }
- int k=add(hDevice,11,22);
- printf("%d\n",k);
-
-
-
- getchar();
- getchar();
-
- return 0;
- }
SYS部分
head.h
- #ifndef CTL_CODE
- #pragma message("\n \n-----------EXE . Include winioctl.h ")
- #include<winioctl.h> //CTL_CODE ntddk.h wdm.h
- #else
- #pragma message("\n \n----------SYS NO Include winioctl.h ")
- #endif
-
- #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_NEITHER,FILE_ANY_ACCESS)
- #define sub_code CTL_CODE(FILE_DEVICE_UNKNOWN, 0x801, METHOD_NEITHER,FILE_ANY_ACCESS)
cpp部分
- #include <ntdef.h>
- #include <ntddk.h>
- #include "head.h"
-
- #ifdef __cplusplus
- extern "C" NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath);
- #endif
-
- NTSTATUS ddk_DispatchRoutine_CONTROL(IN PDEVICE_OBJECT pDevobj,IN PIRP pIrp );
- void TestDDK125096Unload(IN PDRIVER_OBJECT DriverObject);
- NTSTATUS CreateMyDevice (IN PDRIVER_OBJECT pDriverObject);
-
-
-
- NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)
- {
-
- DbgPrint("Hello from TestDDK125096!\n");
- DriverObject->DriverUnload = TestDDK125096Unload;
- DriverObject->MajorFunction[IRP_MJ_CREATE]=ddk_DispatchRoutine_CONTROL;
- DriverObject->MajorFunction[IRP_MJ_CLOSE]=ddk_DispatchRoutine_CONTROL;
- DriverObject->MajorFunction[IRP_MJ_READ]=ddk_DispatchRoutine_CONTROL;
- DriverObject->MajorFunction[IRP_MJ_CLOSE]=ddk_DispatchRoutine_CONTROL;
- DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL]=ddk_DispatchRoutine_CONTROL;
-
- CreateMyDevice(DriverObject);
- return STATUS_SUCCESS;
- }
-
- void TestDDK125096Unload(IN PDRIVER_OBJECT DriverObject)
- {
- DbgPrint("Goodbye from TestDDK125096!\n");
- PDEVICE_OBJECT pDev;
- UNICODE_STRING symLinkName;
- pDev=DriverObject->DeviceObject;
- IoDeleteDevice(pDev);
-
-
- RtlInitUnicodeString(&symLinkName,L"\\??\\My_DriverLinkName");
-
- IoDeleteSymbolicLink(&symLinkName);
- KdPrint(("驱动成功被卸载...OK-----------"));
-
-
- DbgPrint("卸载成功");
-
- }
-
-
- NTSTATUS ddk_DispatchRoutine_CONTROL(IN PDEVICE_OBJECT pDevobj,IN PIRP pIrp )
- {
- ULONG info;
-
- PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(pIrp);
- ULONG mf=stack->MajorFunction;
- switch (mf)
- {
- case IRP_MJ_DEVICE_CONTROL:
- {
- KdPrint(("Enter myDriver_DeviceIOControl\n"));
- NTSTATUS status = STATUS_SUCCESS;
-
-
- ULONG cbin = stack->Parameters.DeviceIoControl.InputBufferLength;
-
- ULONG cbout = stack->Parameters.DeviceIoControl.OutputBufferLength;
-
- ULONG code = stack->Parameters.DeviceIoControl.IoControlCode;
- switch (code)
- {
- case add_code:
- {
- int a,b;
- KdPrint(("add_code 1111111111111111111\n"));
- int * InputBuffer=(int*)stack->Parameters.DeviceIoControl.Type3InputBuffer;
- __try
- {
- ProbeForRead(InputBuffer,cbin,__alignof(int));
- _asm
- {
- mov eax,InputBuffer
- mov ebx,[eax]
- mov a,ebx
- mov ebx,[eax+4]
- mov b,ebx
- }
- KdPrint(("a=%d,b=%d \n", a,b));
-
- a=a+b;
- int* OutputBuffer=(int*)pIrp->UserBuffer;
- ProbeForWrite(OutputBuffer,cbout,sizeof(int));
- KdPrint(("OutputBuffer=%x",OutputBuffer));
- _asm
- {
- mov eax,a
- mov ebx,OutputBuffer
- mov [ebx],eax
-
- }
- KdPrint(("a+b=%d \n",a));
-
-
- }
- __except(EXCEPTION_EXECUTE_HANDLER)
- {
- KdPrint(("指定地址不可读 或者 写 \n"));
- }
-
-
- info = 4;
-
- break;
- }
- case sub_code:
- {
- break;
- }
- }
- break;
- }
- case IRP_MJ_CREATE:
- {
- break;
- }
- case IRP_MJ_CLOSE:
- {
- break;
- }
- case IRP_MJ_READ:
- {
- break;
- }
-
- }
-
-
- pIrp->IoStatus.Information=info;
- pIrp->IoStatus.Status=STATUS_SUCCESS;
- IoCompleteRequest(pIrp,IO_NO_INCREMENT);
- KdPrint(("离开派遣函数\n"));
- return STATUS_SUCCESS;
- }
-
-
- NTSTATUS CreateMyDevice (IN PDRIVER_OBJECT pDriverObject)
- {
- NTSTATUS status;
- PDEVICE_OBJECT pDevObj;
-
-
- UNICODE_STRING devName;
- UNICODE_STRING symLinkName;
- RtlInitUnicodeString(&devName,L"\\Device\\125DDK_Device");
-
-
- status = IoCreateDevice( pDriverObject,\
- 0,\
- &devName,\
- FILE_DEVICE_UNKNOWN,\
- 0, TRUE,\
- &pDevObj);
- if (!NT_SUCCESS(status))
- {
- if (status==STATUS_INSUFFICIENT_RESOURCES)
- {
- KdPrint(("资源不足 STATUS_INSUFFICIENT_RESOURCES"));
- }
- if (status==STATUS_OBJECT_NAME_EXISTS )
- {
- KdPrint(("指定对象名存在"));
- }
- if (status==STATUS_OBJECT_NAME_COLLISION)
- {
- KdPrint(("//对象名有冲突"));
- }
- KdPrint(("设备创建失败...++++++++"));
- return status;
- }
- KdPrint(("设备创建成功...++++++++"));
-
- pDevObj->Flags |= DO_BUFFERED_IO;
-
-
- RtlInitUnicodeString(&symLinkName,L"\\??\\My_DriverLinkName");
- status = IoCreateSymbolicLink( &symLinkName,&devName );
- if (!NT_SUCCESS(status))
- {
- IoDeleteDevice( pDevObj );
- return status;
- }
- return STATUS_SUCCESS;
- }