From 0c879e7e7f8986e1ff808412e5bfe299f59d4d61 Mon Sep 17 00:00:00 2001 From: ChengChengCC Date: Sun, 17 Jan 2016 10:44:57 +0800 Subject: [PATCH] hook_idt --- hook_IDT/IDTHook/IDTHook.c | 195 +++++ hook_IDT/IDTHook/IDTHook.h | 85 ++ hook_IDT/IDTHook/IDTHook.sln | 16 + hook_IDT/IDTHook/IDTHook.suo | Bin 0 -> 10240 bytes hook_IDT/IDTHook/IDTHook.vcxproj | 62 ++ hook_IDT/IDTHook/IDTHook.vcxproj.user | 3 + hook_IDT/IDTHook/clean.bat | 28 + hook_IDT/IDTHook/ddkbuild.cmd | 1122 +++++++++++++++++++++++++ hook_IDT/IDTHook/makefile | 6 + hook_IDT/IDTHook/mybuild.bat | 3 + hook_IDT/IDTHook/readme.txt | 157 ++++ hook_IDT/IDTHook/sources | 9 + hook_IDT/README.md | 4 + 13 files changed, 1690 insertions(+) create mode 100644 hook_IDT/IDTHook/IDTHook.c create mode 100644 hook_IDT/IDTHook/IDTHook.h create mode 100644 hook_IDT/IDTHook/IDTHook.sln create mode 100644 hook_IDT/IDTHook/IDTHook.suo create mode 100644 hook_IDT/IDTHook/IDTHook.vcxproj create mode 100644 hook_IDT/IDTHook/IDTHook.vcxproj.user create mode 100644 hook_IDT/IDTHook/clean.bat create mode 100644 hook_IDT/IDTHook/ddkbuild.cmd create mode 100644 hook_IDT/IDTHook/makefile create mode 100644 hook_IDT/IDTHook/mybuild.bat create mode 100644 hook_IDT/IDTHook/readme.txt create mode 100644 hook_IDT/IDTHook/sources create mode 100644 hook_IDT/README.md diff --git a/hook_IDT/IDTHook/IDTHook.c b/hook_IDT/IDTHook/IDTHook.c new file mode 100644 index 0000000..61256b6 --- /dev/null +++ b/hook_IDT/IDTHook/IDTHook.c @@ -0,0 +1,195 @@ + +#ifndef CXX_IDTHOOK_H +# include "IDTHook.h" +#endif +#include + + +ULONG_PTR g_OrigKiTrap03; +KIRQL Irql; + + +_declspec(naked) void NewKiTrap03() +{ + + __asm + { + //测试 + //jmp g_OrigKiTrap03 + + //构建Trap03的异常帧 + //保存现场环境,和原始Trap03一样 + push 0 ;ErrorCode + push ebp + push ebx + push esi + push edi + push fs + mov ebx,30h + mov fs,bx + mov ebx,dword ptr fs:[0] + push ebx + sub esp,4 + push eax + push ecx + push edx + push ds + push es + push gs + + sub esp,30h //esp此时就指向陷阱帧 + + push esp //FilterExceptionInfo自己清理了 + + call FilterExceptionInfo //过滤函数 + + add esp , 0x30 + pop gs + pop es + pop ds + pop edx + pop ecx + pop eax + add esp , 4 + pop ebx + pop fs + pop edi + pop esi + pop ebx + pop ebp + add esp , 0x4 + jmp g_OrigKiTrap03 + } +} + + + +VOID __stdcall FilterExceptionInfo(PX86_KTRAP_FRAME pTrapFrame) +{ + + //eip的值减一过int3,汇编代码分析中dec, + DbgPrint("Eip:%x\r\n",(pTrapFrame->Eip)-1); +} + + +NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryString) +{ + NTSTATUS Status = STATUS_SUCCESS; + IDTR Idtr; + PIDTENTRY pIdtArray = NULL; + ULONG_PTR Index = 0; + + DriverObject->DriverUnload = UnloadDriver; + __asm sidt Idtr + //虚拟机是单核的,只用一个就可以了 + if(KeGetIdt(&pIdtArray)) + { + DbgPrint("%x---%x\r\n",Idtr.base,Idtr.limit); + for (Index =0;Index<(Idtr.limit+1)/sizeof(IDTENTRY);Index++) + { + DbgPrint("TrapHandle[%d]:%x\r\n",Index,MAKELONG(pIdtArray[Index].LowOffset,pIdtArray[Index].HiOffset)); + } + + g_OrigKiTrap03 = MAKELONG(pIdtArray[3].LowOffset,pIdtArray[3].HiOffset); + + WPOFF(); + pIdtArray[3].LowOffset = (ULONG_PTR)NewKiTrap03 & 0xFFFF; //低16位 + pIdtArray[3].HiOffset = (ULONG_PTR)NewKiTrap03 >> 16; //高16位 + WPON(); + + } + + //limit 0x7ff (包含0) 0x800 = 2048 Entry每项大小8字节,就2048/8 = 256 成员 + //!idt -a 0ff = 256 + + //MAKELONG + //#define MAKELONG(a, b) ((LONG)(((WORD)(((DWORD_PTR)(a)) & 0xffff)) | ((DWORD)((WORD)(((DWORD_PTR)(b)) & 0xffff))) << 16)) + return Status; +} + + + + + +BOOLEAN KeGetIdt(PIDTENTRY *pIdtArray) +{ + ULONG Index,Affinity,CurrentAffinity; + pfnKESETAFFINITYTHREAD fnpKeSetAffinityThread; + + UNICODE_STRING usFuncName; + PIDTENTRY pIdtEntry; + + RtlInitUnicodeString(&usFuncName,L"KeSetAffinityThread"); + fnpKeSetAffinityThread = (pfnKESETAFFINITYTHREAD)MmGetSystemRoutineAddress(&usFuncName); + + if (fnpKeSetAffinityThread==0) + { + return FALSE; + } + + Affinity = KeQueryActiveProcessors(); + //KeQueryActiveProcessors获取处理器相关的位图 + //(这里的位图可以理解为个数,比如返回1代表一个处理器,返回3表示两个处理器,返回7表示三个处理器,依此类推。 + //也就是说从有多少个处理器,那么Affinity的值就会从低位到高位依此填充多少位) + + CurrentAffinity = 1; + Index = 0; + while(Affinity) + { + //下面只是个简单的算法,使当前线程运行到不同的处理器上 + Affinity &= ~CurrentAffinity; + fnpKeSetAffinityThread(PsGetCurrentThread(),(KAFFINITY)CurrentAffinity); + CurrentAffinity <<= 1; + + __asm{ + push eax + mov eax,fs:[0x38] + mov pIdtEntry,eax + pop eax + } + //得到我们要的东西 + pIdtArray[Index] = pIdtEntry; + Index++; + } + + return TRUE; +} + + +VOID WPOFF() +{ + ULONG_PTR cr0 = 0; + Irql = KeRaiseIrqlToDpcLevel(); + cr0 =__readcr0(); + cr0 &= 0xfffffffffffeffff; + __writecr0(cr0); + +} + + + + + +VOID WPON() +{ + + ULONG_PTR cr0=__readcr0(); + cr0 |= 0x10000; + __writecr0(cr0); + KeLowerIrql(Irql); +} + + + +VOID UnloadDriver(PDRIVER_OBJECT DriverObject) +{ + //恢复 + PIDTENTRY pIdtEntry; + if (g_OrigKiTrap03 && KeGetIdt(&pIdtEntry)) + { + WPOFF(); + pIdtEntry[3].LowOffset = g_OrigKiTrap03 & 0xFFFF; + pIdtEntry[3].HiOffset = g_OrigKiTrap03 >> 16; + WPON(); + } +} \ No newline at end of file diff --git a/hook_IDT/IDTHook/IDTHook.h b/hook_IDT/IDTHook/IDTHook.h new file mode 100644 index 0000000..03d25c6 --- /dev/null +++ b/hook_IDT/IDTHook/IDTHook.h @@ -0,0 +1,85 @@ + + +#ifndef CXX_IDTHOOK_H +#define CXX_IDTHOOK_H + +#include +#include +#endif + +#pragma pack(2) //默认是4字节对齐 +typedef struct _IDTR +{ + USHORT limit; //范围,所占内存大小 + ULONG base; //IDT表项起始地址 +}IDTR,*PIDTR; +#pragma pack() + +//占8字节 +typedef struct _IDTENTRY +{ + unsigned short LowOffset; //LowOffset和HiOffset组成一4字节的地址就是处理例程的地址 + unsigned short selector; + unsigned char retention:5; + unsigned char zero1:3; + unsigned char gate_type:1; + unsigned char zero2:1; + unsigned char interrupt_gate_size:1; + unsigned char zero3:1; + unsigned char zero4:1; + unsigned char DPL:2; + unsigned char P:1; + unsigned short HiOffset; +} IDTENTRY,*PIDTENTRY; + + +typedef struct _X86_KTRAP_FRAME { + ULONG DbgEbp; + ULONG DbgEip; + ULONG DbgArgMark; + ULONG DbgArgPointer; + ULONG TempSegCs; + ULONG TempEsp; + ULONG Dr0; + ULONG Dr1; + ULONG Dr2; + ULONG Dr3; + ULONG Dr6; + ULONG Dr7; + ULONG SegGs; + ULONG SegEs; + ULONG SegDs; + ULONG Edx; + ULONG Ecx; + ULONG Eax; + ULONG PreviousPreviousMode; + ULONG ExceptionList; + ULONG SegFs; + ULONG Edi; + ULONG Esi; + ULONG Ebx; + ULONG Ebp; + ULONG ErrCode; + + ULONG Eip; + ULONG SegCs; + ULONG EFlags; + ULONG HardwareEsp; // WARNING - segSS:esp are only here for stacks + ULONG HardwareSegSs; // that involve a ring transition. + ULONG V86Es; // these will be present for all transitions from + ULONG V86Ds; // V86 mode + ULONG V86Fs; + ULONG V86Gs; +} X86_KTRAP_FRAME, *PX86_KTRAP_FRAME; + + + +VOID UnloadDriver(PDRIVER_OBJECT DriverObject); +VOID WPOFF(); +VOID WPON(); +VOID __stdcall FilterExceptionInfo(PX86_KTRAP_FRAME pTrapFrame); +BOOLEAN KeGetIdt(PIDTENTRY *pIdtArray); +typedef KAFFINITY (*pfnKESETAFFINITYTHREAD)( + __inout PKTHREAD Thread, + __in KAFFINITY Affinity + ); \ No newline at end of file diff --git a/hook_IDT/IDTHook/IDTHook.sln b/hook_IDT/IDTHook/IDTHook.sln new file mode 100644 index 0000000..4f79781 --- /dev/null +++ b/hook_IDT/IDTHook/IDTHook.sln @@ -0,0 +1,16 @@ +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio 2010 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "IDTHook", "IDTHook.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/hook_IDT/IDTHook/IDTHook.suo b/hook_IDT/IDTHook/IDTHook.suo new file mode 100644 index 0000000000000000000000000000000000000000..c84ee806ca82bd3a1a3948909040797b1748adab GIT binary patch literal 10240 zcmeHMZ){sv6~As)w*FyVw^BwJomo59wXu2r6T42EQu{r7shYH5@sbKfNVfBwyvFg1 z?B^~~6I8*6@dd^QB&10bW9udaQnv~TG$D=ABEd9?R_p^3Lx@WJ`N$-`AjA@Wzx&=x z9V@n*n4+e(zfEZP7p{MUPln-61|!*X~1|Ea^TW zwxPo7mDSZ%yHN;KKcWwj2i}LRcRBBHJ4(LqyTSK>cYr?*-U;3X-VNRZz88$wFZP1( z2lM@tKcWwx2c8rrewOfyv?!yjh()|n@3dcRUz_ucg;w-J?3M7dZ{PCuKLcF6sq^S$H!#+QZ_4cqAF&^urN?s;wk*=u*q$&w(0PY*yihn zjB7(1ae14V$@xVZhrX;6+50>?sRmqk5{G+ve$taxB7qjN9 zULMRVkz#)_UJQk%`juQHcehmLYP_p9ViYQ7)ht@UaidzxmBy^vlwk&?3DbIIt&%m( z(u7f-GM}ynwVaj98uQiQs8KHG@+Dnfq!%o`Ts87W$*>lKqqMY&mV$nCSXT53pBuBx ziq3KFx|5G_>|Ib6I5Q6vCgxQg4AgG zb$fExk@k|UCD_kpuqy4avw~^7i=3FlJI=rtB^eQZtO^U_n23qTVc!Va3y?D5B@_7r z^O$k8RS{7+JmJS`YN0+Qed(9697H@%LQ2IypS4g{Q5H}N@y-9b4UG2^Mp={=xR$ur z|7nXF`6KCL$IM7j%C}(?W5?DBoSe`^g+j40jY7jVoLhiRLc(DSX5;5-} zt-CYR;cE+M$+d`*>sQ2qF6JNC>nELoY3R3rH#z6@Tp#J9xW}BN)k>&1>mTt@OKlK@FaM%uY2>Ky+b zM_1>a05=gCe5WTd0*<3o+A02tbgoA%Y6A*>m!j!(EUxy)1F3X85s0c9YLS!@NJNuq zH606Usc2|<>9m#|GR@iG#lpgT#k{bj4NN*sZW$~rEnU)-bST-c#?VDSI!i}GfkY~% z1R{}Ge^2JXjjmdKx+~bs(dPp`zf@9#4=W~DP(8s^`4Wvr+Te)=z1B~ zHhXoW>^<__X)A3z4piOh(c0^yz0xl^8EOP4U_tC3QgWT*-Z_Q$F$LX?eosO&BR$PG z5R!h6!;=xzLilOY+w^n@{tn12B8h($Z$QD5{Hc)k>UXXvNtr(wI7!g)Y!U04?QLeP z%|^r1I&U;44()nBdGs4UAG-FtAKZN4<%vDR;@-DsNTBhx6UP z?tAn%uO2-3#E<`cd-<{a90L(FCXN;NU0=C=VED@OQ&+!p;BSe}p0|7H{{M@9fqAg; z?tA@iJO~dKu=kx`n^lDVZl856K8HQl1?;1_*KW-5#<9v1>ZHExgf4$~EguAag z9jk~`p1@b-zFo&$ZnVM?Y*O(2oqAnrBDSu%KL2uYfafmru!TE6X2UjGFyC!W)K6^V zcQe}1TH3xFLvh&=d{F|GQ)Ns=t2xL&z?tr0z1tT!J+j znUQj5#S_7H#P1KA(ND}O;IxhL#}fyhJq$bkXq9)ncJcgysVvX*ypEqyO>`u=@89-! z7FN_SYHRI#R0TVeRyjEKADbFK&!PMcR@jz#`^Wb$nF4Z8<8}N4khPrdfgw95mi}^f z@r~aO|LC=EU;TCd-K4Aewzcx2`jcCGul9-;-rBQz!)Dsd13eMdl9`UyTS=#DVo?~KcwxUB=tN8_XR>oNcWmWJDll%9OJeA=WuI6<9W;eUG zJN=zQyz~5#Ck5o`I^@&PQn@3#VU765Pr3ZQ=QaLLK(^@g);M~vxa&NQZ;GAIKW1fz zoetdZyzckkF+?KQ0Dgm@XWAhk#^3S${{nQo=Wnh2&oznPHd_(>{}2TDUDd1qPeFDB zOgii>^_UUrAD(&p*381v1v{;`s7tH57)Y0ow2Qyi u=)><=oyUI)wz~1xPCs+SR>b(PcX%sV_nw9dv3#qjQ~g_|*X?IB`u`0$!Nyep literal 0 HcmV?d00001 diff --git a/hook_IDT/IDTHook/IDTHook.vcxproj b/hook_IDT/IDTHook/IDTHook.vcxproj new file mode 100644 index 0000000..12b380b --- /dev/null +++ b/hook_IDT/IDTHook/IDTHook.vcxproj @@ -0,0 +1,62 @@ +锘 + + + + WinDDK + Win32 + + + + {4EE67C57-BE79-4CD7-B3B0-94AECE62DB41} + Win32Proj + "IDTHook" + + + + + + + + .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/hook_IDT/IDTHook/IDTHook.vcxproj.user b/hook_IDT/IDTHook/IDTHook.vcxproj.user new file mode 100644 index 0000000..ace9a86 --- /dev/null +++ b/hook_IDT/IDTHook/IDTHook.vcxproj.user @@ -0,0 +1,3 @@ +锘 + + \ No newline at end of file diff --git a/hook_IDT/IDTHook/clean.bat b/hook_IDT/IDTHook/clean.bat new file mode 100644 index 0000000..a92852f --- /dev/null +++ b/hook_IDT/IDTHook/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/hook_IDT/IDTHook/ddkbuild.cmd b/hook_IDT/IDTHook/ddkbuild.cmd new file mode 100644 index 0000000..8acd7a4 --- /dev/null +++ b/hook_IDT/IDTHook/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/hook_IDT/IDTHook/makefile b/hook_IDT/IDTHook/makefile new file mode 100644 index 0000000..98801a4 --- /dev/null +++ b/hook_IDT/IDTHook/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/hook_IDT/IDTHook/mybuild.bat b/hook_IDT/IDTHook/mybuild.bat new file mode 100644 index 0000000..ecb14fe --- /dev/null +++ b/hook_IDT/IDTHook/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/hook_IDT/IDTHook/readme.txt b/hook_IDT/IDTHook/readme.txt new file mode 100644 index 0000000..f2b78db --- /dev/null +++ b/hook_IDT/IDTHook/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/hook_IDT/IDTHook/sources b/hook_IDT/IDTHook/sources new file mode 100644 index 0000000..5b9a72c --- /dev/null +++ b/hook_IDT/IDTHook/sources @@ -0,0 +1,9 @@ +TARGETNAME=IDTHook +#TARGETPATH=$(BASEDIR)\lib +TARGETPATH=obj +TARGETTYPE=DRIVER + +INCLUDES=.\ + +SOURCES=IDTHook.c + diff --git a/hook_IDT/README.md b/hook_IDT/README.md new file mode 100644 index 0000000..e46e516 --- /dev/null +++ b/hook_IDT/README.md @@ -0,0 +1,4 @@ +##hook IDT +用WDK7600命令行可直接编译,会Hook系统的IDT中的3号中断,也就是INT 3断点的处理例程。 + +[http://www.cnblogs.com/lanrenxinxin/p/4360983.html](http://www.cnblogs.com/lanrenxinxin/p/4360983.html) \ No newline at end of file