生活随笔
收集整理的這篇文章主要介紹了
EXE与SYS通信(其他模式)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
EXE部分
head.h
[cpp]?view plaincopy
#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
[cpp]?view plaincopy
#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
[cpp]?view plaincopy
#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部分
[cpp]?view plaincopy
#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;?? } ?
總結
以上是生活随笔為你收集整理的EXE与SYS通信(其他模式)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。