生活随笔
收集整理的這篇文章主要介紹了
EXE和SYS通信IOCTL方式
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
EXE部分
[cpp]?view plaincopy
#ifndef??IOCTLS_H?? #define??IOCTLS_H?? ?? ?? #ifndef?CTL_CODE?? #pragma??message("CTL_CODE?undefined.?Include?winioctl.h?or?ntddk.h")?? #endif?? ?? ?? ?? #define?IOCTL_TEST1??CTL_CODE(FILE_DEVICE_UNKNOWN,0X800,METHOD_BUFFERED,FILE_ANY_ACCESS)?? ?? ?? #define?IOCTL_TEST2?CTL_CODE(FILE_DEVICE_UNKNOWN,0X801,METHOD_IN_DIRECT,FILE_ANY_ACCESS)?? #define?IOCTL_TEST3?CTL_CODE(FILE_DEVICE_UNKNOWN,0X802,METHOD_OUT_DIRECT,FILE_ANY_ACCESS)?? ?? ?? #define?IOCTL_TEST4?CTL_CODE(FILE_DEVICE_UNKNOWN,0X803,METHOD_NEITHER,FILE_ANY_ACCESS)?? ?? ?? #endif??
?
[cpp]?view plaincopy
#include?<stdio.h>?? #include?<Windows.h>?? #include?<WinIoCtl.h>?? #include?"Ioctl.h"?? ?? ?? ?? int?main?(void)?? {?? ????char?linkname[]="\\\\.\\HelloDDK";?? ????HANDLE?hDevice?=?CreateFileA(linkname,GENERIC_READ?|?GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);?? ????if?(hDevice?==?INVALID_HANDLE_VALUE)?? ????{?? ????????printf("Win32?error?code:?%d\n",GetLastError());?? ????????return?1;?? ????}?? ?? ?? ????UCHAR?InputBuffer[10]={0};?? ????UCHAR?OutputBuffer[10]={0};?? ????DWORD?dwOutput=0;?? ????memset(InputBuffer,0xBB,10);?? ?? ????if?(DeviceIoControl(hDevice,IOCTL_TEST1,InputBuffer,sizeof(InputBuffer),OutputBuffer,sizeof(OutputBuffer),&dwOutput,NULL))?? ????{?? ????????printf("讀入字節數%d\n",dwOutput);?? ????????for?(int?i=0;i<(int)dwOutput;i++)?? ????????{?? ????????????printf("%02X",OutputBuffer[i]);?? ????????}?? ????????printf("\n");?? ????}?? ????getchar();?? ????getchar();?? ?????? ????if?(DeviceIoControl(hDevice,IOCTL_TEST2,InputBuffer,sizeof(InputBuffer),OutputBuffer,sizeof(OutputBuffer),&dwOutput,NULL))?? ????{?? ????????printf("讀入字節數%d\n",dwOutput);?? ????????for?(int?i=0;i<(int)dwOutput;i++)?? ????????{?? ????????????printf("%02X",OutputBuffer[i]);?? ????????}?? ????????printf("\n");?? ????}?? ????getchar();?? ????getchar();?? ?? ????if?(DeviceIoControl(hDevice,IOCTL_TEST4,InputBuffer,sizeof(InputBuffer),OutputBuffer,sizeof(OutputBuffer),&dwOutput,NULL))?? ????{?? ????????printf("讀入字節數%d\n",dwOutput);?? ????????for?(int?i=0;i<(int)dwOutput;i++)?? ????????{?? ????????????printf("%02X",OutputBuffer[i]);?? ????????}?? ????????printf("\n");?? ????}?? ????getchar();?? ????getchar();?? ?? ?? ????CloseHandle(hDevice);?? ?? ????getchar();?? ????getchar();?? ????return?0;?? }??
?
?
?
?
SYS部分
[cpp]?view plaincopy
#pragma??message("哈哈哈哈哈哈哈哈哈哈哈哈哈哈11111111112222")?? #ifndef??IOCTLS_H?? #define?IOCTLS_H?? ?? ?? #ifndef?CTL_CODE?? #pragma??message("CTL_CODE?undefined.?Include?winioctl.h?or?ntddk.h")?? #endif?? ?? ?? ?? #define?IOCTL_TEST1??CTL_CODE(FILE_DEVICE_UNKNOWN,0X800,METHOD_BUFFERED,FILE_ANY_ACCESS)?? ?? ?? #define?IOCTL_TEST2?CTL_CODE(FILE_DEVICE_UNKNOWN,0X801,METHOD_IN_DIRECT,FILE_ANY_ACCESS)?? #define?IOCTL_TEST3?CTL_CODE(FILE_DEVICE_UNKNOWN,0X802,METHOD_OUT_DIRECT,FILE_ANY_ACCESS)?? ?? ?? #define?IOCTL_TEST4?CTL_CODE(FILE_DEVICE_UNKNOWN,0X803,METHOD_NEITHER,FILE_ANY_ACCESS)?? ?? ?? #endif??
?
[cpp]?view plaincopy
#pragma?once?? #include?<ntddk.h>?? #define?CountArray(Array)??(????sizeof(Array)???/???sizeof(Array[0])????)?? ?? #define?MAX_FILE_LENGTH?1024?? ?? typedef?struct?_DEVICE_EXTENSION?? {?? ????PDEVICE_OBJECT?pDevice;??????????????????????????????????????? ????UNICODE_STRING?ustrDeviceName;???????????????????? ????UNICODE_STRING?ustrSymLinkName;??????????????????? }DEVICE_EXTENSION,*PDEVICE_EXTENSION;?? ?? ?? ?? #ifdef?__cplusplus?? extern?"C"?NTSTATUS?DriverEntry(IN?PDRIVER_OBJECT?DriverObject,?IN?PUNICODE_STRING??RegistryPath);?? #endif?? ?? void?HelloUnload(IN?PDRIVER_OBJECT?DriverObject);????????????????????????????????????????????????????????? NTSTATUS?CreateDevice(PDRIVER_OBJECT?PDevObj);???????????????????????????????????????????????????? NTSTATUS?HelloDDKDispatchRoutine(IN?PDEVICE_OBJECT?pDevObj,IN?PIRP?pIrp);????? NTSTATUS?HelloDDKControl(IN?PDEVICE_OBJECT?pDevObj,IN?PIRP?pIrp);?????????????????????
?
[cpp]?view plaincopy
#include?"hello.h"?? #include?"Ioctl.h"?? ?? NTSTATUS?DriverEntry(IN?PDRIVER_OBJECT?DriverObject,?IN?PUNICODE_STRING??RegistryPath)?? {?? ????????DbgPrint("Hello?from!\n");?? ????????DriverObject->DriverUnload?=?HelloUnload;?? ????????for?(int?i=0;i<IRP_MJ_MAXIMUM_FUNCTION;i++)?? ????????{?? ????????????DriverObject->MajorFunction[i]=HelloDDKDispatchRoutine;?? ????????}?? ????????DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL]=HelloDDKControl;?? ?? ?? ?? #if?DBG?? ????????_asm?int?3?? #endif?? ?????????? ????????CreateDevice(DriverObject);?? ?? ????????return?STATUS_SUCCESS;?? }?? ?? ?? ?? ?? ?? void?HelloUnload(IN?PDRIVER_OBJECT?DriverObject)?? {?? ????????DbgPrint("Goodbye?from!\n");?? ????????PDEVICE_OBJECT?pNextObj=NULL;?? ????????pNextObj=DriverObject->DeviceObject;?? ?? ????????while?(pNextObj)?? ????????{?? ????????????PDEVICE_EXTENSION?pDevExt=(PDEVICE_EXTENSION)pNextObj->DeviceExtension;?? ?????????????? ????????????IoDeleteSymbolicLink(&pDevExt->ustrSymLinkName);?? ?????????????? ????????????IoDeleteDevice(pDevExt->pDevice);?? ????????????pNextObj=pNextObj->NextDevice;?? ????????}?? }?? ?? NTSTATUS?HelloDDKControl(IN?PDEVICE_OBJECT?pDevObj,IN?PIRP?pIrp)?? {?? #if?DBG?? ????_asm?int?3?? #endif?? ?? ????NTSTATUS?status=STATUS_SUCCESS;?? ?????? ????PIO_STACK_LOCATION?stack=IoGetCurrentIrpStackLocation(pIrp);?? ?????? ????ULONG?cbin=stack->Parameters.DeviceIoControl.InputBufferLength;?? ?????? ????ULONG?cbout=stack->Parameters.DeviceIoControl.OutputBufferLength;?? ?????? ????ULONG?code=stack->Parameters.DeviceIoControl.IoControlCode;?? ????ULONG?info=0;?? ?? ????switch?(code)?? ????{?? ????case?IOCTL_TEST1:????? ????????{?? ????????????UCHAR*?InputBuffer=(UCHAR*)pIrp->AssociatedIrp.SystemBuffer;?? ????????????for?(ULONG?i=0;i<cbin;i++)?? ????????????{?? ????????????????DbgPrint("%X\n",InputBuffer[i]);?? ????????????}?? ?? ?????????????? ????????????UCHAR*?OutputBuffer=(UCHAR*)pIrp->AssociatedIrp.SystemBuffer;?? ????????????memset(OutputBuffer,0XAA,cbout);?? ????????????info=cbout;?? ????????}?? ????????break;?? ????case?IOCTL_TEST2:?? ????case?IOCTL_TEST3:?? ????????{?? ?????????????? ????????????UCHAR*?InputBuffer=(UCHAR*)pIrp->AssociatedIrp.SystemBuffer;?? ????????????for?(ULONG?i=0;i<cbin;i++)?? ????????????{?? ????????????????DbgPrint("%X\n",InputBuffer[i]);?? ????????????}?? ?? ?????????????? ????????????DbgPrint("user?address:?0X%08X\n",MmGetMdlVirtualAddress(pIrp->MdlAddress));?? ????????????UCHAR*?OutputBuffer=(UCHAR*)MmGetSystemAddressForMdlSafe(pIrp->MdlAddress,NormalPagePriority);?? ?????????????? ????????????memset(OutputBuffer,0XAA,cbout);?? ????????????info=cbout;?? ????????}?? ????????break;?? ????case?IOCTL_TEST4:????? ????????{?? ?????????????? ????????????UCHAR*?UserInputBuffer=(UCHAR*)stack->Parameters.DeviceIoControl.Type3InputBuffer;?? ????????????DbgPrint("userInputBuffer:0X%0X\n",UserInputBuffer);?? ?????????????? ????????????PVOID?UserOutputBuffer=pIrp->UserBuffer;?? ????????????DbgPrint("UserOutputBuffer:0X%0X\n",UserOutputBuffer);?? ?? ????????????__try?? ????????????{?? ?????????????????? ????????????????ProbeForRead(UserInputBuffer,cbin,4);?? ?? ?????????????????? ????????????????for?(ULONG?i=0;i<cbin;i++)?? ????????????????{?? ????????????????????DbgPrint("%X\n",UserInputBuffer[i]);?? ????????????????}?? ?? ?????????????????? ????????????????ProbeForWrite(UserOutputBuffer,cbout,4);?? ?? ?????????????????? ????????????????memset(UserOutputBuffer,0XAA,cbout);?? ????????????????info=cbout;?? ????????????????DbgPrint("OK\n");?? ????????????}?? ????????????__except(EXCEPTION_EXECUTE_HANDLER)?? ????????????{?? ????????????????DbgPrint("打我PG我不乖\n");?? ????????????????status=STATUS_UNSUCCESSFUL;?? ????????????}?? ????????????info=cbout;?? ????????}?? ????????break;?? ????default:?? ????????status=STATUS_INVALID_VARIANT;?? ????}?? ?? ?????? ????pIrp->IoStatus.Status=status;?? ????pIrp->IoStatus.Information=info;?? ????IoCompleteRequest(pIrp,IO_NO_INCREMENT);?? ????return?status;?? }?? ?? ?? NTSTATUS?CreateDevice(PDRIVER_OBJECT?pDriver_Object)?? {?? ?????? ????NTSTATUS?status=STATUS_SUCCESS;?? ????PDEVICE_OBJECT?pDevObje=NULL;?? ????PDEVICE_EXTENSION?pDevExt=NULL;?? ?? ?????? ????UNICODE_STRING?devname;?? ????UNICODE_STRING?symLinkName;?? ????RtlInitUnicodeString(&devname,L"\\device\\hello");?? ????RtlInitUnicodeString(&symLinkName,L"\\??\\HelloDDK");?? ?? ?????? ????if?(IoCreateDevice(pDriver_Object,sizeof(PDEVICE_EXTENSION),&devname,FILE_DEVICE_UNKNOWN,NULL,TRUE,&pDevObje)!=STATUS_SUCCESS?)?? ????{?? ????????DbgPrint("創建設備失敗\n");?? ????????return?status;?? ????}?? ????pDevObje->Flags?|=?DO_DIRECT_IO;?? ????pDevExt=(PDEVICE_EXTENSION)pDevObje->DeviceExtension;?? ????pDevExt->pDevice=pDevObje;?? ????pDevExt->ustrDeviceName=devname;?? ????pDevExt->ustrSymLinkName=symLinkName;?? ?? ?????? ????if?(IoCreateSymbolicLink(&symLinkName,&devname)!=STATUS_SUCCESS?)?? ????{?? ????????DbgPrint("創建符號連接失敗\n");?? ????????IoDeleteDevice(pDevObje);?? ????????return?status;?? ????}?? ????return?STATUS_SUCCESS;?? }?? ?? ?? NTSTATUS?HelloDDKDispatchRoutine(IN?PDEVICE_OBJECT?pDevObj,IN?PIRP?pIrP)?? {?? ?? ?? ?? ?? ????PIO_STACK_LOCATION?stack?=?IoGetCurrentIrpStackLocation(pIrP);?? ?????? ????static?char*?irpname[]?=??? ????{?? ????????"IRP_MJ_CREATE",?? ????????"IRP_MJ_CREATE_NAMED_PIPE",?? ????????"IRP_MJ_CLOSE",?? ????????"IRP_MJ_READ",?? ????????"IRP_MJ_WRITE",?? ????????"IRP_MJ_QUERY_INFORMATION",?? ????????"IRP_MJ_SET_INFORMATION",?? ????????"IRP_MJ_QUERY_EA",?? ????????"IRP_MJ_SET_EA",?? ????????"IRP_MJ_FLUSH_BUFFERS",?? ????????"IRP_MJ_QUERY_VOLUME_INFORMATION",?? ????????"IRP_MJ_SET_VOLUME_INFORMATION",?? ????????"IRP_MJ_DIRECTORY_CONTROL",?? ????????"IRP_MJ_FILE_SYSTEM_CONTROL",?? ????????"IRP_MJ_DEVICE_CONTROL",?? ????????"IRP_MJ_INTERNAL_DEVICE_CONTROL",?? ????????"IRP_MJ_SHUTDOWN",?? ????????"IRP_MJ_LOCK_CONTROL",?? ????????"IRP_MJ_CLEANUP",?? ????????"IRP_MJ_CREATE_MAILSLOT",?? ????????"IRP_MJ_QUERY_SECURITY",?? ????????"IRP_MJ_SET_SECURITY",?? ????????"IRP_MJ_POWER",?? ????????"IRP_MJ_SYSTEM_CONTROL",?? ????????"IRP_MJ_DEVICE_CHANGE",?? ????????"IRP_MJ_QUERY_QUOTA",?? ????????"IRP_MJ_SET_QUOTA",?? ????????"IRP_MJ_PNP",?? ????};?? ?? ????UCHAR?type?=?stack->MajorFunction;?? ?? ????if?(type?>=?CountArray(irpname))?? ????????KdPrint(("無效的IRP類型?%X\n",?type));?? ????else?? ????????KdPrint(("%s\n",?irpname[type]));?? ?? ?? ?? ?? ????pIrP->IoStatus.Status=STATUS_SUCCESS;?????????????????????? ????pIrP->IoStatus.Information=0;?????????????????????????????????????????? ????IoCompleteRequest(pIrP,IO_NO_INCREMENT);?????????????? ????return?STATUS_SUCCESS;?? } ?
總結
以上是生活随笔為你收集整理的EXE和SYS通信IOCTL方式的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。