diff --git a/Inject_By_kernelAPC/ReadMe.md b/Inject_By_kernelAPC/ReadMe.md new file mode 100644 index 0000000..e69de29 diff --git a/Inject_By_kernelAPC/ring0/KeInjectApc.c b/Inject_By_kernelAPC/ring0/KeInjectApc.c new file mode 100644 index 0000000..f8b46d4 --- /dev/null +++ b/Inject_By_kernelAPC/ring0/KeInjectApc.c @@ -0,0 +1,424 @@ + + +#ifndef CXX_KEINJECTAPC_H +# include "KeInjectApc.h" +#endif + + +ULONG ApcStateOffset; +PLDR_LOAD_DLL LdrLoadDll; + + +NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject,PUNICODE_STRING pRegistryPath) +{ + NTSTATUS Status; + PDEVICE_OBJECT DeviceObject; + PEPROCESS Process; + PETHREAD Thread; + PKAPC_STATE ApcState; + + PVOID KdVersionBlock,NtdllBase; + PULONG ptr,Functions,Names; + PUSHORT Ordinals; + + PLDR_DATA_TABLE_ENTRY MmLoadedUserImageList,ModuleEntry; + ULONG i; + + PIMAGE_DOS_HEADER pIDH; + PIMAGE_NT_HEADERS pINH; + PIMAGE_EXPORT_DIRECTORY pIED; + + UNICODE_STRING uniDeviceName; + UNICODE_STRING uniLinkName; + + RtlInitUnicodeString(&uniDeviceName,DEVICE_NAME); + + RtlInitUnicodeString(&uniLinkName,LINK_NAME); + + for (i=0;iMajorFunction[i] = DefaultPassThrough; + } + DriverObject->DriverUnload = UnloadDriver; + + DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DriverDispatch; + + //创建设备对象 + Status = IoCreateDevice(DriverObject,0,&uniDeviceName,FILE_DEVICE_UNKNOWN,0,FALSE,&DeviceObject); + + if (!NT_SUCCESS(Status)) + { + + return Status; + } + + Status = IoCreateSymbolicLink(&uniLinkName,&uniDeviceName); + + if (!NT_SUCCESS(Status)) + { + IoDeleteDevice(DeviceObject); + + return Status; + } + + //使当前线程运行在第一个处理器上 + KeSetSystemAffinityThread(1); + KdVersionBlock=(PVOID)__readfsdword(0x34); //得到KdVersionBlock + KeRevertToUserAffinityThread();//恢复线程运行的处理器 + MmLoadedUserImageList=*(PLDR_DATA_TABLE_ENTRY*)((PUCHAR)KdVersionBlock+0x228); // Get the MmLoadUserImageList + + /* + kd> !pcr + KPCR for Processor 0 at 83f3ec00: + + + kd> dt _kpcr 83f3ec00 + +0x034 KdVersionBlock : 0x83f3dc00 Void + + kd> dd 0x83f3dc00+0x228 + 83f3de28 83f5de38 00000000 83e5dfa8 00000000 + 83f3de38 00000000 00000000 83f7d8c0 00000000 + 83f3de48 83f7d560 00000000 83f5d84c 00000000 + + + kd> dd 83f5de38 + 83f5de38 8706b1e8 877cb660 00000000 00000000 + 83f5de48 00000000 00000000 00040107 00000000 + 83f5de58 865d0690 865d0690 c0403188 0007ff7e + + kd> dt _LDR_DATA_TABLE_ENTRY 8706b1e8 + nt!_LDR_DATA_TABLE_ENTRY + +0x000 InLoadOrderLinks : _LIST_ENTRY [ 0x8713b4e0 - 0x83f5de38 ] + +0x008 InMemoryOrderLinks : _LIST_ENTRY [ 0x0 - 0x0 ] + +0x010 InInitializationOrderLinks : _LIST_ENTRY [ 0x0 - 0x0 ] + +0x018 DllBase : 0x77ce0000 Void + +0x01c EntryPoint : (null) + +0x020 SizeOfImage : 0x13c000 + +0x024 FullDllName : _UNICODE_STRING "\Windows\System32\ntdll.dll" + +0x02c BaseDllName : _UNICODE_STRING "" + +0x034 Flags : 0 + +0x038 LoadCount : 1 + +0x03a TlsIndex : 0 + +0x03c HashLinks : _LIST_ENTRY [ 0x0 - 0x1490d9 ] + +0x03c SectionPointer : (null) + +0x040 CheckSum : 0x1490d9 + +0x044 TimeDateStamp : 0 + +0x044 LoadedImports : (null) + +0x048 EntryPointActivationContext : (null) + +0x04c PatchInformation : (null) + +0x050 ForwarderLinks : _LIST_ENTRY [ 0x0 - 0x0 ] + +0x058 ServiceTagLinks : _LIST_ENTRY [ 0x0 - 0x57005c ] + +0x060 StaticLinks : _LIST_ENTRY [ 0x6e0069 - 0x6f0064 ] + +0x068 ContextInformation : 0x00730077 Void + +0x06c OriginalBase : 0x53005c + +0x070 LoadTime : _LARGE_INTEGER 0x650074`00730079 + + */ + DbgPrint("KdVersionBlock address: %#x",KdVersionBlock); + DbgPrint("MmLoadedUserImageList address: %#x",MmLoadedUserImageList); + + ModuleEntry=(PLDR_DATA_TABLE_ENTRY)MmLoadedUserImageList->InLoadOrderLinks.Flink; //第一模块 + NtdllBase=ModuleEntry->DllBase; //ntdll基地址 + + DbgPrint("ntdll base address: %#x",NtdllBase); + + pIDH=(PIMAGE_DOS_HEADER)NtdllBase; + pINH=(PIMAGE_NT_HEADERS)((PUCHAR)NtdllBase+pIDH->e_lfanew); + pIED=(PIMAGE_EXPORT_DIRECTORY)((PUCHAR)NtdllBase+pINH->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress); + + Functions=(PULONG)((PUCHAR)NtdllBase+pIED->AddressOfFunctions); + Names=(PULONG)((PUCHAR)NtdllBase+pIED->AddressOfNames); + + Ordinals=(PUSHORT)((PUCHAR)NtdllBase+pIED->AddressOfNameOrdinals); + + //搜索LdrLoadDll + for(i=0;iNumberOfNames;i++) + { + if(!strcmp((char*)NtdllBase+Names[i],"LdrLoadDll")) + { + LdrLoadDll=(PLDR_LOAD_DLL)((PUCHAR)NtdllBase+Functions[Ordinals[i]]); + break; + } + } + + DbgPrint("LdrLoadDll address: %#x",LdrLoadDll); + + Process=PsGetCurrentProcess(); + Thread=PsGetCurrentThread(); + + ptr=(PULONG)Thread; + + //确定ApcState在EThread中的偏移 + for(i=0;i<512;i++) + { + if(ptr[i]==(ULONG)Process) + { + ApcState=CONTAINING_RECORD(&ptr[i],KAPC_STATE,Process); + ApcStateOffset=(ULONG)ApcState-(ULONG)Thread; + break; + } + } + + DbgPrint("ApcState offset: %#x",ApcStateOffset); + DbgPrint("DLL injection driver loaded."); + return STATUS_SUCCESS; +} + + + + +NTSTATUS DefaultPassThrough(PDEVICE_OBJECT DeviceObject,PIRP Irp) +{ + Irp->IoStatus.Information = 0; + Irp->IoStatus.Status = STATUS_SUCCESS; + + IoCompleteRequest(Irp,IO_NO_INCREMENT); + + return STATUS_SUCCESS; +} + + +void UnloadDriver(PDRIVER_OBJECT DriverObject) +{ + UNICODE_STRING uniLinkName; + PDEVICE_OBJECT CurrentDeviceObject; + PDEVICE_OBJECT NextDeviceObject; + + RtlInitUnicodeString(&uniLinkName,LINK_NAME); + + IoDeleteSymbolicLink(&uniLinkName); + + if (DriverObject->DeviceObject!=NULL) + { + CurrentDeviceObject = DriverObject->DeviceObject; + + while(CurrentDeviceObject!=NULL) + { + NextDeviceObject = CurrentDeviceObject->NextDevice; + IoDeleteDevice(CurrentDeviceObject); + + CurrentDeviceObject = NextDeviceObject; + } + } + DbgPrint("UnloadDriver\r\n"); +} + + +void NTAPI InjectDllApc(PVOID NormalContext,PVOID SystemArgument1,PVOID SystemArgument2) +{ + PKINJECT inject=(PKINJECT)NormalContext; + + inject->LdrLoadDll(NULL,NULL,&inject->DllName,&inject->DllBase); + inject->Executed=TRUE; +} + + +void NTAPI KernelRoutine(PKAPC apc,PKNORMAL_ROUTINE* NormalRoutine,PVOID* NormalContext,\ + PVOID* SystemArgument1,PVOID* SystemArgument2) +{ + ExFreePool(apc); +} + +BOOLEAN InjectDll(PINJECT_INFO InjectInfo) +{ + PEPROCESS Process; + PETHREAD Thread; + PKINJECT mem; + ULONG size; + PKAPC_STATE ApcState; + PKAPC apc; + PVOID buffer; + PSYSTEM_PROCESS_INFO pSpi; + LARGE_INTEGER delay; + buffer=ExAllocatePool(NonPagedPool,1024*1024); + if(!buffer) + { + DbgPrint("Error: Unable to allocate memory for the process thread list."); + return FALSE; + } + + //5 SystemProcessInformation, + if(!NT_SUCCESS(ZwQuerySystemInformation(5,buffer,1024*1024,NULL))) + { + DbgPrint("Error: Unable to query process thread list."); + + ExFreePool(buffer); + return FALSE; + } + + pSpi=(PSYSTEM_PROCESS_INFO)buffer; + + //找到目标进程 + while(pSpi->NextEntryOffset) + { + if(pSpi->UniqueProcessId==InjectInfo->ProcessId) + { + DbgPrint("Target thread found. TID: %d",pSpi->Threads[0].ClientId.UniqueThread); + break; + } + + pSpi=(PSYSTEM_PROCESS_INFO)((PUCHAR)pSpi+pSpi->NextEntryOffset); + } + + // 引用目标进程EProcess, + if(!NT_SUCCESS(PsLookupProcessByProcessId(InjectInfo->ProcessId,&Process))) + { + DbgPrint("Error: Unable to reference the target process."); + ExFreePool(buffer); + return FALSE; + } + + DbgPrint("Process name: %s",PsGetProcessImageFileName(Process)); + DbgPrint("EPROCESS address: %#x",Process); + + //目标进程主线程 + if(!NT_SUCCESS(PsLookupThreadByThreadId(pSpi->Threads[0].ClientId.UniqueThread,&Thread))) + { + DbgPrint("Error: Unable to reference the target thread."); + ObDereferenceObject(Process); + ExFreePool(buffer); + return FALSE; + } + + DbgPrint("ETHREAD address: %#x",Thread); + + ExFreePool(buffer); + //切入到目标进程 + KeAttachProcess(Process); + + mem=NULL; + size=4096; + + //在目标进程申请内存 + if(!NT_SUCCESS(ZwAllocateVirtualMemory(NtCurrentProcess(),(PVOID*)&mem,0,&size,MEM_COMMIT|MEM_RESERVE,PAGE_EXECUTE_READWRITE))) + { + DbgPrint("Error: Unable to allocate memory in the target process."); + KeDetachProcess(); + + ObDereferenceObject(Process); + ObDereferenceObject(Thread); + return FALSE; + } + + DbgPrint("Memory allocated at %#x",mem); + mem->LdrLoadDll=LdrLoadDll; + wcscpy(mem->Buffer,InjectInfo->DllName); + RtlInitUnicodeString(&mem->DllName,mem->Buffer); + ApcState=(PKAPC_STATE)((PUCHAR)Thread+ApcStateOffset); + ApcState->UserApcPending=TRUE; + memcpy((PKINJECT)(mem+1),InjectDllApc,(ULONG)KernelRoutine-(ULONG)InjectDllApc); + DbgPrint("APC code address: %#x",(PKINJECT)(mem+1)); + + //申请apc对象 + apc=(PKAPC)ExAllocatePool(NonPagedPool,sizeof(KAPC)); + + if(!apc) + { + DbgPrint("Error: Unable to allocate the APC object."); + size=0; + ZwFreeVirtualMemory(NtCurrentProcess(),(PVOID*)&mem,&size,MEM_RELEASE); + KeDetachProcess(); + ObDereferenceObject(Process); + ObDereferenceObject(Thread); + return FALSE; + } + + KeInitializeApc(apc, + Thread, //目标进程主线程 + OriginalApcEnvironment, //目标apcz状态 + KernelRoutine, //内核apc总入口 + NULL, //Rundown Rounine=NULL + (PKNORMAL_ROUTINE)((PKINJECT)mem+1), //用户空间的总apc + UserMode, //插入到用户apc队列 + mem); // 自己的apc队列 + + DbgPrint("Inserting APC to target thread"); + + // 插入apc队列 + if(!KeInsertQueueApc(apc,NULL,NULL,IO_NO_INCREMENT)) + { + DbgPrint("Error: Unable to insert APC to target thread."); + size=0; + ZwFreeVirtualMemory(NtCurrentProcess(),(PVOID*)&mem,&size,MEM_RELEASE); + KeDetachProcess(); + ObDereferenceObject(Process); + ObDereferenceObject(Thread); + ExFreePool(apc); + return FALSE; + } + + delay.QuadPart=-100*10000; + while(!mem->Executed) + { + KeDelayExecutionThread(KernelMode,FALSE,&delay); //等待apc执行 + } + if(!mem->DllBase) + { + DbgPrint("Error: Unable to inject DLL into target process."); + size=0; + ZwFreeVirtualMemory(NtCurrentProcess(),(PVOID*)&mem,&size,MEM_RELEASE); + KeDetachProcess(); + ObDereferenceObject(Process); + ObDereferenceObject(Thread); + return FALSE; + } + + DbgPrint("DLL injected at %#x",mem->DllBase); + size=0; + ZwFreeVirtualMemory(NtCurrentProcess(),(PVOID*)&mem,&size,MEM_RELEASE); + ObDereferenceObject(Process); + ObDereferenceObject(Thread); + return TRUE; +} + +NTSTATUS DriverDispatch(PDEVICE_OBJECT DeviceObject,PIRP Irp) +{ + PIO_STACK_LOCATION io; + PINJECT_INFO InjectInfo; + NTSTATUS Status = STATUS_SUCCESS; + PIO_STACK_LOCATION IrpSp; + PVOID InputBuffer = NULL; + PVOID OutputBuffer = NULL; + ULONG_PTR InputSize = 0; + ULONG_PTR OutputSize = 0; + ULONG_PTR IoControlCode = 0; + + IrpSp = IoGetCurrentIrpStackLocation(Irp); + InputBuffer = OutputBuffer = Irp->AssociatedIrp.SystemBuffer; + InputSize = IrpSp->Parameters.DeviceIoControl.InputBufferLength; + OutputSize = IrpSp->Parameters.DeviceIoControl.OutputBufferLength; + IoControlCode = IrpSp->Parameters.DeviceIoControl.IoControlCode; + + switch(IoControlCode) + { + case CTL_KEINJECTAPC: + + InjectInfo=(PINJECT_INFO)InputBuffer; + + if(!InjectInfo) + { + Status=STATUS_INSUFFICIENT_RESOURCES; + break; + } + + if(!InjectDll(InjectInfo)) + { + Status=STATUS_UNSUCCESSFUL; + break; + } + + Status=STATUS_SUCCESS; + Irp->IoStatus.Information=0; + + break; + + default: + Status=STATUS_INVALID_DEVICE_REQUEST; + break; + } + + Irp->IoStatus.Status=Status; + + IoCompleteRequest(Irp,IO_NO_INCREMENT); + return Status; +} diff --git a/Inject_By_kernelAPC/ring0/KeInjectApc.h b/Inject_By_kernelAPC/ring0/KeInjectApc.h new file mode 100644 index 0000000..a52dbdc --- /dev/null +++ b/Inject_By_kernelAPC/ring0/KeInjectApc.h @@ -0,0 +1,184 @@ + + +#ifndef CXX_KEINJECTAPC_H +#define CXX_KEINJECTAPC_H + + + +#include +#include +#include + +#endif + + +#define DEVICE_NAME L"\\Device\\DriverDevice" +#define LINK_NAME L"\\DosDevices\\DriverLink" + +#define CTL_KEINJECTAPC \ + CTL_CODE(FILE_DEVICE_UNKNOWN,0x830,METHOD_BUFFERED,FILE_ANY_ACCESS) + +typedef struct _SYSTEM_THREAD_INFORMATION +{ + LARGE_INTEGER KernelTime; + LARGE_INTEGER UserTime; + LARGE_INTEGER CreateTime; + ULONG WaitTime; + PVOID StartAddress; + CLIENT_ID ClientId; + KPRIORITY Priority; + LONG BasePriority; + ULONG ContextSwitches; + ULONG ThreadState; + KWAIT_REASON WaitReason; +}SYSTEM_THREAD_INFORMATION,*PSYSTEM_THREAD_INFORMATION; + +typedef struct _SYSTEM_PROCESS_INFO +{ + ULONG NextEntryOffset; + ULONG NumberOfThreads; + LARGE_INTEGER WorkingSetPrivateSize; + ULONG HardFaultCount; + ULONG NumberOfThreadsHighWatermark; + ULONGLONG CycleTime; + LARGE_INTEGER CreateTime; + LARGE_INTEGER UserTime; + LARGE_INTEGER KernelTime; + UNICODE_STRING ImageName; + KPRIORITY BasePriority; + HANDLE UniqueProcessId; + HANDLE InheritedFromUniqueProcessId; + ULONG HandleCount; + ULONG SessionId; + ULONG_PTR UniqueProcessKey; + SIZE_T PeakVirtualSize; + SIZE_T VirtualSize; + ULONG PageFaultCount; + SIZE_T PeakWorkingSetSize; + SIZE_T WorkingSetSize; + SIZE_T QuotaPeakPagedPoolUsage; + SIZE_T QuotaPagedPoolUsage; + SIZE_T QuotaPeakNonPagedPoolUsage; + SIZE_T QuotaNonPagedPoolUsage; + SIZE_T PagefileUsage; + SIZE_T PeakPagefileUsage; + SIZE_T PrivatePageCount; + LARGE_INTEGER ReadOperationCount; + LARGE_INTEGER WriteOperationCount; + LARGE_INTEGER OtherOperationCount; + LARGE_INTEGER ReadTransferCount; + LARGE_INTEGER WriteTransferCount; + LARGE_INTEGER OtherTransferCount; + SYSTEM_THREAD_INFORMATION Threads[1]; +}SYSTEM_PROCESS_INFO,*PSYSTEM_PROCESS_INFO; + +typedef struct _LDR_DATA_TABLE_ENTRY +{ + LIST_ENTRY InLoadOrderLinks; + LIST_ENTRY InMemoryOrderLinks; + LIST_ENTRY InInitializationOrderLinks; + PVOID DllBase; + PVOID EntryPoint; + ULONG SizeOfImage; + UNICODE_STRING FullDllName; + UNICODE_STRING BaseDllName; + ULONG Flags; + USHORT LoadCount; + USHORT TlsIndex; + + union + { + LIST_ENTRY HashLinks; + + struct + { + PVOID SectionPointer; + ULONG CheckSum; + }; + }; + + union + { + ULONG TimeDateStamp; + PVOID LoadedImports; + }; + + struct _ACTIVATION_CONTEXT * EntryPointActivationContext; + PVOID PatchInformation; + LIST_ENTRY ForwarderLinks; + LIST_ENTRY ServiceTagLinks; + LIST_ENTRY StaticLinks; +}LDR_DATA_TABLE_ENTRY,*PLDR_DATA_TABLE_ENTRY; + + +typedef struct _INJECT_INFO +{ + ULONG ProcessId; + wchar_t DllName[1024]; +}INJECT_INFO,*PINJECT_INFO; + +typedef NTSTATUS (*PLDR_LOAD_DLL)(PWSTR,PULONG,PUNICODE_STRING,PVOID*); + +typedef struct _KINJECT +{ + UNICODE_STRING DllName; + wchar_t Buffer[1024]; + PLDR_LOAD_DLL LdrLoadDll; + PVOID DllBase; + ULONG Executed; +}KINJECT,*PKINJECT; + +typedef enum _KAPC_ENVIRONMENT +{ + OriginalApcEnvironment, + AttachedApcEnvironment, + CurrentApcEnvironment, + InsertApcEnvironment +}KAPC_ENVIRONMENT,*PKAPC_ENVIRONMENT; + +typedef VOID (NTAPI *PKNORMAL_ROUTINE)( + PVOID NormalContext, + PVOID SystemArgument1, + PVOID SystemArgument2 + ); + +typedef VOID KKERNEL_ROUTINE( + PRKAPC Apc, + PKNORMAL_ROUTINE *NormalRoutine, + PVOID *NormalContext, + PVOID *SystemArgument1, + PVOID *SystemArgument2 + ); + +typedef KKERNEL_ROUTINE (NTAPI *PKKERNEL_ROUTINE); + +typedef VOID (NTAPI *PKRUNDOWN_ROUTINE)( + PRKAPC Apc + ); + +void KeInitializeApc( + PRKAPC Apc, + PRKTHREAD Thread, + KAPC_ENVIRONMENT Environment, + PKKERNEL_ROUTINE KernelRoutine, + PKRUNDOWN_ROUTINE RundownRoutine, + PKNORMAL_ROUTINE NormalRoutine, + KPROCESSOR_MODE ProcessorMode, + PVOID NormalContext + ); + +BOOLEAN KeInsertQueueApc( + PRKAPC Apc, + PVOID SystemArgument1, + PVOID SystemArgument2, + KPRIORITY Increment + ); + + + +NTSTATUS ZwQuerySystemInformation(ULONG InfoClass,PVOID Buffer,ULONG Length,PULONG ReturnLength); +LPSTR PsGetProcessImageFileName(PEPROCESS Process); + +NTSTATUS DefaultPassThrough(PDEVICE_OBJECT DeviceObject,PIRP Irp); +void UnloadDriver(PDRIVER_OBJECT DriverObject); +NTSTATUS DriverDispatch(PDEVICE_OBJECT DeviceObject,PIRP Irp); \ No newline at end of file diff --git a/Inject_By_kernelAPC/ring0/KeInjectApc.opensdf b/Inject_By_kernelAPC/ring0/KeInjectApc.opensdf new file mode 100644 index 0000000..f7d8184 Binary files /dev/null and b/Inject_By_kernelAPC/ring0/KeInjectApc.opensdf differ diff --git a/Inject_By_kernelAPC/ring0/KeInjectApc.sln b/Inject_By_kernelAPC/ring0/KeInjectApc.sln new file mode 100644 index 0000000..ad11857 --- /dev/null +++ b/Inject_By_kernelAPC/ring0/KeInjectApc.sln @@ -0,0 +1,16 @@ +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio 2010 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "KeInjectApc", "KeInjectApc.vcxproj", "{4EE67C57-BE79-4CD7-B3B0-94AECE62DB41}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + WinDDK|Win32 = WinDDK|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {4EE67C57-BE79-4CD7-B3B0-94AECE62DB41}.WinDDK|Win32.ActiveCfg = WinDDK|Win32 + {4EE67C57-BE79-4CD7-B3B0-94AECE62DB41}.WinDDK|Win32.Build.0 = WinDDK|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Inject_By_kernelAPC/ring0/KeInjectApc.suo b/Inject_By_kernelAPC/ring0/KeInjectApc.suo new file mode 100644 index 0000000..f409276 Binary files /dev/null and b/Inject_By_kernelAPC/ring0/KeInjectApc.suo differ diff --git a/Inject_By_kernelAPC/ring0/KeInjectApc.vcxproj b/Inject_By_kernelAPC/ring0/KeInjectApc.vcxproj new file mode 100644 index 0000000..8463b7f --- /dev/null +++ b/Inject_By_kernelAPC/ring0/KeInjectApc.vcxproj @@ -0,0 +1,62 @@ +锘 + + + + WinDDK + Win32 + + + + {4EE67C57-BE79-4CD7-B3B0-94AECE62DB41} + Win32Proj + "KeInjectApc" + + + + + + + + .sys + false + $(WLHBASE)\bin\x86\x86;$(WLHBASE)\bin\x86 + $(WLHBASE)\inc\api;$(WLHBASE)\inc\crt;$(WLHBASE)\inc\ddk;$(WLHBASE)\inc + + $(WLHBASE)\lib\win7\i386 + + + + + + _X86_;DBG=1 + false + false + StdCall + CompileAsC + + + + + ntoskrnl.lib;hal.lib;wdm.lib;%(AdditionalDependencies) + + + true + Native + Driver + DriverEntry + true + 0x10000 + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Inject_By_kernelAPC/ring0/KeInjectApc.vcxproj.user b/Inject_By_kernelAPC/ring0/KeInjectApc.vcxproj.user new file mode 100644 index 0000000..ace9a86 --- /dev/null +++ b/Inject_By_kernelAPC/ring0/KeInjectApc.vcxproj.user @@ -0,0 +1,3 @@ +锘 + + \ No newline at end of file diff --git a/Inject_By_kernelAPC/ring0/clean.bat b/Inject_By_kernelAPC/ring0/clean.bat new file mode 100644 index 0000000..a92852f --- /dev/null +++ b/Inject_By_kernelAPC/ring0/clean.bat @@ -0,0 +1,28 @@ +rem ///////////////// +rem / Add by ChiChou +rem / +rem / FileName:Clean.bat +rem / Description:Clean +rem / +rem //////////////// +rd .\bin /s /q +rd .\WinDDK /s /q +rd .\objchk_w2k_x86 /s /q +rd .\objchk_wxp_x86 /s /q +rd .\objchk_wnet_x86 /s /q +rd .\objchk_wlh_x86 /s /q +rd .\objfre_w2k_x86 /s /q +rd .\objfre_wxp_x86 /s /q +rd .\objfre_wnet_x86 /s /q +rd .\objfre_wlh_x86 /s /q +del .\*.log +del .\*.err +del .\*.xml +rem ***** del VS2005 file ***** +del .\*.ncb +del .\*.user +del .\*.suo /A:H +rem ***** del VS6.0 file ***** +del .\*.plg +del .\*.opt +exit \ No newline at end of file diff --git a/Inject_By_kernelAPC/ring0/ddkbuild.cmd b/Inject_By_kernelAPC/ring0/ddkbuild.cmd new file mode 100644 index 0000000..8acd7a4 --- /dev/null +++ b/Inject_By_kernelAPC/ring0/ddkbuild.cmd @@ -0,0 +1,1122 @@ +@echo off +@set VERSION=V7.3 +@set OSR_DEBUG=off +@if "%OS%"=="Windows_NT" goto :Prerequisites +@echo This script requires Windows NT 4.0 or later to run properly! +goto :EOF +:Prerequisites +:: Check whether FINDSTR is available. It's used to show warnings etc. +findstr /? > NUL 2>&1 || echo "FINDSTR is a prerequisite but wasn't found!" && goto :EOF +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: +:: $Id: ddkbuild.cmd 27 2008-09-06 12:02:06Z oliver $ +:: +:: This software is supplied for instructional purposes only. +:: +:: OSR Open Systems Resources, Inc. (OSR) expressly disclaims any warranty +:: for this software. THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY +:: OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION, +:: THE IMPLIED WARRANTIES OF MECHANTABILITY OR FITNESS FOR A PARTICULAR +:: PURPOSE. THE ENTIRE RISK ARISING FROM THE USE OF THIS SOFTWARE REMAINS +:: WITH YOU. OSR's entire liability and your exclusive remedy shall not +:: exceed the price paid for this material. In no event shall OSR or its +:: suppliers be liable for any damages whatsoever (including, without +:: limitation, damages for loss of business profit, business interruption, +:: loss of business information, or any other pecuniary loss) arising out +:: of the use or inability to use this software, even if OSR has been +:: advised of the possibility of such damages. Because some states/ +:: jurisdictions do not allow the exclusion or limitation of liability for +:: consequential or incidental damages, the above limitation may not apply +:: to you. +:: +:: OSR Open Systems Resources, Inc. +:: 105 Route 101A Suite 19 +:: Amherst, NH 03031 (603) 595-6500 FAX: (603) 595-6503 +:: report bugs to +:: alternatively report them via +:: +:: +:: MODULE: +:: +:: ddkbuild.cmd +:: +:: ABSTRACT: +:: +:: This script allows drivers to be built with Visual Studio 2002 through +:: Visual Studio 2008 and possibly future versions. It will also work fine +:: from the command line. +:: If you are interested in a project wizard that makes use of this script, +:: try DDKWizard from . +:: +:: AUTHOR(S): +:: +:: - OSR Open Systems Resources, Inc. +:: - Oliver Schneider (ddkwizard.assarbad.net) +:: +:: REQUIREMENTS: +:: +:: Environment variables that must be set. +:: %NT4BASE% - Set this up for "-NT4" builds (legacy, support not tested) +:: %W2KBASE% - Set this up for "-W2K*" builds (legacy, support not tested) +:: %WXPBASE% - Set this up for "-WXP*" builds +:: %WNETBASE% - Set this up for "-WNET*" builds +:: %WLHBASE% - Set this up for "-WLH*" builds +:: %WDF_ROOT% - Must be set if attempting to do a WDF Build. +:: +:: Examples: +:: NT4BASE : could be "D:\NT4DDK" +:: W2KBASE : could be "D:\Nt50DDK" +:: WXPBASE : could be "D:\WINDDK\2600" +:: WNETBASE: could be "D:\WINDDK\3790.1830" or "C:\WINDDK\3790" +:: +:: COMMAND FORMAT: +:: +:: Run the script without any parameters to get the whole help content! +:: Note: "-WDF" has been tested with the 01.00.5054 version of the framework +:: +:: RETURN CODES AND THEIR MEANING: +:: +:: 001 == Unknown build type. Check the parameter +:: 002 == No WDF_ROOT given using WDF build type. +:: 003 == The DDK-specific base directory variable (NT4BASE, W2KBASE, WXPBASE, +:: WNETBASE) is not set at all and could not be auto-detected! +:: 004 == BASEDIR variable is empty. Check to see that the DDK-specific +:: variable is set correctly (i.e. NT4BASE, W2KBASE, WXPBASE, WNETBASE) +:: 005 == No mode (checked/free) was given. Check the respective parameter! +:: 006 == No DIR or SOURCES file found in the given target directory. +:: 007 == No target directory given. +:: 008 == Given target directory does not exist. +:: 009 == The SETENV script failed. +:: +:: Note: If %OSR_ERRCODE% and %ERRORLEVEL% are equal, the return code stems +:: from one of the tools being called during the build process. +:: +:: BROWSE FILES: +:: +:: This procedure supports the building of BROWSE files to be used by +:: Visual Studio 6 and by Visual Studio.NET However, the BSCfiles created +:: by bscmake for the two are not compatible. When this command procedure +:: runs, it selects the first bscmake.exe found in the path. So, make sure +:: that the correct bscmake.exe is in the path ... +:: +:: Note that if using Visual Studio.NET the .BSC must be added to the project +:: in order for the project to be browsed. +:: Another alternative is the VS addon named "Visual Assist X" which will +:: parse the header files - no more need for browse files. +:: +:: COMPILERS: +:: +:: If you are building NT4 you should really be using the VC6 compiler. +:: Later versions of the DDK now contain the compiler and the linker. This +:: procedure should use the correct compiler. +:: +:: GENERAL COMMENTS: +:: +:: This procedure has been cleaned up to be modular and easy to understand. +:: +:: As of the Server 2003 SP1 DDK DDKBUILD now clears the NO_BROWSE_FILE and +:: NO_BINPLACE environment variables so that users can use these features. +:: +:: Starting with the Vista WDK, the output in the respective tool window +:: in VS is in Unicode by default. This garbles the output from DDKBUILD +:: and we therefore clear the environment variable VS_UNICODE_OUTPUT. +:: +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: / MAIN function of the script +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:MAIN +:: Building "stack frame" +setlocal ENABLEEXTENSIONS & pushd . +:: Check whether the REG utility is available +reg /? > NUL 2>&1 && set OSR_REGAVAILABLE=1 + +:: This is set by client-side keyword substitution +set SVN_REVISION=$Revision: 27 $ +:: Extract the revision number from the revision keyword +set SVN_REVISION=%SVN_REVISION:~0,-2% +set SVN_REVISION=%SVN_REVISION:~11% +:: This is set by client-side keyword substitution +set SVN_REVDATE=$Date: 2008-09-06 12:02:06 +0000 (Sat, 06 Sep 2008) $ +:: Extract the date from the Date keyword +set SVN_REVDATE=%SVN_REVDATE:~7,10% +set VERSION=%VERSION%/r%SVN_REVISION% + +:: Init some special variables +set OSR_VERSTR=OSR DDKBUILD.CMD %VERSION% (%SVN_REVDATE%) - OSR, Open Systems Resources, Inc. +set OSR_PREBUILD_SCRIPT=ddkprebld.cmd +set OSR_POSTBUILD_SCRIPT=ddkpostbld.cmd +set OSR_SETENV_SCRIPT=ddkbldenv.cmd +set OSR_ECHO=@echo DDKBLD: + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: Set error messages +:: Possible codes: 1 +set ERR_UnknownBuildType=Unknown type of build. Please recheck parameters. +:: Possible codes: 2 +set ERR_NoWdfRoot=WDF_ROOT is not defined, are you using 00.01.5054 or later? +:: Possible codes: 3 +set ERR_BaseDirNotSet=To build using type %%OSR_TARGET%% you need to set the %%%%%%BASEDIRVAR%%%%%% environment variable to point to the %%BASEDIROS%% DDK base directory! +:: Possible codes: 4 +set ERR_NoBASEDIR=NT4BASE, W2KBASE, WXPBASE and/or WNETBASE environment variable(s) not set. Environment variable(s) must be set by user according to DDK version(s) installed. +:: Possible codes: 5 +set ERR_BadMode=^ must be 'checked', 'free', 'chk' or 'fre' (case-insensitive). +:: Possible codes: 6 +set ERR_NoTarget=Target directory must contain a SOURCES or DIRS file. +:: Possible codes: 7, 8 +set ERR_NoDir=The ^ parameter must be a valid directory. +:: Possible codes: 9 +set ERR_SetEnvFailed=The SETENV script failed. + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: Clear the error code variable +set OSR_ERRCODE=0 +set prefast_build=0 + +:: Turn on tracing, use %OSR_TRACE% instead of ECHO +if /i "%OSR_DEBUG%" == "on" (set OSR_TRACE=%OSR_ECHO% [TRACE]) else (set OSR_TRACE=rem) +:: Turn on echoing of current line if %OSR_DEBUG% is set to "on" +@echo %OSR_DEBUG% + +:: Output version string +@echo %OSR_VERSTR% +%OSR_TRACE% ^(Current module: ^"%~f0^"^) +@echo. + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: Set the target platform variable +set OSR_TARGET=%~1 +:: Remove any dashes in the variable +if not "%OSR_TARGET%" == "" set OSR_TARGET=%OSR_TARGET:-=% +:: Show help if the target parameter is empty after removal of the dashes +if "%OSR_TARGET%" == "" goto :USAGE + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: In the build directory check for this script and call it if it exists. +:: This allows to override any global system variable setting, if desired. +if not "%3" == "" call :GetCustomEnvironment "%~f3" +if not "%OSR_ERRCODE%" == "0" goto :USAGE +:: Additional error handling for better usability +:: These subroutines will also attempt to locate the requested DDK!!! +set OSR_ERRCODE=3 +%OSR_TRACE% Checking whether the environment variable for the build type was set +:: Calling as a subroutine has 2 advantages: +:: 1. the script does not quit if the label was not found +:: 2. we return to the line after the call and can check variables there +call :%OSR_TARGET%Check > NUL 2>&1 +:: If the BASEDIROS/BASEDIRVAR variable is not defined, it means the subroutine did not exist! +if not DEFINED BASEDIROS call :ShowErrorMsg 1 "%ERR_UnknownBuildType% (BASEDIROS)" & goto :USAGE +if not DEFINED BASEDIRVAR call :ShowErrorMsg 1 "%ERR_UnknownBuildType% (BASEDIRVAR)" & goto :USAGE +if not "%OSR_ERRCODE%" == "0" call :ShowErrorMsg %OSR_ERRCODE% "%ERR_BaseDirNotSet%" & goto :USAGE + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +set BASEDIR=%%%BASEDIRVAR%%% +call :ResolveVar BASEDIR +call :MakeShort BASEDIR "%BASEDIR%" +:: Check for existing %BASEDIR% +if "%BASEDIR%" == "" call :ShowErrorMsg 4 "%ERR_NoBASEDIR%" & goto :USAGE +set PATH=%BASEDIR%\bin;%PATH% +%OSR_TRACE% Now jump to the initialization of the commandline +:: Calling as a subroutine has 2 advantages: +:: 1. the script does not quit if the label was not found +:: 2. we return to the line after the call and can check variables there +call :%OSR_TARGET%Build + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +%OSR_TRACE% We returned from the variable initialization +if not DEFINED OSR_CMDLINE call :ShowErrorMsg 1 "%ERR_UnknownBuildType% (OSR_CMDLINE)" & goto :USAGE + +%OSR_TRACE% Hurrah, all the variables have been initialized, continuing +:: Proceed with common build steps +goto :CommonBuild + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: Check whether the parameter makes sense and try to +:: correct it if possible +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: These labels are for compatibility with the respective +:: modes supported by another flavor of DDKBUILD. +:WLH64Check +:WLHA64Check +:WLHXP64Check +:WLHNET64Check +:WLHNETA64Check +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:WLHCheck +:WLHX64Check +:WLHI64Check +:WLHNETX64Check +:WLHNETI64Check +:WLHXPCheck +:WLH2KCheck +:WLHNETCheck +set BASEDIROS=Windows Vista/Windows 2008 Server +set BASEDIRVAR=WLHBASE +:: Compatibility between BUILD and VS ... prevent pipes from being used +%OSR_ECHO% Clearing %%VS_UNICODE_OUTPUT%% ... +set VS_UNICODE_OUTPUT= +:: Return to caller if the BASEDIR is already defined (either customized or global) +if DEFINED %BASEDIRVAR% goto :CommonCheckNoErrorWithReturn +call :DetectBaseDirTemp "6001.18000 6000" +if DEFINED BASEDIRTEMP if exist "%BASEDIRTEMP%" goto :CommonCheckSetVarWithReturn +goto :CommonCheckErrorNotSupportedWithReturn + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: These labels are for compatibility with the respective +:: modes supported by another flavor of DDKBUILD. +:WNETW2KCheck +:WNETA64Check +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:WNET2KCheck +:WNETXPCheck +:WNETWXPCheck +:WNETXP64Check +:WNET64Check +:WNETI64Check +:WNETAMD64Check +:WNETX64Check +:WNETCheck +set BASEDIROS=Windows 2003 Server +set BASEDIRVAR=WNETBASE +:: Return to caller if the BASEDIR is already defined (either customized or global) +if DEFINED %BASEDIRVAR% goto :CommonCheckNoErrorWithReturn +call :DetectBaseDirTemp "3790.1830 3790.1218 3790" +if DEFINED BASEDIRTEMP if exist "%BASEDIRTEMP%" goto :CommonCheckSetVarWithReturn +goto :CommonCheckErrorNotDetectedWithReturn + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: These labels are for compatibility with the respective +:: modes supported by another flavor of DDKBUILD. +:XPCheck +:XP64Check +:XPW2KCheck +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:WXP64Check +:WXPI64Check +:WXPCheck +:WXP2KCheck +set BASEDIROS=Windows XP +set BASEDIRVAR=WXPBASE +:: Other flavor of DDKBUILD +if not DEFINED WXPBASE if DEFINED XPBASE set BASEDIRVAR=XPBASE +:: Return to caller if the BASEDIR is already defined (either customized or global) +if DEFINED %BASEDIRVAR% goto :CommonCheckNoErrorWithReturn +call :DetectBaseDirTemp "2600.1106 2600" +if DEFINED BASEDIRTEMP if exist "%BASEDIRTEMP%" goto :CommonCheckSetVarWithReturn +goto :CommonCheckErrorNotDetectedWithReturn + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:W2K64Check +:W2KI64Check +:W2KCheck +set BASEDIROS=Windows 2000 +set BASEDIRVAR=W2KBASE +:: Return to caller +if DEFINED %BASEDIRVAR% goto :CommonCheckNoErrorWithReturn +call :CommonCheckMsg2 +goto :CommonCheckErrorNotSupportedWithReturn + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:NT4Check +set BASEDIROS=Windows NT4 +set BASEDIRVAR=NT4BASE +:: Return to caller +if DEFINED %BASEDIRVAR% goto :CommonCheckNoErrorWithReturn +call :CommonCheckMsg2 +goto :CommonCheckErrorNotSupportedWithReturn + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:CommonCheckMsg1 +echo. +%OSR_ECHO% WARNING: %%%BASEDIRVAR%%% NOT SET! +%OSR_ECHO% Attempting to auto-detect the installation folder and set %%%BASEDIRVAR%%%. +%OSR_ECHO% (If this fails *you* will have to set it!) +goto :EOF + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:CommonCheckMsg2 +echo. +%OSR_ECHO% WARNING: +%OSR_ECHO% Auto-detection of the folder settings is not supported for the requested DDK. +%OSR_ECHO% Please set %%%BASEDIRVAR%%% yourself! +goto :EOF + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:CommonCheckSetVarWithReturn +%OSR_ECHO% Found! +echo. +set %BASEDIRVAR%=%BASEDIRTEMP% +set BASEDIRTEMP= +:: Tell the caller it was successful +:CommonCheckNoErrorWithReturn +set OSR_ERRCODE=0 +goto :EOF + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:CommonCheckErrorNotDetectedWithReturn +echo. +%OSR_ECHO% None of the usual default paths works. Set %%%BASEDIRVAR%%% manually! +:CommonCheckErrorNotSupportedWithReturn +goto :EOF + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: Initialize variables specific to the respective platform +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: +:: Valid parameters for setenv in different DDKs/WDKs: +:: +:: 2600 - "setenv [fre|chk] [64] [hal]" +:: 2600.1106 - "setenv [fre|chk] [64] [hal] [WXP|W2K]" +:: 3790 - "setenv [fre|chk] [64|AMD64] [hal] [WXP|WNET|W2K]" +:: 3790.1830 - "setenv [fre|chk] [64|AMD64] [hal] [WXP|WNET|W2K] [no_prefast] [bscmake]" +:: 6000 - "setenv [fre|chk] [64|AMD64] [hal] [WLH|WXP|WNET|W2K] [bscmake]" +:: 6001.18000 - "setenv [fre|chk] [64|x64] [hal] [WLH|WXP|WNET|W2K] [bscmake]" + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: NT 4.0 build using NT4 DDK +:NT4Build +set OSR_CMDLINE="%%BASEDIR%%\bin\setenv.bat" %%BASEDIR%% %%BuildMode%% "%%MSDEVDIR%%" +goto :EOF + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: W2K build for 32bit using WXP DDK +:XPW2KBuild +:WXP2KBuild +set OSR_CMDLINE="%%BASEDIR%%\bin\w2k\set2k.bat" %%BASEDIR%% %%BuildMode%% +goto :EOF + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: W2K build for 64bit (Intel) using W2K DDK +:W2K64Build +:W2KI64Build +set OSR_CMDLINE="%%BASEDIR%%\bin\setenv64.bat" %%BASEDIR%% %%BuildMode%% +goto :EOF + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: W2K build for 32bit using W2K DDK +:W2KBuild +set OSR_CMDLINE="%%BASEDIR%%\bin\setenv.bat" %%BASEDIR%% %%BuildMode%% +goto :EOF + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: WXP build for 64bit (Intel) using WXP DDK +:XP64Build +:WXP64Build +:WXPI64Build +set OSR_CMDLINE="%%BASEDIR%%\bin\setenv.bat" %%BASEDIR%% %%BuildMode%% 64 +goto :EOF + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: WXP build for 32bit using WXP DDK +:XPBuild +:WXPBuild +set OSR_CMDLINE="%%BASEDIR%%\bin\setenv.bat" %%BASEDIR%% %%BuildMode%% +goto :EOF + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: W2K build for 32bit using WNET DDK +:WNETW2KBuild +:WNET2KBuild +set OSR_CMDLINE="%%BASEDIR%%\bin\setenv.bat" %%BASEDIR%% W2K %%BuildMode%% +goto :EOF + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: WXP build for 32bit using WNET DDK +:WNETXPBuild +:WNETWXPBuild +set OSR_CMDLINE="%%BASEDIR%%\bin\setenv.bat" %%BASEDIR%% %%BuildMode%% WXP +goto :EOF + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: WXP build for 64bit using WNET DDK +:WNETXP64Build +set OSR_CMDLINE="%%BASEDIR%%\bin\setenv.bat" %%BASEDIR%% %%BuildMode%% 64 WXP +goto :EOF + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: WNET build for 64bit (Intel) using WNET DDK +:WNET64Build +:WNETI64Build +set OSR_CMDLINE="%%BASEDIR%%\bin\setenv.bat" %%BASEDIR%% %%BuildMode%% 64 WNET +goto :EOF + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: WNET build for 64bit (AMD) using WNET DDK +:WNETA64Build +:WNETAMD64Build +:WNETX64Build +set OSR_CMDLINE="%%BASEDIR%%\bin\setenv.bat" %%BASEDIR%% %%BuildMode%% AMD64 WNET +goto :EOF + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: WNET build for 32bit using WNET DDK +:WNETBuild +set OSR_CMDLINE="%%BASEDIR%%\bin\setenv.bat" %%BASEDIR%% %%BuildMode%% +goto :EOF + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: WLH build for 32bit using WLH DDK +:WLHBuild +set OSR_CMDLINE="%%BASEDIR%%\bin\setenv.bat" %%BASEDIR%% %%BuildMode%% WLH +goto :EOF + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: WLH build for 64bit (AMD) using WLH DDK +:WLHA64Build +:WLHX64Build +call :DetectVistaWDK +set OSR_CMDLINE="%%BASEDIR%%\bin\setenv.bat" %%BASEDIR%% %%BuildMode%% %OSR_AMD64FLAG% WLH +goto :EOF + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: WLH build for 64bit (Intel) using WLH DDK +:WLH64Build +:WLHI64Build +set OSR_CMDLINE="%%BASEDIR%%\bin\setenv.bat" %%BASEDIR%% %%BuildMode%% 64 WLH +goto :EOF + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: WNET build for 64bit (AMD) using WLH DDK +:WLHNETA64Build +:WLHNETX64Build +call :DetectVistaWDK +set OSR_CMDLINE="%%BASEDIR%%\bin\setenv.bat" %%BASEDIR%% %%BuildMode%% %OSR_AMD64FLAG% WNET +goto :EOF + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: WNET build for 64bit (Intel) using WLH DDK +:WLHNET64Build +:WLHNETI64Build +set OSR_CMDLINE="%%BASEDIR%%\bin\setenv.bat" %%BASEDIR%% %%BuildMode%% 64 WNET +goto :EOF + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: WXP build for 32bit using WLH DDK +:WLHXPBuild +set OSR_CMDLINE="%%BASEDIR%%\bin\setenv.bat" %%BASEDIR%% %%BuildMode%% WXP +goto :EOF + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: WXP build for 64bit (Intel) using WLH DDK +:WLHXP64Build +set OSR_CMDLINE="%%BASEDIR%%\bin\setenv.bat" %%BASEDIR%% %%BuildMode%% 64 WXP +goto :EOF + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: W2K build for 32bit using WLH DDK +:WLH2KBuild +set OSR_CMDLINE="%%BASEDIR%%\bin\setenv.bat" %%BASEDIR%% %%BuildMode%% W2K +goto :EOF + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: WNET build for 32bit using WLH DDK +:WLHNETBuild +set OSR_CMDLINE="%%BASEDIR%%\bin\setenv.bat" %%BASEDIR%% %%BuildMode%% WNET +goto :EOF + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: All builds go here for the rest of the procedure. Now, +:: we are getting ready to call build. The big problem +:: here is to figure our the name of the buildxxx files +:: being generated for the different platforms. +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +:CommonBuild +:: Remove first command line arg +shift +call :SetMode %1 +if not "%OSR_ERRCODE%" == "0" call :ShowErrorMsg %OSR_ERRCODE% "%ERR_BadMode%" & goto :USAGE +set OSR_BUILDNAME=%OSR_TARGET% (%BuildMode%) using the %BASEDIROS% DDK and %%%BASEDIRVAR%%% + +call :CheckTargets %2 +if "%OSR_ERRCODE%" == "6" call :ShowErrorMsg %OSR_ERRCODE% "%ERR_NoTarget%" & goto :USAGE +if not "%OSR_ERRCODE%" == "0" call :ShowErrorMsg %OSR_ERRCODE% "%ERR_NoDir%" & goto :USAGE + +:: Resolve any variables in the command line string +call :ResolveVar OSR_CMDLINE + +pushd . +set ERRORLEVEL=0 +:: This external script prepares the build environment (e.g. setenv.bat) +call %OSR_CMDLINE% +:: Will only work with newer SETENV.BAT versions, but will be helpful in this case. +if not "%ERRORLEVEL%" == "0" call :ShowErrorMsg 9 "%ERR_SetEnvFailed%" & goto :USAGE +popd + +:: ---------------------------------------------------------------------------- +:: Setting global variables for the scope of this CMD session +set NO_BROWSER_FILE= +set NO_BINPLACE= +set buildDirectory=%~fs2 +call :MakeShort buildDirectory "%buildDirectory%" +set buildDirectory_raw=%2 +set buildDirectory_fname=%~n2 +%OSR_TRACE% buildDirectory == %buildDirectory% +%OSR_TRACE% buildDirectory_raw == %buildDirectory_raw% +%OSR_TRACE% buildDirectory_fname == %buildDirectory_fname% + +set mpFlag=-M +if "%BUILD_ALT_DIR%" == "" goto :NT4 + +:: W2K sets this! +set OSR_EXT=%BUILD_ALT_DIR% +set mpFlag=-MI + +:NT4 +if "%NUMBER_OF_PROCESSORS%" == "" set mpFlag= +if "%NUMBER_OF_PROCESSORS%" == "1" set mpFlag= + +:: Set additional variables at this point or do whatever you please +@if exist "%buildDirectory%\%OSR_PREBUILD_SCRIPT%" @( + %OSR_ECHO% ^>^> Performing pre-build steps [%OSR_PREBUILD_SCRIPT%] ... + pushd "%buildDirectory%" + call "%OSR_PREBUILD_SCRIPT%" > "%TEMP%\%OSR_PREBUILD_SCRIPT%.tmp" + for /f "tokens=*" %%x in ('type "%TEMP%\%OSR_PREBUILD_SCRIPT%.tmp"') do @( + %OSR_ECHO% %%x + ) + if exist "%TEMP%\%OSR_PREBUILD_SCRIPT%.tmp" del /f /q "%TEMP%\%OSR_PREBUILD_SCRIPT%.tmp" + popd + %OSR_ECHO% ^<^< Finished pre-build steps [%OSR_PREBUILD_SCRIPT%] ... +) +:: Save the current directory (before changing into the build directory!) +:: AFTERPREBUILD +pushd . + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: Determine the settings of flags, WDF and PREFAST in +:: other words what was set for %3 and beyond.... +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +%OSR_ECHO% %OSR_BUILDNAME% +set OSR_ARGS= + argument(s): +if not "%3" == "" set OSR_ARGS=%OSR_ARGS% %3 +if not "%4" == "" set OSR_ARGS=%OSR_ARGS% %4 +if not "%5" == "" set OSR_ARGS=%OSR_ARGS% %5 +if /i "%OSR_ARGS%" == " + argument(s):" set OSR_ARGS= +%OSR_ECHO% Directory: %buildDirectory%%OSR_ARGS% +%OSR_ECHO% %BASEDIRVAR%: %BASEDIR% + +cd /D %~s2 +set bFlags=-Ze +set bscFlags= + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:ContinueParsing +if "%3" == "" goto :DONE +if "%3" == "/a" goto :RebuildallFound +if /i "%3" == "-WDF" goto :WDFFound +if /i "%3" == "-PREFAST" goto :PrefastFound +set bscFlags=/n +set bFlags=%bFlags% %3 +:: Remove next arg +shift +goto :ContinueParsing + +:WDFFound +shift +:: Note, that the setwdf.bat is called from setenv.bat in the WDK, +:: therefore we skip it. +if /i "%BASEDIRVAR%" == "WLHBASE" goto :WDFOkay +if "%WDF_ROOT%" == "" call :ShowErrorMsg 2 "%ERR_NoWdfRoot%" & goto :USAGE +pushd . +if exist "%WDF_ROOT%\set_wdf_env.cmd" call "%WDF_ROOT%\set_wdf_env.cmd" +popd +:WDFOkay +goto :ContinueParsing + +:PrefastFound +shift +set prefast_build=1 +goto :ContinueParsing + +:RebuildallFound +shift +set bscFlags=/n +set bFlags=%bFlags:-Ze=-cfeZ% +set bFlags=%bFlags: -cZ=% +goto :ContinueParsing +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +:DONE +for %%x in (build%OSR_EXT%.err build%OSR_EXT%.wrn build%OSR_EXT%.log prefast%OSR_EXT%.log) do @( + if exist "%%x" del /f /q "%%x" +) + +if not "%prefast_build%" == "0" goto :RunPrefastBuild +%OSR_ECHO% Run build %mpFlag% %bFlags% for %BuildMode% version in %buildDirectory_raw% +pushd . +build %mpFlag% %bFlags% +popd +goto :BuildComplete + +:RunPrefastBuild +%OSR_ECHO% Run prefast build %mpFlag% %bFlags% for %BuildMode% version in %buildDirectory_raw% +setlocal ENABLEEXTENSIONS & pushd . +set PREFASTLOG=PREfast_defects_%OSR_EXT%.xml +prefast /log=%PREFASTLOG% /reset build %mpFlag% %bFlags% > NUL 2>&1 +if "%errorlevel%" GTR "0" set OSR_ERRCODE=%errorlevel% +prefast /log=%PREFASTLOG% list > prefast%OSR_EXT%.log +%OSR_ECHO% The PREfast logfile is ^"%prefastlog%^"! +popd & endlocal + +:BuildComplete +if not "%errorlevel%" == "0" set OSR_ERRCODE=%errorlevel% + +@echo %OSR_DEBUG% +:: Assume that the onscreen errors are complete! +setlocal +set WARNING_FILE_COUNT=0 +if exist "build%OSR_EXT%.log" for /f "tokens=*" %%x in ('findstr "warning[^.][DRCLU][0-9][0-9]* error[^.][DRCLU][0-9][0-9]*" "build%OSR_EXT%.log"') do @( + set /a WARNING_FILE_COUNT=%WARNING_FILE_COUNT%+1 +) +if not "%WARNING_FILE_COUNT%" == "0" ( + %OSR_ECHO% ================ Build warnings ======================= + if exist "build%OSR_EXT%.log" for /f "tokens=*" %%x in ('findstr "warning[^.][DRCLU][0-9][0-9]* error[^.][DRCLU][0-9][0-9]*" "build%OSR_EXT%.log"') do @( + @echo %%x + ) +) +set WARNING_FILE_COUNT_PRE=0 +if exist "prefast%OSR_EXT%.log" for /f "tokens=*" %%x in ('findstr "warning[^.][CLU]*" "prefast%OSR_EXT%.log"') do @( + set /a WARNING_FILE_COUNT_PRE=%WARNING_FILE_COUNT_PRE%+1 +) +:: Reset if this is no PREfast build +if "%prefast_build%" == "0" set WARNING_FILE_COUNT_PRE=0 +if not "%WARNING_FILE_COUNT_PRE%" == "0" ( + %OSR_ECHO% =============== PREfast warnings ====================== + if exist "prefast%OSR_EXT%.log" for /f "tokens=*" %%x in ('findstr "warning[^.][CLU]*" "prefast%OSR_EXT%.log"') do @( + @echo %%x + ) +) +set /a WARNING_FILE_COUNT=%WARNING_FILE_COUNT%+%WARNING_FILE_COUNT_PRE% +if not "%WARNING_FILE_COUNT%" == "0" ( + %OSR_ECHO% ======================================================= +) +endlocal +@echo. +%OSR_ECHO% Build complete +%OSR_ECHO% Building browse information files +if exist "buildbrowse.cmd" call "buildbrowse.cmd" & goto :postBuildSteps +set sbrlist=sbrList.txt +if not exist sbrList%CPU%.txt goto :sbrDefault +set sbrlist=sbrList%CPU%.txt + +:sbrDefault +if not exist %sbrlist% goto :postBuildSteps +:: Prepend blank space +if not "%bscFlags%" == "" set bscFlags= %bscFlags% +:: bscmake%bscFlags% prevents a double blank space ... +bscmake%bscFlags% @%sbrlist% + +:: Perform whatever post-build steps +:postBuildSteps +:: Restore the current directory (after changing into the build directory!) +:: Search upwards for "AFTERPREBUILD" to find the corresponding PUSHD +popd +@if exist "%buildDirectory%\%OSR_POSTBUILD_SCRIPT%" @( + %OSR_ECHO% ^>^> Performing post-build steps [%OSR_POSTBUILD_SCRIPT%] ... + pushd "%buildDirectory%" + call "%OSR_POSTBUILD_SCRIPT%" > "%TEMP%\%OSR_POSTBUILD_SCRIPT%.tmp" + for /f "tokens=*" %%x in ('type "%TEMP%\%OSR_POSTBUILD_SCRIPT%.tmp"') do @( + %OSR_ECHO% %%x + ) + if exist "%TEMP%\%OSR_POSTBUILD_SCRIPT%.tmp" del /f /q "%TEMP%\%OSR_POSTBUILD_SCRIPT%.tmp" + popd + %OSR_ECHO% ^<^< Finished post-build steps [%OSR_POSTBUILD_SCRIPT%] ... +) +goto :END +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: \ MAIN function of the script +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: / GetCustomEnvironment +:: First parameter is the "directory" that supposedly contains the SOURCES +:: or DIRS file (and the build scripts) +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:GetCustomEnvironment +pushd . +call :CheckTargets "%~f1" +@if not "%OSR_ERRCODE%" == "0" @( + echo. + %OSR_ECHO% The target directory seemed to not contain a DIRS or SOURCES file + %OSR_ECHO% when trying to set a custom environment! Quitting. + set buildDirectory=%~f1 + if "%OSR_ERRCODE%" == "6" call :ShowErrorMsg %OSR_ERRCODE% "%ERR_NoTarget%" & goto :GetCustomEnvironment_ret + call :ShowErrorMsg %OSR_ERRCODE% "%ERR_NoDir%" & goto :GetCustomEnvironment_ret + goto :GetCustomEnvironment_ret +) +:: If the user provided a script to customize the environment, execute it. +@if exist "%~f1\%OSR_SETENV_SCRIPT%" @( + %OSR_ECHO% ^>^> Setting custom environment variables [%OSR_SETENV_SCRIPT%] ... + pushd "%~f1" + call "%OSR_SETENV_SCRIPT%" > "%TEMP%\%OSR_SETENV_SCRIPT%.tmp" + for /f "tokens=*" %%x in ('type "%TEMP%\%OSR_SETENV_SCRIPT%.tmp"') do @( + %OSR_ECHO% %%x + ) + if exist "%TEMP%\%OSR_SETENV_SCRIPT%.tmp" del /f /q "%TEMP%\%OSR_SETENV_SCRIPT%.tmp" + popd + %OSR_ECHO% ^<^< Finished setting custom environment variables [%OSR_SETENV_SCRIPT%] ... +) +:GetCustomEnvironment_ret +popd +goto :EOF +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: \ GetCustomEnvironment +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: / SetMode +:: Subroutine to validate the mode of the build passed in. It must be free, +:: FREE, fre, FRE or checked, CHECKED, chk, CHK. Anything else is an error. +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:SetMode +set BuildMode= +if /i "%OSR_TARGET%" == "WLH2K" goto :SetModeWLH2K +for %%f in (free fre) do if /i "%%f" == "%1" set BuildMode=free +for %%f in (checked chk) do if /i "%%f" == "%1" set BuildMode=checked +goto :SetModeCommonEnd +:SetModeWLH2K +for %%f in (free fre) do if /i "%%f" == "%1" set BuildMode=f +for %%f in (checked chk) do if /i "%%f" == "%1" set BuildMode=c +:SetModeCommonEnd +%OSR_TRACE% Mode set to ^"%BuildMode%^" +if "%BuildMode%" == "" set OSR_ERRCODE=5 +goto :EOF +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: \ SetMode +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: / CheckTargets subroutine +:: Subroutine to validate that the target directory exists and that there is +:: either a DIRS or SOURCES and MakeFile in it. +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:CheckTargets +:: Building "stack frame" +setlocal & pushd . & set OSR_ERRCODE=0 +set lTarget=%~1 +if not "%lTarget%" == "" goto :CheckTargets1 +set OSR_ERRCODE=7 +goto :CheckTargets_ret +:CheckTargets1 +if exist "%lTarget%" goto :CheckTargets2 +set OSR_ERRCODE=8 +goto :CheckTargets_ret +:CheckTargets2 +if not exist "%lTarget%\DIRS" goto :CheckTargets3 +set OSR_ERRCODE=0 +goto :CheckTargets_ret +:CheckTargets3 +if exist "%lTarget%\SOURCES" goto :CheckTargets4 +set OSR_ERRCODE=6 +goto :CheckTargets_ret +:CheckTargets4 +if exist "%lTarget%\MAKEFILE" goto :CheckTargets5 +set OSR_ERRCODE=6 +goto :CheckTargets_ret +:CheckTargets5 +set OSR_ERRCODE=0 +:CheckTargets_ret +:: Cleaning "stack frame" and returning error code into global scope +popd & endlocal & set OSR_ERRCODE=%OSR_ERRCODE% +goto :EOF +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: \ CheckTargets subroutine +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: / ResolveVar subroutine +:: There is only one parameter, the name of the variable to be resolved! +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:ResolveVar +:: Get the name of the variable we are working with +setlocal ENABLEEXTENSIONS & set VAR_NAME=%1 +set VAR_TEMPRET2=%%%VAR_NAME%%% +:ResolveVarLoop +set VAR_TEMPRET1=%VAR_TEMPRET2% +set VAR_TEMPRET2=%VAR_TEMPRET1% +for /f "tokens=*" %%i in ('echo %VAR_TEMPRET1%') do ( + set VAR_TEMPRET2=%%i +) +if not "%VAR_TEMPRET1%" == "%VAR_TEMPRET2%" goto :ResolveVarLoop +:: Re-export the variable out of the local scope +endlocal & set %VAR_NAME%=%VAR_TEMPRET1% +goto :EOF +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: \ ResolveVar subroutine +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: / MakeShort subroutine +:: Two parameters. First parameter is the variable name, second is the path +:: to convert into a short filename. +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:MakeShort +setlocal ENABLEEXTENSIONS +:: Get the name of the variable we are working with and the path to convert +set VAR_NAME=%~1 +set PATH_SHORT=%~dpns2 +set PATH_EXTSHORT=%~xs2 +if not "" == "%PATH_EXTSHORT%" set PATH_EXTSHORT=%PATH_EXTSHORT:~0,4% +set PATH_SHORT=%PATH_SHORT%%PATH_EXTSHORT% +endlocal & set %VAR_NAME%=%PATH_SHORT% +goto :EOF +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: \ MakeShort subroutine +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: / ErrorWithUsage subroutine +:: This one will take the passed in parameters and build a nice error +:: message which is returned to the user along with the usage hints. +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:ShowErrorMsg +@set OSR_ERRCODE=%~1 +@set OSR_ERRMSG=%~2 +@set OSR_ERRMSG=%OSR_ERRMSG:'="% +@set OSR_ERRMSG=ERROR #%OSR_ERRCODE%: %OSR_ERRMSG% +@echo. +%OSR_ECHO% %OSR_ERRMSG% +if DEFINED buildDirectory %OSR_ECHO% -^> Target directory: %buildDirectory% +goto :EOF +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: \ ErrorWithUsage subroutine +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: / SetVar subroutine +:: Param1 == name of the variable, Param2 == value to be set for the variable +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:SetVar +:: Get the name of the variable we are working with +setlocal ENABLEEXTENSIONS & set VAR_NAME=%1 +endlocal & set %VAR_NAME%=%~2 +goto :EOF +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: \ SetVar subroutine +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: / DetectVistaWDK subroutine +:: No parameters expected +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:DetectVistaWDK +setlocal ENABLEEXTENSIONS +:: Newer flag (starting with W2K8) is default +set OSR_AMD64FLAG=x64 +:: The Vista WDK accepted *only* "AMD64", the newer W2K8 WDK accepts only "x64" +:: We detect the older one by checking the setenv.bat for a certain string +findstr /C:"Windows Server Longhorn" "%BASEDIR%\bin\setenv.bat" > NUL 2>&1 && set OSR_AMD64FLAG=AMD64 +endlocal & set OSR_AMD64FLAG=%OSR_AMD64FLAG% +goto :EOF +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: \ DetectVistaWDK subroutine +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: / DetectBaseDirTemp subroutine +:: The first parameter is the list of directory names to check, separated by +:: blank spaces. +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:DetectBaseDirTemp +:: Get the name of the variable we are working with +if "%~1" == "" goto :EOF +setlocal ENABLEEXTENSIONS +call :CommonCheckMsg1 +:: Try to find an installed DDK/WDK from the registry keys +if DEFINED OSR_REGAVAILABLE if not "%OSR_REGAVAILABLE%" == "0" ( + for %%i in (%~1) do @( + call :RegTryBaseDirTemp "%%i" + ) +) +:: Try all the "default" locations +if not DEFINED BASEDIRTEMP ( + for %%i in (%~1) do @( + for %%a in (WINDDK DDK) do @( + call :BruteTryBaseDirTemp "%SystemDrive%\%%a\%%i" + call :BruteTryBaseDirTemp "%ProgramFiles%\%%a\%%i" + ) + ) +) +endlocal & set BASEDIRTEMP=%BASEDIRTEMP% +goto :EOF +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: \ DetectBaseDirTemp subroutine +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: / RegTryBaseDirTemp subroutine +:: Attempt to find the install key in the registry. +:: This functions tests old-style DDKs and new-style WDKs. +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:RegTryBaseDirTemp +if DEFINED BASEDIRTEMP if exist "%BASEDIRTEMP%" goto :EOF +setlocal ENABLEEXTENSIONS +call :RegTryBaseDirTempSingle "%~1" "LFNDirectory" BASEDIRTEMP +if DEFINED BASEDIRTEMP if exist "%BASEDIRTEMP%" goto :RegTryBaseDirTemp_EOF +call :RegTryBaseDirTempSingle "%~1\Setup" "BUILD" BASEDIRTEMP +if DEFINED BASEDIRTEMP if exist "%BASEDIRTEMP%" goto :RegTryBaseDirTemp_EOF +if not DEFINED BASEDIRTEMP (endlocal & goto :EOF) +:RegTryBaseDirTemp_EOF +%OSR_ECHO% Found directory (%BASEDIRTEMP%) from install key +endlocal & set BASEDIRTEMP=%BASEDIRTEMP% & goto :EOF +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: \ RegTryBaseDirTemp subroutine +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: / RegTryBaseDirTempSingle subroutine +:: Attempt to find the install key in the registry. +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:RegTryBaseDirTempSingle +setlocal ENABLEEXTENSIONS +set REGSUBKEY=%~1 +set REGVALUE=%~2 +set VARIABLETOSET=%~3 +set REGMAINKEY=HKLM\SOFTWARE\Microsoft\WINDDK +:: Test whether we can read the value below this key +reg query "%REGMAINKEY%\%REGSUBKEY%" /v "%REGVALUE%" > NUL 2>&1 || goto :RegTryBaseDirTempSingle_WOW64 +for /f "tokens=2*" %%i in ('reg query "%REGMAINKEY%\%REGSUBKEY%" /v "%REGVALUE%"^|findstr /C:"%REGVALUE%"') do @( + call :SetVar _SETVARIABLE "%%j" +) +endlocal & set %VARIABLETOSET%=%_SETVARIABLE% +:RegTryBaseDirTempSingle_WOW64 +set REGMAINKEY=HKLM\SOFTWARE\Wow6432Node\Microsoft\WINDDK +:: Test whether we can read the value below this key +reg query "%REGMAINKEY%\%REGSUBKEY%" /v "%REGVALUE%" > NUL 2>&1 || goto :RegTryBaseDirTempSingle_EOF +for /f "tokens=2*" %%i in ('reg query "%REGMAINKEY%\%REGSUBKEY%" /v "%REGVALUE%"^|findstr /C:"%REGVALUE%"') do @( + call :SetVar _SETVARIABLE "%%j" +) +endlocal & set %VARIABLETOSET%=%_SETVARIABLE% +:RegTryBaseDirTempSingle_EOF +endlocal +goto :EOF +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: \ RegTryBaseDirTempSingle subroutine +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: / BruteTryBaseDirTemp subroutine +:: Brute-force test the given directory. +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:BruteTryBaseDirTemp +if DEFINED BASEDIRTEMP if exist "%BASEDIRTEMP%" goto :EOF +setlocal ENABLEEXTENSIONS +:: We will not overwrite BASETEMPDIR if it has been set and is valid +:: Just try +set BASEDIRTEMP=%~1 +%OSR_ECHO% Trying %BASEDIRTEMP% ... +if not exist "%BASEDIRTEMP%" (endlocal & goto :EOF) +endlocal & set BASEDIRTEMP=%BASEDIRTEMP% & goto :EOF +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: \ BruteTryBaseDirTemp subroutine +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: Usage output +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:USAGE +@echo. +@echo USAGE: +@echo ====== +@echo %~n0 ^ ^ ^ [flags] [-WDF] [-PREFAST] +@echo. +@echo Values for ^: +@echo -------------------------------------------------------------------------- +@echo Target platform and OS ^| Miscellaneous +@echo --------------------------^|----------------------------------------------- +@echo Target ^| Windows ^| CPU ^| Base directory ^| Target alias(es) +@echo ------------^|-------------^|---------^|----------------^|-------------------- +@echo -W2K ^| 2000 ^| x86 ^| %%W2KBASE%% ^| +@echo -W2K64 ^| 2000 ^| Itanium ^| %%W2KBASE%% ^| -W2KI64 +@echo -WXP ^| XP ^| x86 ^| %%WXPBASE%% ^| -XP +@echo -WXP64 ^| XP ^| Itanium ^| %%WXPBASE%% ^| -WXPI64, -XP64 +@echo -WXP2K ^| 2000 ^| x86 ^| %%WXPBASE%% ^| -XPW2K +@echo -WNET ^| 2003 ^| x86 ^| %%WNETBASE%% ^| +@echo -WNET64 ^| 2003 ^| Itanium ^| %%WNETBASE%% ^| -WNETI64 +@echo -WNETXP ^| XP ^| x86 ^| %%WNETBASE%% ^| +@echo -WNETXP64 ^| XP ^| Itanium ^| %%WNETBASE%% ^| +@echo -WNETAMD64 ^| 2003/XP x64 ^| x64 ^| %%WNETBASE%% ^| -WNETX64, -WNETA64 +@echo -WNET2K ^| 2000 SP3 ^| x86 ^| %%WNETBASE%% ^| -WNETW2K +@echo -WLH ^| Vista/2008 ^| x86 ^| %%WLHBASE%% ^| +@echo -WLH2K ^| 2000 SP4 ^| x86 ^| %%WLHBASE%% ^| +@echo -WLHXP ^| XP ^| x86 ^| %%WLHBASE%% ^| +@echo -WLHXP64 ^| XP ^| Itanium ^| %%WLHBASE%% ^| +@echo -WLHNET ^| 2003 ^| x86 ^| %%WLHBASE%% ^| +@echo -WLHNETI64 ^| 2003 ^| Itanium ^| %%WLHBASE%% ^| -WLHNET64 +@echo -WLHNETX64 ^| 2003/XP x64 ^| x64 ^| %%WLHBASE%% ^| -WLHNETA64 +@echo -WLHI64 ^| Vista/2008 ^| Itanium ^| %%WLHBASE%% ^| -WLH64 +@echo -WLHX64 ^| Vista/2008 ^| x64 ^| %%WLHBASE%% ^| -WLHA64 +@echo -NT4 ^| NT 4.0 ^| x86 ^| %%NT4BASE%% ^| +@echo -------------------------------------------------------------------------- +@echo Support for NT4 and W2K DDKs is deprecated and not checked anymore +@echo in new versions. It may or may not work properly. +@echo -------------------------------------------------------------------------- +@echo. +@echo Values for ^: +@echo checked, chk indicates a checked build +@echo free, fre indicates a free build +@echo. +@echo Remaining parameters ("opt!" = optional parameter): +@echo ^ path to build directory, try . (current directory) +@echo [flags] opt! any flags you think should be passed to build (try /a +@echo for clean) +@echo -WDF opt! performs a WDF build +@echo -PREFAST opt! performs a PREFAST build +@echo. +@echo Special files: +@echo The build target directory (where the DIRS or SOURCES file resides) can +@echo contain the following files: +@echo - %OSR_PREBUILD_SCRIPT% +@echo Allows to include a step before the BUILD tool from the DDK is called +@echo but after the environment for the respective DDK has been set! +@echo - %OSR_POSTBUILD_SCRIPT% +@echo Allows to include a step after the BUILD tool from the DDK is called, +@echo so the environment is still available to the script. +@echo - %OSR_SETENV_SCRIPT% +@echo Allows to set (or override) _any_ environment variables that may exist +@echo in the global environment. Thus you can set the base directory for the +@echo DDK from inside this script, making your project more self-contained. +@echo. +@echo DDKBUILD will only handle those files which exist, so you may choose to +@echo use none, one or multiple of these script files. +@echo (All scripts execute inside their current directory. Consider this!) +@echo. +@echo Examples: +@echo ^"%~n0 -NT4 checked .^" (for NT4 BUILD) +@echo ^"%~n0 -WXP64 chk .^" +@echo ^"%~n0 -WXP chk c:\projects\myproject^" +@echo ^"%~n0 -WNET64 chk .^" (IA64 build) +@echo ^"%~n0 -WNETAMD64 chk .^" (AMD64/EM64T build) +@echo ^"%~n0 -WNETXP chk . -cZ -WDF^" +@echo ^"%~n0 -WNETXP chk . -cZ -PREFAST^" +@echo. +@echo In order for this procedure to work correctly for each platform, it +@echo requires an environment variable to be set up for certain platforms. +@echo There is an auto-detection mechanism in this script, which will work best +@echo if the DDK/WDK was installed using the normal installer (i.e. not just +@echo copied). The auto-detection is based on the DDK/WDK for which you request +@echo a build. Whenever you set the variable explicitly, this will take +@echo precedence over the auto-detected path! +@echo The environment variables are as follows: +@echo. +@echo %%NT4BASE%% - Set this up for ^"-NT4^" builds +@echo %%W2KBASE%% - Set this up for ^"-W2K^" and ^"-W2K64^" builds +@echo %%WXPBASE%% - Set this up for ^"-WXP^", ^"-WXP64^", ^"-WXP2K^" builds +@echo %%WNETBASE%% - Set this up for ^"-WNET*^" builds +@echo %%WLHBASE%% - Set this up for ^"-WLH*^" builds +@echo. +@echo %%WDF_ROOT%% must be set if attempting to do a WDF Build previous to the +@echo Vista WDK (in later DDKs there is no need to set WDF_ROOT). +@echo. +@echo Path to this script: +@echo %~f0 +@echo. +@echo %OSR_VERSTR% +@echo -^> report any problems to ^ or ^ +@echo. + +:END +popd & endlocal & exit /b %OSR_ERRCODE% \ No newline at end of file diff --git a/Inject_By_kernelAPC/ring0/makefile b/Inject_By_kernelAPC/ring0/makefile new file mode 100644 index 0000000..98801a4 --- /dev/null +++ b/Inject_By_kernelAPC/ring0/makefile @@ -0,0 +1,6 @@ +# +# DO NOT EDIT THIS FILE!!! Edit .\sources. if you want to add a new source +# file to this component. This file merely indirects to the real make file +# that is shared by all the components of NT OS/2 +# +!INCLUDE $(NTMAKEENV)\makefile.def \ No newline at end of file diff --git a/Inject_By_kernelAPC/ring0/mybuild.bat b/Inject_By_kernelAPC/ring0/mybuild.bat new file mode 100644 index 0000000..ecb14fe --- /dev/null +++ b/Inject_By_kernelAPC/ring0/mybuild.bat @@ -0,0 +1,3 @@ +set WLHBASE=C:\WINDDK\7600.16385.0 +set WDF_ROOT=C:\WINDDK\7600.16385.0 +ddkbuild.cmd -WLH chk . -cZ -WDF \ No newline at end of file diff --git a/Inject_By_kernelAPC/ring0/readme.txt b/Inject_By_kernelAPC/ring0/readme.txt new file mode 100644 index 0000000..f2b78db --- /dev/null +++ b/Inject_By_kernelAPC/ring0/readme.txt @@ -0,0 +1,157 @@ +----------------------- +ithurricane [http://hi.baidu.com/ithurricane] +2010/02/04 +----------------------- +support WDK7/VS2008 +fix Privilege Problem +modify register source + +----------------------- +bobo 2009/05/21 +----------------------- +修复bug: VC6 + DDK2003 -> vc6.dsp --> # PROP Cmd_Line "ddkbuild -WNETWXP free ." + 修改: 在ddkbuild.cmd中,关于DDk2003没有WNETWXP参数,现在增加WNETWXP参数,效果等同于WNETXP + +----------------------- +bobo 2009/05/08 +----------------------- +exe: + 1.TestApp由Unicode改为Multi-Byte(为了省事,字符拼接,注册柄伊写都是Multi-Byte版的), + 即TestApp.vcproj的CharacterSet="1" 改为CharacterSet="2" + 2.TestApp加载和卸载sys(modify from MyZwDriverControl.c), 貌似解决这个问虂E + a.启动app,load driver + b.把app强制关祦E此时没有正常unload driver + c.再启动app,此时不会再次load driver(或者说没有load失败),一切正常使用driver + d.正常退出app,unload driver + + ps: MyZwDriverControl 觼Eclass LoadNTDriver(copy from 0ginr.com)有区别处, + MyZwDriverControl在load和unload内,都会做注册柄楮赜,删除工讈E + class LoadNTDriver的load内铁赜注册眮Eunload内删除注册眮E + MyZwDriverControl可以LockXxxDatabase. + 3.加载和卸载sys可以用class LoadNTDriver, 方法紒ELoadNTDriver.h" + +sys: + DriverEntry纴E蛴∽⒉岜肪 + default uIoControlCode 输硜EIoCode + 所有函数增加分页、非分页声脕E#pragma alloc_text(PAGE, DispatchXX)) + +----------------------- +bobo 2009/04/27 +----------------------- +1.各个target os互硜E只能选一个os +2.根据DDK版本,限制OS选詠E +3.fix bug : "mybuild.bat" 内的 PROJECT_MYBUILD_CMD_LINE 参数根据(DDK + OS)写死, + DDK路径都是默认的,再搞个读写麻烦个。 + + DDK 2000 --- C:\\NTDDK + DDK XP --- C:\\WINDDK\\2600 + DDK 2003 --- C:\\WINDDK\\3790.1830 + WDK 6001.18002 --- C:\\WINDDK\\6001.18002 + +4.支持WDK + win2008 +// todo : 5.增加check, free选詠E(mybuild.bat脚本纴E嘁丒问 "chk ." 觼E"fre .") + +6.第一次启动EasySys时,会自动设定用户环境变量(WXPBASE,WNETBASE...), + 这是根据注册眮EHKEY_LOCAL_MACHINE -- SOFTWARE\\Microsoft\\WINDDK 设定DDK路径的。 + (万一用户安装了多个DDK,再加个WDK,这个路径就要龙殁判断了) + + 但"mybuild.bat"也会set环境变量,所以这纴E涫得挥昧恕 + +7.脚本脕E问咛蹇 "ddkbuild.cmd":: Usage output + +----------------------- +bobo 2009/04/23 +----------------------- +1.参照MS sample格式修改"sources" + +-----------------------. +bobo 2009/04/18 +----------------------- +1. 增加common.h, 用于定义exe、sys的共通IOCTL +2. 增加console APP (for VS2005)工程, 用于测试sys. 从哪个hello world搬来的. + (这样只要配合DriverMonitor就可以测试驱动了) +// todo : 3. 在dsp_proj.htm(VC6)纴E黾觕lean编襾E问,让VC6使用clean.bat +// todo : 4. 增加MFC APP工程,用于测试sys +5. 铁赜修改注释 +6.修改print宏,对应check和free版本的build + #if DBG + #define dprintf DbgPrint + #else + #define dprintf + #endif + +越写越复杂了,不easy了..... + +----------------------- +bobo 2009/04/16 +----------------------- +1.OnInitDialog()纴E黾覱nChangeAuthor() +2.修改OnChangeAuthor()字符串 +3.修改hfile.htm,cfile.htm来适应自己习惯 +----------------------- + +bobo 2009/04/10 +----------------------- +1.GenerateRandomStrings()的new 没有释放, + 改为局部数讈E名字不太长就行,64大小) +2.OnInitDialog()纴E黾覱nSelectIdeType(),初始化IdeType + 增加OnSelchangeDdkVersion(),初始化DDK type +3.ddkbuild.cmd 竵E挛 VERSION=V7.3 +4.VC6的ddkbuild.bat改为ddkbuild.cmd +5.修改OnSelchangeDdkVersion()内的DDK2000的逻辑判断 +6.在VC6的dsp.htm中增加struct.h + +----------------------- +ChiChou [http://hi.baidu.com/517826104] +2009/02/03 +----------------------- + +ChiChou 根据 sudami修改皝E制讈E + +* 修正BUG + 1.非常严重的BUG……程序退出时没有移除托盘图标,在某些机器上退出时 +会崩溃(至少我的电脑是这褋E- -!)。 + + 2.原版获得DDK路径时,读取的注册柄薹径写代菟,导致无法获得 DDK 的 +Path(貌似大米直接帖逑自家的DDK路径了之。。未免有点。。。)。 + + 3.原版没有紒E楣こ堂绻丒姘丒欠ㄗ址敲创唇üこ棠柯嫉氖焙丒 +就会出代剑修正时增加对非法字符的check功能。皝Eǎ/\|"<>*?: + + 4.还有一个BUG没有修复。如果在工程名中帖鋪E稳纭皃roject..”的名称时, +也会引发文件访问代牦。但是我没有皝Eㄐ薷础飧鲎址呐卸嫌械隳讯取! +水平低劣。。(- -...) + +* 美化界脕E + 1.把大米弄的 XPBUTTON 给去掉了...图编襾E俣取 + 2.然后P了张背景图,放在主界面,还蛮好看的~~ + 3.习惯性的 XP Manifest 处历肼。 + +* 修改模皝E + 1.根据个人喜好代聛E母袷叫薷牧讼聗 + 2.顺便把《虂E橐苟痢防丒婵吹降哪掣龆鳎ㄅ卸戏帕唇佑没喙匦匀缓丒 +创建不同的设备符号名)加了进去…… + +* 蛠E乒δ + 1.sudami版的有点麻烦,退出程序还要点托盘。直接在主界面设置了退出按 +钮。 + 2.工程创建之后EasySYS基本没用处了,便增加了“蛠E珊笸顺觥毖∠麤 + 3.生成工程后可以源聛E刑尤掌凇⒆髡叩刃畔ⅰ + 4.生成工程后的操作也是可选的。可以选择自动打开工程文件、工程目录。 + 5.增加Clean功能~~~ +----------------------- + + +----------------------- +sudami [sudami@163.com] +2008/08/13 +----------------------- + + VS 2005下写驱动比VC 6.0方便很秮E但好多EasySYS版本(Include DIY)都只 +支持VC 6.0.今儿早上在VBGOOD论坛看到IceBoy小同学用VB写了个支持vs 2005的 +demo.于是,俺也试着写个适用于自己的工具,方便以后縼E俚目⑶绦丒 + + 哈哈,主要是方便自己写code,故生成的code风格都是按照自己的意愿来安排 +滴... + +----------------------- diff --git a/Inject_By_kernelAPC/ring0/sources b/Inject_By_kernelAPC/ring0/sources new file mode 100644 index 0000000..d4f80a2 --- /dev/null +++ b/Inject_By_kernelAPC/ring0/sources @@ -0,0 +1,9 @@ +TARGETNAME=KeInjectApc +#TARGETPATH=$(BASEDIR)\lib +TARGETPATH=obj +TARGETTYPE=DRIVER + +INCLUDES=.\ + +SOURCES=KeInjectApc.c + diff --git a/Inject_By_kernelAPC/ring3/KeInjectApc.sln b/Inject_By_kernelAPC/ring3/KeInjectApc.sln new file mode 100644 index 0000000..865851e --- /dev/null +++ b/Inject_By_kernelAPC/ring3/KeInjectApc.sln @@ -0,0 +1,20 @@ +锘 +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio 2010 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "KeInjectApc", "KeInjectApc\KeInjectApc.vcxproj", "{20C8BB71-37A7-4DA1-96E5-BD96B4CBC698}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {20C8BB71-37A7-4DA1-96E5-BD96B4CBC698}.Debug|Win32.ActiveCfg = Debug|Win32 + {20C8BB71-37A7-4DA1-96E5-BD96B4CBC698}.Debug|Win32.Build.0 = Debug|Win32 + {20C8BB71-37A7-4DA1-96E5-BD96B4CBC698}.Release|Win32.ActiveCfg = Release|Win32 + {20C8BB71-37A7-4DA1-96E5-BD96B4CBC698}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Inject_By_kernelAPC/ring3/KeInjectApc.suo b/Inject_By_kernelAPC/ring3/KeInjectApc.suo new file mode 100644 index 0000000..3c070ff Binary files /dev/null and b/Inject_By_kernelAPC/ring3/KeInjectApc.suo differ diff --git a/Inject_By_kernelAPC/ring3/KeInjectApc/KeInjectApc.cpp b/Inject_By_kernelAPC/ring3/KeInjectApc/KeInjectApc.cpp new file mode 100644 index 0000000..605520f --- /dev/null +++ b/Inject_By_kernelAPC/ring3/KeInjectApc/KeInjectApc.cpp @@ -0,0 +1,57 @@ +// KeInjectApc.cpp : 定义控制台应用程序的入口点。 +// + +#include "stdafx.h" +#include +#include +#include +using namespace std; + + + + +#define CTL_KEINJECTAPC \ + CTL_CODE(FILE_DEVICE_UNKNOWN,0x830,METHOD_BUFFERED,FILE_ANY_ACCESS) + + + +typedef struct _INJECT_INFO +{ + ULONG ProcessId; + wchar_t DllName[1024]; +}INJECT_INFO,*PINJECT_INFO; + +int _tmain(int argc, _TCHAR* argv[]) +{ + HANDLE hFile; + INJECT_INFO InjectInfo; + hFile=CreateFile(L"\\\\.\\DriverLink", + GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE, + NULL,OPEN_EXISTING,0,NULL); + + if(hFile==INVALID_HANDLE_VALUE) + { + printf("\nError: Unable to connect to the driver (%d)\n",GetLastError()); + return -1; + } + + memset(&InjectInfo,0,sizeof(INJECT_INFO)); + scanf("%d",&(InjectInfo.ProcessId)); + wscanf(L"%s",InjectInfo.DllName); + + + DWORD dwReturnSize = 0; + DWORD dwRet = 0; + //发送IO 控制码 + dwRet = DeviceIoControl(hFile,CTL_KEINJECTAPC, // + &InjectInfo, + sizeof(INJECT_INFO), + NULL, + NULL, + &dwReturnSize, + NULL); + + CloseHandle(hFile); + return 0; +} + diff --git a/Inject_By_kernelAPC/ring3/KeInjectApc/KeInjectApc.vcxproj b/Inject_By_kernelAPC/ring3/KeInjectApc/KeInjectApc.vcxproj new file mode 100644 index 0000000..9057a35 --- /dev/null +++ b/Inject_By_kernelAPC/ring3/KeInjectApc/KeInjectApc.vcxproj @@ -0,0 +1,91 @@ +锘 + + + + Debug + Win32 + + + Release + Win32 + + + + {20C8BB71-37A7-4DA1-96E5-BD96B4CBC698} + Win32Proj + KeInjectApc + + + + Application + true + Unicode + + + Application + false + true + Unicode + + + + + + + + + + + + + true + + + false + + + + Use + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + + + Console + true + + + + + Level3 + Use + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + + + Console + true + true + true + + + + + + + + + + + + + Create + Create + + + + + + \ No newline at end of file diff --git a/Inject_By_kernelAPC/ring3/KeInjectApc/KeInjectApc.vcxproj.filters b/Inject_By_kernelAPC/ring3/KeInjectApc/KeInjectApc.vcxproj.filters new file mode 100644 index 0000000..6f8dc08 --- /dev/null +++ b/Inject_By_kernelAPC/ring3/KeInjectApc/KeInjectApc.vcxproj.filters @@ -0,0 +1,36 @@ +锘 + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + + + + 澶存枃浠 + + + 澶存枃浠 + + + + + 婧愭枃浠 + + + 婧愭枃浠 + + + \ No newline at end of file diff --git a/Inject_By_kernelAPC/ring3/KeInjectApc/KeInjectApc.vcxproj.user b/Inject_By_kernelAPC/ring3/KeInjectApc/KeInjectApc.vcxproj.user new file mode 100644 index 0000000..ace9a86 --- /dev/null +++ b/Inject_By_kernelAPC/ring3/KeInjectApc/KeInjectApc.vcxproj.user @@ -0,0 +1,3 @@ +锘 + + \ No newline at end of file diff --git a/Inject_By_kernelAPC/ring3/KeInjectApc/stdafx.cpp b/Inject_By_kernelAPC/ring3/KeInjectApc/stdafx.cpp new file mode 100644 index 0000000..fae8c0f --- /dev/null +++ b/Inject_By_kernelAPC/ring3/KeInjectApc/stdafx.cpp @@ -0,0 +1,8 @@ +// stdafx.cpp : 只包括标准包含文件的源文件 +// KeInjectApc.pch 将作为预编译头 +// stdafx.obj 将包含预编译类型信息 + +#include "stdafx.h" + +// TODO: 在 STDAFX.H 中 +// 引用任何所需的附加头文件,而不是在此文件中引用 diff --git a/Inject_By_kernelAPC/ring3/KeInjectApc/stdafx.h b/Inject_By_kernelAPC/ring3/KeInjectApc/stdafx.h new file mode 100644 index 0000000..9d41f0f --- /dev/null +++ b/Inject_By_kernelAPC/ring3/KeInjectApc/stdafx.h @@ -0,0 +1,15 @@ +// stdafx.h : 标准系统包含文件的包含文件, +// 或是经常使用但不常更改的 +// 特定于项目的包含文件 +// + +#pragma once + +#include "targetver.h" + +#include +#include + + + +// TODO: 在此处引用程序需要的其他头文件 diff --git a/Inject_By_kernelAPC/ring3/KeInjectApc/targetver.h b/Inject_By_kernelAPC/ring3/KeInjectApc/targetver.h new file mode 100644 index 0000000..7a7d2c8 --- /dev/null +++ b/Inject_By_kernelAPC/ring3/KeInjectApc/targetver.h @@ -0,0 +1,8 @@ +#pragma once + +// 包括 SDKDDKVer.h 将定义可用的最高版本的 Windows 平台。 + +// 如果要为以前的 Windows 平台生成应用程序,请包括 WinSDKVer.h,并将 +// WIN32_WINNT 宏设置为要支持的平台,然后再包括 SDKDDKVer.h。 + +#include