From c9302e90324b47e9534267ac2b3950f11eadc721 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bo=20Brant=C3=A9n?= Date: Tue, 21 Jan 2020 11:05:36 +0100 Subject: [PATCH] New project files for Visual Studio --- DIRS | 2 +- Ext2Mgr/Ext2Mgr.sln | 20 - Ext2Mgr/Ext2Mgr.vcproj | 914 -------------- Ext2Mgr/Ext2Mgr.vcxproj | 225 ++++ Ext2Mgr/Ext2Mgr.vcxproj.filters | 167 +++ Ext2Mgr/MAKEFILE | 11 - Ext2Mgr/SOURCES | 32 - Ext2Mgr/astyle.bat | 2 - Ext2Mgr/enumDisk.h | 2 +- Ext2Srv/Ext2Srv.sln | 28 - Ext2Srv/Ext2Srv.vcproj | 263 ---- Ext2Srv/Ext2Srv.vcxproj | 174 +++ Ext2Srv/Ext2Srv.vcxproj.filters | 46 + Ext2Srv/Release/X86/Ext2Srv.exe | Bin 72192 -> 0 bytes Ext3Fsd.sln | 45 - Ext4Fsd.sln | 82 ++ Ext4Fsd/Ext4Fsd.vcxproj | 285 +++++ Ext4Fsd/Ext4Fsd.vcxproj.filters | 288 +++++ Ext4Fsd/ddkbuild.bat | 1268 ------------------- Ext4Fsd/debug.c | 2 +- Ext4Fsd/ext3fsd.vcproj | 693 ----------- Ext4Fsd/include/ext2fs.h | 5 +- Ext4Fsd/include/linux/errno.h | 2 + Ext4Fsd/include/linux/ext3_fs.h | 2 + Ext4Fsd/include/linux/jbd.h | 1 - Ext4Fsd/linux.c | 2065 ++++++++++++++++--------------- Ext4Fsd/misc.c | 12 +- 27 files changed, 2344 insertions(+), 4292 deletions(-) delete mode 100644 Ext2Mgr/Ext2Mgr.sln delete mode 100644 Ext2Mgr/Ext2Mgr.vcproj create mode 100644 Ext2Mgr/Ext2Mgr.vcxproj create mode 100644 Ext2Mgr/Ext2Mgr.vcxproj.filters delete mode 100644 Ext2Mgr/MAKEFILE delete mode 100644 Ext2Mgr/SOURCES delete mode 100644 Ext2Mgr/astyle.bat delete mode 100644 Ext2Srv/Ext2Srv.sln delete mode 100644 Ext2Srv/Ext2Srv.vcproj create mode 100644 Ext2Srv/Ext2Srv.vcxproj create mode 100644 Ext2Srv/Ext2Srv.vcxproj.filters delete mode 100644 Ext2Srv/Release/X86/Ext2Srv.exe delete mode 100644 Ext3Fsd.sln create mode 100644 Ext4Fsd.sln create mode 100644 Ext4Fsd/Ext4Fsd.vcxproj create mode 100644 Ext4Fsd/Ext4Fsd.vcxproj.filters delete mode 100644 Ext4Fsd/ddkbuild.bat delete mode 100644 Ext4Fsd/ext3fsd.vcproj diff --git a/DIRS b/DIRS index 5253ecb..61a11c5 100644 --- a/DIRS +++ b/DIRS @@ -1 +1 @@ -DIRS=Ext2Srv Ext3Fsd Ext2Mgr +DIRS=Ext2Srv Ext4Fsd diff --git a/Ext2Mgr/Ext2Mgr.sln b/Ext2Mgr/Ext2Mgr.sln deleted file mode 100644 index 7002a8b..0000000 --- a/Ext2Mgr/Ext2Mgr.sln +++ /dev/null @@ -1,20 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 10.00 -# Visual Studio 2008 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Ext2Mgr", "Ext2Mgr.vcproj", "{F0E304B5-AF20-49F7-8183-5994C6EA889D}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Release|Win32 = Release|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {F0E304B5-AF20-49F7-8183-5994C6EA889D}.Debug|Win32.ActiveCfg = Debug|Win32 - {F0E304B5-AF20-49F7-8183-5994C6EA889D}.Debug|Win32.Build.0 = Debug|Win32 - {F0E304B5-AF20-49F7-8183-5994C6EA889D}.Release|Win32.ActiveCfg = Release|Win32 - {F0E304B5-AF20-49F7-8183-5994C6EA889D}.Release|Win32.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/Ext2Mgr/Ext2Mgr.vcproj b/Ext2Mgr/Ext2Mgr.vcproj deleted file mode 100644 index 0f6fe37..0000000 --- a/Ext2Mgr/Ext2Mgr.vcproj +++ /dev/null @@ -1,914 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Ext2Mgr/Ext2Mgr.vcxproj b/Ext2Mgr/Ext2Mgr.vcxproj new file mode 100644 index 0000000..68911b3 --- /dev/null +++ b/Ext2Mgr/Ext2Mgr.vcxproj @@ -0,0 +1,225 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 15.0 + {E1AF85D7-0179-4CF0-B0D1-21AE72B6DC2E} + Ext2Mgr + 10.0.17763.0 + + + + Application + true + v141 + MultiByte + Dynamic + + + Application + false + v141 + true + MultiByte + Dynamic + + + Application + true + v141 + MultiByte + Dynamic + + + Application + false + v141 + true + MultiByte + Dynamic + + + + + + + + + + + + + + + + + + + + + Ext2Mgr + $(SolutionDir)Ext2Mgr\$(Configuration)\x86\ + $(Configuration)\x86\ + + + Ext2Mgr + $(SolutionDir)Ext2Mgr\$(Configuration)\x86\ + $(Configuration)\x86\ + + + Ext2Mgr + $(SolutionDir)Ext2Mgr\$(Configuration)\x64\ + $(Configuration)\x64\ + + + Ext2Mgr + $(SolutionDir)Ext2Mgr\$(Configuration)\x64\ + $(Configuration)\x64\ + + + + Level3 + Disabled + true + true + /Zc:strictStrings- %(AdditionalOptions) + _CRT_SECURE_NO_WARNINGS;_WIN32_WINNT=0x0501;%(PreprocessorDefinitions) + 4996;4703;%(DisableSpecificWarnings) + $(UM_IncludePath)\..\km;%(AdditionalIncludeDirectories) + + + Windows + ntdll.lib;setupapi.lib;%(AdditionalDependencies) + + + + + Level3 + Disabled + true + true + /Zc:strictStrings- %(AdditionalOptions) + _CRT_SECURE_NO_WARNINGS;_WIN32_WINNT=0x0501;%(PreprocessorDefinitions) + 4996;4703;%(DisableSpecificWarnings) + $(UM_IncludePath)\..\km;%(AdditionalIncludeDirectories) + + + Windows + ntdll.lib;setupapi.lib;%(AdditionalDependencies) + + + + + Level3 + MaxSpeed + true + true + true + true + /Zc:strictStrings- %(AdditionalOptions) + _CRT_SECURE_NO_WARNINGS;_WIN32_WINNT=0x0501;%(PreprocessorDefinitions) + 4996;4703;%(DisableSpecificWarnings) + $(UM_IncludePath)\..\km;%(AdditionalIncludeDirectories) + + + true + true + Windows + ntdll.lib;setupapi.lib;%(AdditionalDependencies) + + + + + Level3 + MaxSpeed + true + true + true + true + /Zc:strictStrings- %(AdditionalOptions) + _CRT_SECURE_NO_WARNINGS;_WIN32_WINNT=0x0501;%(PreprocessorDefinitions) + 4996;4703;%(DisableSpecificWarnings) + $(UM_IncludePath)\..\km;%(AdditionalIncludeDirectories) + + + true + true + Windows + ntdll.lib;setupapi.lib;%(AdditionalDependencies) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Ext2Mgr/Ext2Mgr.vcxproj.filters b/Ext2Mgr/Ext2Mgr.vcxproj.filters new file mode 100644 index 0000000..2fa5093 --- /dev/null +++ b/Ext2Mgr/Ext2Mgr.vcxproj.filters @@ -0,0 +1,167 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;hm;inl;inc;ipp;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 + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + + + Resource Files + + + \ No newline at end of file diff --git a/Ext2Mgr/MAKEFILE b/Ext2Mgr/MAKEFILE deleted file mode 100644 index ef95367..0000000 --- a/Ext2Mgr/MAKEFILE +++ /dev/null @@ -1,11 +0,0 @@ -BUILD_ALLOW_COMPILER_WARNINGS=1 -BUILD_ALLOW_LINKER_WARNINGS=1 - -# -# 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 driver components of the Windows NT DDK -# - -!INCLUDE $(NTMAKEENV)\makefile.def - diff --git a/Ext2Mgr/SOURCES b/Ext2Mgr/SOURCES deleted file mode 100644 index 9d4e451..0000000 --- a/Ext2Mgr/SOURCES +++ /dev/null @@ -1,32 +0,0 @@ -TARGETNAME=Ext2Mgr -TARGETPATH=obj -TARGETTYPE=PROGRAM - -USE_MFC=1 - -!IF $(_NT_TARGET_VERSION) > 0x500 -C_DEFINES=/DUSE_MFC6_WITH_ATL7=1,$(C_DEFINES) -!ENDIF -INCLUDES= .;..\Ext2Srv\;..\Ext3Fsd\include;..\Ext2Srv\Libraries; \ - $(DDK_INC_PATH);$(SDK_INC_PATH); $(MFC_INC_PATH); \ - $(MFC_INC_PATH)\..\atlmfc;$(INCLUDES) -TARGETLIBS= $(DDK_LIB_PATH)\ntdll.lib $(DDK_LIB_PATH)\setupapi.lib \ - $(DDK_LIB_PATH)\shell32.lib $(DDK_LIB_PATH)\Comctl32.lib - -PRECOMPILED_CXX=1 -PRECOMPILED_INCLUDE=stdafx.h - -SXS_MANIFEST=Ext2Mgr.exe.manifest -SXS_ASSEMBLY_NAME=Ext2Mgr -SXS_ASSEMBLY_VERSION=1.0 -SXS_ASSEMBLY_LANGUAGE_INDEPENDENT=1 -SXS_MANIFEST_IN_RESOURCES=1 - -SOURCES= DelDeadLetter.cpp DiskBox.cpp DlgView.cpp \ - Donate.cpp enumDisk.cpp Ext2Attribute.cpp \ - Ext2Mgr.cpp Ext2MgrDlg.cpp Ext2Pipe.cpp \ - HyperLink.cpp MountPoints.cpp PartBox.cpp \ - PartitionType.cpp PerfStatDlg.cpp Properties.cpp \ - SelectDrvLetter.cpp ServiceManage.cpp Splash.cpp \ - SysTray.cpp toolbar.cpp TreeList.cpp \ - Ext2Mgr.rc diff --git a/Ext2Mgr/astyle.bat b/Ext2Mgr/astyle.bat deleted file mode 100644 index d36082a..0000000 --- a/Ext2Mgr/astyle.bat +++ /dev/null @@ -1,2 +0,0 @@ -for /R %%a in (*.c;*.cpp;*.h;) do astyle.exe --indent=spaces=4 %%a -for /R %%a in (*.c;*.cpp;*.h;DIRS;sources;) do dos2unix %%a diff --git a/Ext2Mgr/enumDisk.h b/Ext2Mgr/enumDisk.h index e3e3139..ef1270d 100644 --- a/Ext2Mgr/enumDisk.h +++ b/Ext2Mgr/enumDisk.h @@ -334,7 +334,7 @@ typedef VOID (__stdcall *PFORMATEX)( PWCHAR DriveRoot, DWORD ClusterSize, PFMIFSCALLBACK Callback ); -#include "..\ext3fsd\include\common.h" +#include "..\ext4fsd\include\common.h" /* * structure definitions diff --git a/Ext2Srv/Ext2Srv.sln b/Ext2Srv/Ext2Srv.sln deleted file mode 100644 index 10d0cac..0000000 --- a/Ext2Srv/Ext2Srv.sln +++ /dev/null @@ -1,28 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 10.00 -# Visual Studio 2008 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Ext2Srv", "Ext2Srv.vcproj", "{A18F670C-DA85-43F6-8620-99A2DD8CEF1A}" -EndProject -Global - GlobalSection(SourceCodeControl) = preSolution - SccNumberOfProjects = 1 - SccProjectUniqueName0 = Ext2Srv.vcproj - SccProjectName0 = Ext2Srv - SccLocalPath0 = . - SccProvider0 = MSSCCI:Perforce\u0020P4\u0020SCM - CanCheckoutShared = true - EndGlobalSection - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Release|Win32 = Release|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {A18F670C-DA85-43F6-8620-99A2DD8CEF1A}.Debug|Win32.ActiveCfg = Debug|Win32 - {A18F670C-DA85-43F6-8620-99A2DD8CEF1A}.Debug|Win32.Build.0 = Debug|Win32 - {A18F670C-DA85-43F6-8620-99A2DD8CEF1A}.Release|Win32.ActiveCfg = Release|Win32 - {A18F670C-DA85-43F6-8620-99A2DD8CEF1A}.Release|Win32.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/Ext2Srv/Ext2Srv.vcproj b/Ext2Srv/Ext2Srv.vcproj deleted file mode 100644 index 99f7b99..0000000 --- a/Ext2Srv/Ext2Srv.vcproj +++ /dev/null @@ -1,263 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Ext2Srv/Ext2Srv.vcxproj b/Ext2Srv/Ext2Srv.vcxproj new file mode 100644 index 0000000..d5c4583 --- /dev/null +++ b/Ext2Srv/Ext2Srv.vcxproj @@ -0,0 +1,174 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 15.0 + {6A5A0B13-7E05-4CA9-9A2B-FADF76DBAC20} + Ext2Srv + 10.0.17763.0 + + + + Application + true + v141 + MultiByte + + + Application + false + v141 + true + MultiByte + + + Application + true + v141 + MultiByte + + + Application + false + v141 + true + MultiByte + + + + + + + + + + + + + + + + + + + + + Ext2Srv + $(SolutionDir)Ext2Srv\$(Configuration)\x86\ + $(Configuration)\x86\ + + + Ext2Srv + $(SolutionDir)Ext2Srv\$(Configuration)\x86\ + $(Configuration)\x86\ + + + Ext2Srv + $(SolutionDir)Ext2Srv\$(Configuration)\x64\ + $(Configuration)\x64\ + + + Ext2Srv + $(SolutionDir)Ext2Srv\$(Configuration)\x64\ + $(Configuration)\x64\ + + + + Level3 + Disabled + true + true + ./;%(AdditionalIncludeDirectories) + /Zc:strictStrings- %(AdditionalOptions) + _CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + + + Wtsapi32.lib;%(AdditionalDependencies) + + + + + Level3 + Disabled + true + true + ./;%(AdditionalIncludeDirectories) + /Zc:strictStrings- %(AdditionalOptions) + _CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + + + Wtsapi32.lib;%(AdditionalDependencies) + + + + + Level3 + MaxSpeed + true + true + true + true + ./;%(AdditionalIncludeDirectories) + /Zc:strictStrings- %(AdditionalOptions) + _CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + + + true + true + Wtsapi32.lib;%(AdditionalDependencies) + + + + + Level3 + MaxSpeed + true + true + true + true + ./;%(AdditionalIncludeDirectories) + /Zc:strictStrings- %(AdditionalOptions) + _CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + + + true + true + Wtsapi32.lib;%(AdditionalDependencies) + + + + + + + + + + + + + + + + + + + + + diff --git a/Ext2Srv/Ext2Srv.vcxproj.filters b/Ext2Srv/Ext2Srv.vcxproj.filters new file mode 100644 index 0000000..9c32aad --- /dev/null +++ b/Ext2Srv/Ext2Srv.vcxproj.filters @@ -0,0 +1,46 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;hm;inl;inc;ipp;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 + + + + + Source Files + + + Source Files + + + Source Files + + + + + Header Files + + + Header Files + + + + + Resource Files + + + + + Resource Files + + + \ No newline at end of file diff --git a/Ext2Srv/Release/X86/Ext2Srv.exe b/Ext2Srv/Release/X86/Ext2Srv.exe deleted file mode 100644 index ec001c8fcc0db41fa3f8dedf34348e72c85779fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 72192 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 diff --git a/Ext3Fsd.sln b/Ext3Fsd.sln deleted file mode 100644 index 08c2075..0000000 --- a/Ext3Fsd.sln +++ /dev/null @@ -1,45 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 10.00 -# Visual Studio 2008 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Ext3Fsd", "Ext3Fsd\ext3fsd.vcproj", "{2328F787-71B4-408B-8E10-B7A95BF9A110}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Ext2Mgr", "Ext2Mgr\Ext2Mgr.vcproj", "{F0E304B5-AF20-49F7-8183-5994C6EA889D}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Ext2Srv", "Ext2Srv\Ext2Srv.vcproj", "{A18F670C-DA85-43F6-8620-99A2DD8CEF1A}" -EndProject -Global - GlobalSection(SourceCodeControl) = preSolution - SccNumberOfProjects = 2 - SccProjectUniqueName0 = Ext3Fsd\\ext3fsd.vcproj - SccProjectName0 = Ext3Fsd - SccLocalPath0 = Ext3Fsd - SccProvider0 = MSSCCI:Perforce\u0020P4\u0020SCM - CanCheckoutShared = true - SccProjectUniqueName1 = Ext2Srv\\Ext2Srv.vcproj - SccProjectName1 = Ext2Srv - SccLocalPath1 = Ext2Srv - SccProvider1 = MSSCCI:Perforce\u0020P4\u0020SCM - CanCheckoutShared = true - EndGlobalSection - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Release|Win32 = Release|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {2328F787-71B4-408B-8E10-B7A95BF9A110}.Debug|Win32.ActiveCfg = Debug|Win32 - {2328F787-71B4-408B-8E10-B7A95BF9A110}.Debug|Win32.Build.0 = Debug|Win32 - {2328F787-71B4-408B-8E10-B7A95BF9A110}.Release|Win32.ActiveCfg = Release|Win32 - {2328F787-71B4-408B-8E10-B7A95BF9A110}.Release|Win32.Build.0 = Release|Win32 - {F0E304B5-AF20-49F7-8183-5994C6EA889D}.Debug|Win32.ActiveCfg = Debug|Win32 - {F0E304B5-AF20-49F7-8183-5994C6EA889D}.Debug|Win32.Build.0 = Debug|Win32 - {F0E304B5-AF20-49F7-8183-5994C6EA889D}.Release|Win32.ActiveCfg = Release|Win32 - {F0E304B5-AF20-49F7-8183-5994C6EA889D}.Release|Win32.Build.0 = Release|Win32 - {A18F670C-DA85-43F6-8620-99A2DD8CEF1A}.Debug|Win32.ActiveCfg = Debug|Win32 - {A18F670C-DA85-43F6-8620-99A2DD8CEF1A}.Debug|Win32.Build.0 = Debug|Win32 - {A18F670C-DA85-43F6-8620-99A2DD8CEF1A}.Release|Win32.ActiveCfg = Release|Win32 - {A18F670C-DA85-43F6-8620-99A2DD8CEF1A}.Release|Win32.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/Ext4Fsd.sln b/Ext4Fsd.sln new file mode 100644 index 0000000..6e5e485 --- /dev/null +++ b/Ext4Fsd.sln @@ -0,0 +1,82 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.28307.421 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Ext2Mgr", "Ext2Mgr\Ext2Mgr.vcxproj", "{E1AF85D7-0179-4CF0-B0D1-21AE72B6DC2E}" + ProjectSection(ProjectDependencies) = postProject + {6A5A0B13-7E05-4CA9-9A2B-FADF76DBAC20} = {6A5A0B13-7E05-4CA9-9A2B-FADF76DBAC20} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Ext2Srv", "Ext2Srv\Ext2Srv.vcxproj", "{6A5A0B13-7E05-4CA9-9A2B-FADF76DBAC20}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Ext4Fsd", "Ext4Fsd\Ext4Fsd.vcxproj", "{E98007B5-02C6-4C8F-BB89-E0D530991559}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|ARM = Debug|ARM + Debug|ARM64 = Debug|ARM64 + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|ARM = Release|ARM + Release|ARM64 = Release|ARM64 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {E1AF85D7-0179-4CF0-B0D1-21AE72B6DC2E}.Debug|ARM.ActiveCfg = Debug|Win32 + {E1AF85D7-0179-4CF0-B0D1-21AE72B6DC2E}.Debug|ARM64.ActiveCfg = Debug|Win32 + {E1AF85D7-0179-4CF0-B0D1-21AE72B6DC2E}.Debug|x64.ActiveCfg = Debug|x64 + {E1AF85D7-0179-4CF0-B0D1-21AE72B6DC2E}.Debug|x64.Build.0 = Debug|x64 + {E1AF85D7-0179-4CF0-B0D1-21AE72B6DC2E}.Debug|x86.ActiveCfg = Debug|Win32 + {E1AF85D7-0179-4CF0-B0D1-21AE72B6DC2E}.Debug|x86.Build.0 = Debug|Win32 + {E1AF85D7-0179-4CF0-B0D1-21AE72B6DC2E}.Release|ARM.ActiveCfg = Release|Win32 + {E1AF85D7-0179-4CF0-B0D1-21AE72B6DC2E}.Release|ARM64.ActiveCfg = Release|Win32 + {E1AF85D7-0179-4CF0-B0D1-21AE72B6DC2E}.Release|x64.ActiveCfg = Release|x64 + {E1AF85D7-0179-4CF0-B0D1-21AE72B6DC2E}.Release|x64.Build.0 = Release|x64 + {E1AF85D7-0179-4CF0-B0D1-21AE72B6DC2E}.Release|x86.ActiveCfg = Release|Win32 + {E1AF85D7-0179-4CF0-B0D1-21AE72B6DC2E}.Release|x86.Build.0 = Release|Win32 + {6A5A0B13-7E05-4CA9-9A2B-FADF76DBAC20}.Debug|ARM.ActiveCfg = Debug|Win32 + {6A5A0B13-7E05-4CA9-9A2B-FADF76DBAC20}.Debug|ARM64.ActiveCfg = Debug|Win32 + {6A5A0B13-7E05-4CA9-9A2B-FADF76DBAC20}.Debug|x64.ActiveCfg = Debug|x64 + {6A5A0B13-7E05-4CA9-9A2B-FADF76DBAC20}.Debug|x64.Build.0 = Debug|x64 + {6A5A0B13-7E05-4CA9-9A2B-FADF76DBAC20}.Debug|x86.ActiveCfg = Debug|Win32 + {6A5A0B13-7E05-4CA9-9A2B-FADF76DBAC20}.Debug|x86.Build.0 = Debug|Win32 + {6A5A0B13-7E05-4CA9-9A2B-FADF76DBAC20}.Release|ARM.ActiveCfg = Release|Win32 + {6A5A0B13-7E05-4CA9-9A2B-FADF76DBAC20}.Release|ARM64.ActiveCfg = Release|Win32 + {6A5A0B13-7E05-4CA9-9A2B-FADF76DBAC20}.Release|x64.ActiveCfg = Release|x64 + {6A5A0B13-7E05-4CA9-9A2B-FADF76DBAC20}.Release|x64.Build.0 = Release|x64 + {6A5A0B13-7E05-4CA9-9A2B-FADF76DBAC20}.Release|x86.ActiveCfg = Release|Win32 + {6A5A0B13-7E05-4CA9-9A2B-FADF76DBAC20}.Release|x86.Build.0 = Release|Win32 + {E98007B5-02C6-4C8F-BB89-E0D530991559}.Debug|ARM.ActiveCfg = Debug|ARM + {E98007B5-02C6-4C8F-BB89-E0D530991559}.Debug|ARM.Build.0 = Debug|ARM + {E98007B5-02C6-4C8F-BB89-E0D530991559}.Debug|ARM.Deploy.0 = Debug|ARM + {E98007B5-02C6-4C8F-BB89-E0D530991559}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {E98007B5-02C6-4C8F-BB89-E0D530991559}.Debug|ARM64.Build.0 = Debug|ARM64 + {E98007B5-02C6-4C8F-BB89-E0D530991559}.Debug|ARM64.Deploy.0 = Debug|ARM64 + {E98007B5-02C6-4C8F-BB89-E0D530991559}.Debug|x64.ActiveCfg = Debug|x64 + {E98007B5-02C6-4C8F-BB89-E0D530991559}.Debug|x64.Build.0 = Debug|x64 + {E98007B5-02C6-4C8F-BB89-E0D530991559}.Debug|x64.Deploy.0 = Debug|x64 + {E98007B5-02C6-4C8F-BB89-E0D530991559}.Debug|x86.ActiveCfg = Debug|Win32 + {E98007B5-02C6-4C8F-BB89-E0D530991559}.Debug|x86.Build.0 = Debug|Win32 + {E98007B5-02C6-4C8F-BB89-E0D530991559}.Debug|x86.Deploy.0 = Debug|Win32 + {E98007B5-02C6-4C8F-BB89-E0D530991559}.Release|ARM.ActiveCfg = Release|ARM + {E98007B5-02C6-4C8F-BB89-E0D530991559}.Release|ARM.Build.0 = Release|ARM + {E98007B5-02C6-4C8F-BB89-E0D530991559}.Release|ARM.Deploy.0 = Release|ARM + {E98007B5-02C6-4C8F-BB89-E0D530991559}.Release|ARM64.ActiveCfg = Release|ARM64 + {E98007B5-02C6-4C8F-BB89-E0D530991559}.Release|ARM64.Build.0 = Release|ARM64 + {E98007B5-02C6-4C8F-BB89-E0D530991559}.Release|ARM64.Deploy.0 = Release|ARM64 + {E98007B5-02C6-4C8F-BB89-E0D530991559}.Release|x64.ActiveCfg = Release|x64 + {E98007B5-02C6-4C8F-BB89-E0D530991559}.Release|x64.Build.0 = Release|x64 + {E98007B5-02C6-4C8F-BB89-E0D530991559}.Release|x64.Deploy.0 = Release|x64 + {E98007B5-02C6-4C8F-BB89-E0D530991559}.Release|x86.ActiveCfg = Release|Win32 + {E98007B5-02C6-4C8F-BB89-E0D530991559}.Release|x86.Build.0 = Release|Win32 + {E98007B5-02C6-4C8F-BB89-E0D530991559}.Release|x86.Deploy.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {8457A620-F40D-45A4-8FE0-1174D4E299ED} + EndGlobalSection +EndGlobal diff --git a/Ext4Fsd/Ext4Fsd.vcxproj b/Ext4Fsd/Ext4Fsd.vcxproj new file mode 100644 index 0000000..8dd722f --- /dev/null +++ b/Ext4Fsd/Ext4Fsd.vcxproj @@ -0,0 +1,285 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + Debug + ARM + + + Release + ARM + + + Debug + ARM64 + + + Release + ARM64 + + + + {E98007B5-02C6-4C8F-BB89-E0D530991559} + {dd38f7fc-d7bd-488b-9242-7d8754cde80d} + v4.5 + 12.0 + Debug + Win32 + Ext4Fsd + $(LatestTargetPlatformVersion) + + + + Windows10 + true + WindowsKernelModeDriver10.0 + Driver + WDM + 1 + + + Windows10 + false + WindowsKernelModeDriver10.0 + Driver + WDM + 1 + + + Windows10 + true + WindowsKernelModeDriver10.0 + Driver + WDM + 1 + + + Windows10 + false + WindowsKernelModeDriver10.0 + Driver + WDM + 1 + + + Windows10 + true + WindowsKernelModeDriver10.0 + Driver + WDM + + + Windows10 + false + WindowsKernelModeDriver10.0 + Driver + WDM + + + Windows10 + true + WindowsKernelModeDriver10.0 + Driver + WDM + + + Windows10 + false + WindowsKernelModeDriver10.0 + Driver + WDM + + + + + + + + + + + DbgengKernelDebugger + $(SolutionDir)Ext4Fsd\$(ConfigurationName)\x86\ + $(ConfigurationName)\x86\ + Ext4Fsd + + + DbgengKernelDebugger + $(SolutionDir)Ext4Fsd\$(ConfigurationName)\x86\ + $(ConfigurationName)\x86\ + Ext4Fsd + + + DbgengKernelDebugger + $(SolutionDir)Ext4Fsd\$(ConfigurationName)\x64\ + $(ConfigurationName)\x64\ + Ext4Fsd + + + DbgengKernelDebugger + $(SolutionDir)Ext4Fsd\$(ConfigurationName)\x64\ + $(ConfigurationName)\x64\ + Ext4Fsd + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + + .\include;.\include\linux;.\include\asm;%(AdditionalIncludeDirectories) + Level3 + __KERNEL__;%(PreprocessorDefinitions) + 4995;%(DisableSpecificWarnings) + + + %(AdditionalDependencies) + + + + + .\include;.\include\linux;.\include\asm;%(AdditionalIncludeDirectories) + Level3 + __KERNEL__;%(PreprocessorDefinitions) + 4995;%(DisableSpecificWarnings) + + + %(AdditionalDependencies) + + + + + .\include;.\include\linux;.\include\asm;%(AdditionalIncludeDirectories) + Level3 + __KERNEL__;%(PreprocessorDefinitions) + 4995;%(DisableSpecificWarnings) + + + + + .\include;.\include\linux;.\include\asm;%(AdditionalIncludeDirectories) + Level3 + __KERNEL__;%(PreprocessorDefinitions) + 4995;%(DisableSpecificWarnings) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Ext4Fsd/Ext4Fsd.vcxproj.filters b/Ext4Fsd/Ext4Fsd.vcxproj.filters new file mode 100644 index 0000000..25e1fc5 --- /dev/null +++ b/Ext4Fsd/Ext4Fsd.vcxproj.filters @@ -0,0 +1,288 @@ + + + + + {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 + + + {8E41214B-6785-4CFE-B992-037D68949A14} + inf;inv;inx;mof;mc; + + + {13adb2ad-f681-4c9e-a21e-0fd46bbef319} + + + {9ab142d9-f11c-4d93-b92a-0df6595d2e24} + + + {3e51e838-e180-44c1-ae2d-53cf5297396b} + + + {94a9d102-6815-4f19-9b62-763fe5d482ca} + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files\ext3 + + + Source Files\ext3 + + + Source Files\ext3 + + + Source Files\ext3 + + + Source Files\ext4 + + + Source Files\ext4 + + + Source Files\ext4 + + + Source Files\ext4 + + + Source Files\ext4 + + + Source Files\jbd + + + Source Files\jbd + + + Source Files\jbd + + + Source Files\nls + + + Source Files\nls + + + Source Files\nls + + + Source Files\nls + + + Source Files\nls + + + Source Files\nls + + + Source Files\nls + + + Source Files\nls + + + Source Files\nls + + + Source Files\nls + + + Source Files\nls + + + Source Files\nls + + + Source Files\nls + + + Source Files\nls + + + Source Files\nls + + + Source Files\nls + + + Source Files\nls + + + Source Files\nls + + + Source Files\nls + + + Source Files\nls + + + Source Files\nls + + + Source Files\nls + + + Source Files\nls + + + Source Files\nls + + + Source Files\nls + + + Source Files\nls + + + Source Files\nls + + + Source Files\nls + + + Source Files\nls + + + Source Files\nls + + + Source Files\nls + + + Source Files\nls + + + Source Files\nls + + + Source Files\nls + + + Source Files\nls + + + Source Files\nls + + + Source Files\nls + + + Source Files\nls + + + Source Files\nls + + + Source Files\nls + + + Source Files\nls + + + + + Resource Files + + + + + Header Files + + + \ No newline at end of file diff --git a/Ext4Fsd/ddkbuild.bat b/Ext4Fsd/ddkbuild.bat deleted file mode 100644 index 50f1d9d..0000000 --- a/Ext4Fsd/ddkbuild.bat +++ /dev/null @@ -1,1268 +0,0 @@ -@echo off -@set VERSION=V7.4 -@set OSR_DEBUG=off - -set W7BASE=C:\WINDDK\7600.16385.1 - -@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 43 2009-11-12 03:46:08Z 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 -:: %W7BASE% - Set this up for "-W7*" 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" -:: W7BASE : could be "C:\WINDDK\7600.16385.0" -:: -:: 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 type of build. Please recheck parameters. -:: 002 == WDF_ROOT is not defined, are you using 00.01.5054 or later? -:: 003 == To build using type you need to set the -:: environment variable to point to the DDK base -:: directory! -:: 004 == NT4BASE, W2KBASE, WXPBASE, WNETBASE and/or W7BASE environment -:: variable(s) not set. Environment variable(s) must be set by user -:: according to DDK version(s) installed. -:: 005 == must be 'checked', 'free', 'chk' or 'fre' -:: (case-insensitive). -:: 006 == No DIR or SOURCES file found in the given target directory. -:: 007 == Target directory must have a SOURCES+MAKEFILE or DIRS file. -:: 008 == The parameter must be a valid directory. -:: 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. -:: -:: To modify the default behavior of this script with the newest WDKs, -:: set the variable SETTING_OACR in the ddkbldenv.cmd hook script to turn -:: OACR back on (NB: no OACR tools exist for Itanium in the WDK). -:: -::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: - -::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: -:: / 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: 43 $ -:: 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: 2009-11-12 03:46:08 +0000 (Thu, 12 Nov 2009) $ -:: 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 OSR_RANDEXT=%RANDOM%%RANDOM% - -::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: -:: 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, WNETBASE and/or W7BASE 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 have a SOURCES+MAKEFILE 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. -:WIN7Check -:WIN764Check -:WIN7A64Check -:WIN7WLHCheck -:WIN7WLH64Check -:WIN7WLHA64Check -:WIN7NETCheck -:WIN7NET64Check -:WIN7NETA64Check -:WIN7XPCheck -::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: -:W7Check -:W7I64Check -:W7X64Check -:W7LHCheck -:W7LHI64Check -:W7LHX64Check -:W7NETCheck -:W7NETI64Check -:W7NETX64Check -:W7XPCheck -set BASEDIROS=Windows 7/Windows 2008 Server R2 -set BASEDIRVAR=W7BASE -:: The default for OACR is off ("no_oacr" appended) -if not DEFINED SETTING_OACR set SETTING_OACR=no_oacr -:: The default for "separate_object_root" is to not pass it to setenv.bat -if not DEFINED SETTING_SEP_OBJ_ROOT set SETTING_SEPARATE_OBJ_ROOT= -:: Other flavor of DDKBUILD -if not DEFINED W7BASE if DEFINED WIN7BASE set BASEDIRVAR=WIN7BASE -:: 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 "7600.16385.0" -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. -: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.18002 6001.18001 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 -: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]" -:: 6001.18001 - "setenv [fre|chk] [64|x64] [hal] [WLH|WXP|WNET|W2K] [bscmake]" -:: 6001.18002 - "setenv [fre|chk] [64|x64] [hal] [WLH|WXP|WNET|W2K] [bscmake]" -:: 7600.16385 - "setenv [fre|chk] [64|x64] [WIN7|WLH|WXP|WNET] [bscmake] [no_oacr] [separate_object_root]" - -::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: -:: 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 (Itanium) 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 (Itanium) 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 -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 (Itanium) using WNET DDK -:WNET64Build -:WNETI64Build -set OSR_CMDLINE="%%BASEDIR%%\bin\setenv.bat" %%BASEDIR%% %%BuildMode%% 64 WNET -goto :EOF - -::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: -:: WNET build for 64bit (x64) 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 WDK -:WLHBuild -set OSR_CMDLINE="%%BASEDIR%%\bin\setenv.bat" %%BASEDIR%% %%BuildMode%% WLH -goto :EOF - -::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: -:: WLH build for 64bit (x64) using WLH WDK -:WLHA64Build -:WLHX64Build -call :DetectVistaWDK -set OSR_CMDLINE="%%BASEDIR%%\bin\setenv.bat" %%BASEDIR%% %%BuildMode%% %OSR_AMD64FLAG% WLH -goto :EOF - -::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: -:: WLH build for 64bit (Itanium) using WLH WDK -:WLH64Build -:WLHI64Build -set OSR_CMDLINE="%%BASEDIR%%\bin\setenv.bat" %%BASEDIR%% %%BuildMode%% 64 WLH -goto :EOF - -::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: -:: WNET build for 64bit (x64) using WLH WDK -:WLHNETA64Build -:WLHNETX64Build -call :DetectVistaWDK -set OSR_CMDLINE="%%BASEDIR%%\bin\setenv.bat" %%BASEDIR%% %%BuildMode%% %OSR_AMD64FLAG% WNET -goto :EOF - -::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: -:: WNET build for 64bit (Itanium) using WLH WDK -:WLHNET64Build -:WLHNETI64Build -set OSR_CMDLINE="%%BASEDIR%%\bin\setenv.bat" %%BASEDIR%% %%BuildMode%% 64 WNET -goto :EOF - -::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: -:: WXP build for 32bit using WLH WDK -:WLHXPBuild -set OSR_CMDLINE="%%BASEDIR%%\bin\setenv.bat" %%BASEDIR%% %%BuildMode%% WXP -goto :EOF - -::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: -:: WXP build for 64bit (Itanium) using WLH WDK -:WLHXP64Build -set OSR_CMDLINE="%%BASEDIR%%\bin\setenv.bat" %%BASEDIR%% %%BuildMode%% 64 WXP -goto :EOF - -::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: -:: W2K build for 32bit using WLH WDK -:WLH2KBuild -set OSR_CMDLINE="%%BASEDIR%%\bin\setenv.bat" %%BASEDIR%% %%BuildMode%% W2K -goto :EOF - -::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: -:: WNET build for 32bit using WLH WDK -:WLHNETBuild -set OSR_CMDLINE="%%BASEDIR%%\bin\setenv.bat" %%BASEDIR%% %%BuildMode%% WNET -goto :EOF - -::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: -:: W7 build for 32bit using W7/2008 WDK -:W7Build -:WIN7Build -set OSR_CMDLINE="%%BASEDIR%%\bin\setenv.bat" %%BASEDIR%% %%BuildMode%% x86 WIN7 %SETTING_OACR% %SETTING_SEPARATE_OBJ_ROOT% -goto :EOF - -::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: -:: W7 build for 64bit (x64) using W7/2008 WDK -:W7X64Build -:WIN7A64Build -set OSR_CMDLINE="%%BASEDIR%%\bin\setenv.bat" %%BASEDIR%% %%BuildMode%% x64 WIN7 %SETTING_OACR% %SETTING_SEPARATE_OBJ_ROOT% -goto :EOF - -::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: -:: W7 build for 64bit (Itanium) using W7/2008 WDK -:W7I64Build -:WIN764Build -set OSR_CMDLINE="%%BASEDIR%%\bin\setenv.bat" %%BASEDIR%% %%BuildMode%% ia64 WIN7 no_oacr %SETTING_SEPARATE_OBJ_ROOT% -goto :EOF - -::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: -:: WLH build for 32bit using W7/2008 WDK -:W7LHBuild -:WIN7WLHBuild -set OSR_CMDLINE="%%BASEDIR%%\bin\setenv.bat" %%BASEDIR%% %%BuildMode%% x86 WLH %SETTING_OACR% %SETTING_SEPARATE_OBJ_ROOT% -goto :EOF - -::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: -:: WLH build for 64bit (x64) using W7/2008 WDK -:W7LHX64Build -:WIN7WLHA64Build -set OSR_CMDLINE="%%BASEDIR%%\bin\setenv.bat" %%BASEDIR%% %%BuildMode%% x64 WLH %SETTING_OACR% %SETTING_SEPARATE_OBJ_ROOT% -goto :EOF - -::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: -:: WLH build for 64bit (Itanium) using W7/2008 WDK -:W7LHI64Build -:WIN7WLH64Build -set OSR_CMDLINE="%%BASEDIR%%\bin\setenv.bat" %%BASEDIR%% %%BuildMode%% ia64 WLH no_oacr %SETTING_SEPARATE_OBJ_ROOT% -goto :EOF - -::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: -:: WNET build for 32bit using W7/2008 WDK -:W7NETBuild -:WIN7NETBuild -set OSR_CMDLINE="%%BASEDIR%%\bin\setenv.bat" %%BASEDIR%% %%BuildMode%% x86 WNET %SETTING_OACR% %SETTING_SEPARATE_OBJ_ROOT% -goto :EOF - -::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: -:: WNET build for 64bit (x64) using W7/2008 WDK -:W7NETX64Build -:WIN7NETA64Build -set OSR_CMDLINE="%%BASEDIR%%\bin\setenv.bat" %%BASEDIR%% %%BuildMode%% x64 WNET %SETTING_OACR% %SETTING_SEPARATE_OBJ_ROOT% -goto :EOF - -::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: -:: WNET build for 64bit (Itanium) using W7/2008 WDK -:W7NETI64Build -:WIN7NET64Build -set OSR_CMDLINE="%%BASEDIR%%\bin\setenv.bat" %%BASEDIR%% %%BuildMode%% ia64 WNET no_oacr %SETTING_SEPARATE_OBJ_ROOT% -goto :EOF - -::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: -:: WXP build for 32bit using W7/2008 WDK -:W7XPBuild -:WIN7XPBuild -set OSR_CMDLINE="%%BASEDIR%%\bin\setenv.bat" %%BASEDIR%% %%BuildMode%% x86 WXP %SETTING_OACR% %SETTING_SEPARATE_OBJ_ROOT% -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%_%OSR_RANDEXT%.tmp" - for /f "tokens=*" %%x in ('type "%TEMP%\%OSR_PREBUILD_SCRIPT%_%OSR_RANDEXT%.tmp"') do @( - %OSR_ECHO% %%x - ) - if exist "%TEMP%\%OSR_PREBUILD_SCRIPT%_%OSR_RANDEXT%.tmp" del /f /q "%TEMP%\%OSR_PREBUILD_SCRIPT%_%OSR_RANDEXT%.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 -if /i "%3" == "-CUV" goto :CallUsageVerifier -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 /i "%BASEDIRVAR%" == "W7BASE" goto :WDFOkay -if /i "%BASEDIRVAR%" == "WIN7BASE" 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 - -:CallUsageVerifier -shift -set VERIFIER_DDK_EXTENSIONS=1 -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[^.][CDMRU][0-9][0-9]* warning[^.][BRP][KCWG][0-9][0-9]* warning[^.][ACLPS][DNRTVX][JKLTX][0-9][0-9]* error[^.][CDMRU][0-9][0-9]* error[^.][BRP][KCWG][0-9][0-9]* error[^.][ACLPS][DNRTVX][JKLTX][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[^.][CDMRU][0-9][0-9]* warning[^.][BRP][KCWG][0-9][0-9]* warning[^.][ACLPS][DNRTVX][JKLTX][0-9][0-9]* error[^.][CDMRU][0-9][0-9]* error[^.][BRP][KCWG][0-9][0-9]* error[^.][ACLPS][DNRTVX][JKLTX][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[^.][CDMRU][0-9][0-9]* warning[^.][BRP][KCWG][0-9][0-9]* warning[^.][ACLPS][DNRTVX][JKLTX][0-9][0-9]*" "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[^.][CDMRU][0-9][0-9]* warning[^.][BRP][KCWG][0-9][0-9]* warning[^.][ACLPS][DNRTVX][JKLTX][0-9][0-9]*" "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%_%OSR_RANDEXT%.tmp" - for /f "tokens=*" %%x in ('type "%TEMP%\%OSR_POSTBUILD_SCRIPT%_%OSR_RANDEXT%.tmp"') do @( - %OSR_ECHO% %%x - ) - if exist "%TEMP%\%OSR_POSTBUILD_SCRIPT%_%OSR_RANDEXT%.tmp" del /f /q "%TEMP%\%OSR_POSTBUILD_SCRIPT%_%OSR_RANDEXT%.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. ^(ERROR #%OSR_ERRCODE%^) - 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%_%OSR_RANDEXT%.tmp" - for /f "tokens=*" %%x in ('type "%TEMP%\%OSR_SETENV_SCRIPT%_%OSR_RANDEXT%.tmp"') do @( - %OSR_ECHO% %%x - ) - if exist "%TEMP%\%OSR_SETENV_SCRIPT%_%OSR_RANDEXT%.tmp" del /f /q "%TEMP%\%OSR_SETENV_SCRIPT%_%OSR_RANDEXT%.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] [-CUV] -@echo. -@echo Values for ^: -@echo --------------------------------------------------------------------------- -@echo Target OS version and architecture ^| Miscellaneous -@echo -------------------------------------^|------------------------------------- -@echo ^ ^| Windows ^| CPU ^| Base directory ^| ^ alias(es) -@echo -------------^|-------------^|---------^|----------------^|-------------------- -@echo -NT4 ^| NT 4.0 ^| x86 ^| %%NT4BASE%% ^| -@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 -W7 ^| 7/2008 R2 ^| x86 ^| %%W7BASE%% ^| -WIN7 -@echo -W7I64 ^| 7/2008 R2 ^| Itanium ^| %%W7BASE%% ^| -WIN764 -@echo -W7X64 ^| 7/2008 R2 ^| x64 ^| %%W7BASE%% ^| -WIN7A64 -@echo -W7LH ^| Vista/2008 ^| x86 ^| %%W7BASE%% ^| -WIN7WLH -@echo -W7LHI64 ^| Vista/2008 ^| Itanium ^| %%W7BASE%% ^| -WIN7WLH64 -@echo -W7LHX64 ^| Vista/2008 ^| x64 ^| %%W7BASE%% ^| -WIN7WLHA64 -@echo -W7NET ^| 2003 ^| x86 ^| %%W7BASE%% ^| -WIN7NET -@echo -W7NETI64 ^| 2003 ^| Itanium ^| %%W7BASE%% ^| -WIN7NET64 -@echo -W7NETX64 ^| 2003/XP x64 ^| x64 ^| %%W7BASE%% ^| -WIN7NETA64 -@echo -W7XP ^| XP ^| x86 ^| %%W7BASE%% ^| -WIN7XP -@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 (all optional): -@echo ^ path to build directory, try . (current directory) -@echo [flags] any flags you think should be passed to build (try /a -@echo for clean) -@echo -WDF performs a WDF build -@echo -PREFAST performs a PREFAST build -@echo -CUV uses the Call Usage Verifier, implies 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 %%W7BASE%% - Set this up for ^"-W7*^" 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% diff --git a/Ext4Fsd/debug.c b/Ext4Fsd/debug.c index f15b415..54eed8b 100644 --- a/Ext4Fsd/debug.c +++ b/Ext4Fsd/debug.c @@ -2587,7 +2587,7 @@ Ext2NtStatusToString ( IN NTSTATUS Status ) VOID Ext2TraceMcb(PCHAR fn, USHORT lc, USHORT add, PEXT2_MCB Mcb) { - int i; + size_t i; CHAR _space[33]; _snprintf(&_space[0], 32, "%s:%d:", fn, lc); diff --git a/Ext4Fsd/ext3fsd.vcproj b/Ext4Fsd/ext3fsd.vcproj deleted file mode 100644 index d5208d4..0000000 --- a/Ext4Fsd/ext3fsd.vcproj +++ /dev/null @@ -1,693 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Ext4Fsd/include/ext2fs.h b/Ext4Fsd/include/ext2fs.h index e28cd78..5ddaf55 100644 --- a/Ext4Fsd/include/ext2fs.h +++ b/Ext4Fsd/include/ext2fs.h @@ -41,7 +41,7 @@ /* STRUCTS & CONSTS******************************************************/ -#define EXT2FSD_VERSION "0.69" +#define EXT2FSD_VERSION "0.70" /* WDK DEFINITIONS ******************************************************/ @@ -2527,6 +2527,9 @@ Ext2TruncateIndirect( // linux.c: linux lib implemenation // +int strncmp(const char* str1, const char* str2, size_t count); +char* strncpy(char* dest, const char* src, size_t count); + int ext2_init_linux(); diff --git a/Ext4Fsd/include/linux/errno.h b/Ext4Fsd/include/linux/errno.h index 243f1f9..cd813dc 100644 --- a/Ext4Fsd/include/linux/errno.h +++ b/Ext4Fsd/include/linux/errno.h @@ -141,4 +141,6 @@ #define EBADTYPE 527 /* Type not supported by server */ #define EJUKEBOX 528 /* Request initiated, but will not complete before timeout */ +#define ENAMETOOLONG 1024; + #endif diff --git a/Ext4Fsd/include/linux/ext3_fs.h b/Ext4Fsd/include/linux/ext3_fs.h index db79afb..157c5be 100644 --- a/Ext4Fsd/include/linux/ext3_fs.h +++ b/Ext4Fsd/include/linux/ext3_fs.h @@ -1019,6 +1019,8 @@ struct mmp_struct { #define XATTR_NO_CTIME 0x80 #endif +int _strnicmp(const char* str1, const char* str2, size_t count); + /* * NOTE! unlike strncmp, ext3_match returns 1 for success, 0 for failure. * diff --git a/Ext4Fsd/include/linux/jbd.h b/Ext4Fsd/include/linux/jbd.h index 5901589..15c0a4d 100644 --- a/Ext4Fsd/include/linux/jbd.h +++ b/Ext4Fsd/include/linux/jbd.h @@ -923,7 +923,6 @@ static inline handle_t *journal_current_handle(void) { return NULL; /* return current->journal_info; */ -#pragma message("WARNINGS: journal_current_handle NOT implemented") } /* The journaling code user interface: diff --git a/Ext4Fsd/linux.c b/Ext4Fsd/linux.c index acc0f58..e11dbe5 100644 --- a/Ext4Fsd/linux.c +++ b/Ext4Fsd/linux.c @@ -1,1005 +1,1060 @@ -/* - * COPYRIGHT: See COPYRIGHT.TXT - * PROJECT: Ext2 File System Driver for WinNT/2K/XP - * FILE: linux.c - * PROGRAMMER: Matt Wu - * HOMEPAGE: http://www.ext2fsd.com - * UPDATE HISTORY: - */ - -/* INCLUDES *****************************************************************/ - -#include -#include -#include - -/* GLOBALS ***************************************************************/ - -extern PEXT2_GLOBAL Ext2Global; - -/* DEFINITIONS *************************************************************/ - -#ifdef ALLOC_PRAGMA -#pragma alloc_text(PAGE, kzalloc) -#endif - -struct task_struct current_task = { - /* pid */ 0, - /* tid */ 1, - /* comm */ "current\0", - /* journal_info */ NULL -}; -struct task_struct *current = ¤t_task; - -void *kzalloc(int size, int flags) -{ - void *buffer = kmalloc(size, flags); - if (buffer) { - memset(buffer, 0, size); - } - return buffer; -} - -// -// slab routines -// - -kmem_cache_t * -kmem_cache_create( - const char * name, - size_t size, - size_t offset, - unsigned long flags, - kmem_cache_cb_t ctor -) -{ - kmem_cache_t *kc = NULL; - - kc = kmalloc(sizeof(kmem_cache_t), GFP_KERNEL); - if (kc == NULL) { - goto errorout; - } - - memset(kc, 0, sizeof(kmem_cache_t)); - ExInitializeNPagedLookasideList( - &kc->la, - NULL, - NULL, - 0, - size, - 'JBKC', - 0); - - kc->size = size; - strncpy(kc->name, name, 31); - kc->constructor = ctor; - -errorout: - - return kc; -} - -int kmem_cache_destroy(kmem_cache_t * kc) -{ - ASSERT(kc != NULL); - - ExDeleteNPagedLookasideList(&(kc->la)); - kfree(kc); - - return 0; -} - -void* kmem_cache_alloc(kmem_cache_t *kc, int flags) -{ - PVOID ptr = NULL; - ptr = ExAllocateFromNPagedLookasideList(&(kc->la)); - if (ptr) { - atomic_inc(&kc->count); - atomic_inc(&kc->acount); - } - return ptr; -} - -void kmem_cache_free(kmem_cache_t *kc, void *p) -{ - if (p) { - atomic_dec(&kc->count); - ExFreeToNPagedLookasideList(&(kc->la), p); - } -} - -// -// wait queue routines -// - -void init_waitqueue_head(wait_queue_head_t *q) -{ - spin_lock_init(&q->lock); - INIT_LIST_HEAD(&q->task_list); -} - -struct __wait_queue * -wait_queue_create() -{ - struct __wait_queue * wait = NULL; - wait = kmalloc(sizeof(struct __wait_queue), GFP_KERNEL); - if (!wait) { - return NULL; - } - - memset(wait, 0, sizeof(struct __wait_queue)); - wait->flags = WQ_FLAG_AUTO_REMOVAL; - wait->private = (void *)KeGetCurrentThread(); - INIT_LIST_HEAD(&wait->task_list); - KeInitializeEvent(&(wait->event), - SynchronizationEvent, - FALSE); - - return wait; -} - -void -wait_queue_destroy(struct __wait_queue * wait) -{ - kfree(wait); -} - -static inline void __add_wait_queue(wait_queue_head_t *head, struct __wait_queue *new) -{ - list_add(&new->task_list, &head->task_list); -} - -/* - * Used for wake-one threads: - */ -static inline void __add_wait_queue_tail(wait_queue_head_t *head, - struct __wait_queue *new) -{ - list_add_tail(&new->task_list, &head->task_list); -} - -static inline void __remove_wait_queue(wait_queue_head_t *head, - struct __wait_queue *old) -{ - list_del(&old->task_list); -} - -void add_wait_queue(wait_queue_head_t *q, wait_queue_t *waiti) -{ - unsigned long flags; - struct __wait_queue *wait = *waiti; - - wait->flags &= ~WQ_FLAG_EXCLUSIVE; - spin_lock_irqsave(&q->lock, flags); - __add_wait_queue(q, wait); - spin_unlock_irqrestore(&q->lock, flags); -} - -void add_wait_queue_exclusive(wait_queue_head_t *q, wait_queue_t *waiti) -{ - unsigned long flags; - struct __wait_queue *wait = *waiti; - - wait->flags |= WQ_FLAG_EXCLUSIVE; - spin_lock_irqsave(&q->lock, flags); - __add_wait_queue_tail(q, wait); - spin_unlock_irqrestore(&q->lock, flags); -} - -void remove_wait_queue(wait_queue_head_t *q, wait_queue_t *waiti) -{ - unsigned long flags; - struct __wait_queue *wait = *waiti; - - spin_lock_irqsave(&q->lock, flags); - __remove_wait_queue(q, wait); - spin_unlock_irqrestore(&q->lock, flags); -} - -/* - * Note: we use "set_current_state()" _after_ the wait-queue add, - * because we need a memory barrier there on SMP, so that any - * wake-function that tests for the wait-queue being active - * will be guaranteed to see waitqueue addition _or_ subsequent - * tests in this thread will see the wakeup having taken place. - * - * The spin_unlock() itself is semi-permeable and only protects - * one way (it only protects stuff inside the critical region and - * stops them from bleeding out - it would still allow subsequent - * loads to move into the critical region). - */ -void -prepare_to_wait(wait_queue_head_t *q, wait_queue_t *waiti, int state) -{ - unsigned long flags; - struct __wait_queue *wait = *waiti; - - wait->flags &= ~WQ_FLAG_EXCLUSIVE; - spin_lock_irqsave(&q->lock, flags); - if (list_empty(&wait->task_list)) - __add_wait_queue(q, wait); - /* - * don't alter the task state if this is just going to - * queue an async wait queue callback - */ - if (is_sync_wait(wait)) - set_current_state(state); - spin_unlock_irqrestore(&q->lock, flags); -} - -void -prepare_to_wait_exclusive(wait_queue_head_t *q, wait_queue_t *waiti, int state) -{ - unsigned long flags; - struct __wait_queue *wait = *waiti; - - wait->flags |= WQ_FLAG_EXCLUSIVE; - spin_lock_irqsave(&q->lock, flags); - if (list_empty(&wait->task_list)) - __add_wait_queue_tail(q, wait); - /* - * don't alter the task state if this is just going to - * queue an async wait queue callback - */ - if (is_sync_wait(wait)) - set_current_state(state); - spin_unlock_irqrestore(&q->lock, flags); -} -EXPORT_SYMBOL(prepare_to_wait_exclusive); - -void finish_wait(wait_queue_head_t *q, wait_queue_t *waiti) -{ - unsigned long flags; - struct __wait_queue *wait = *waiti; - - __set_current_state(TASK_RUNNING); - /* - * We can check for list emptiness outside the lock - * IFF: - * - we use the "careful" check that verifies both - * the next and prev pointers, so that there cannot - * be any half-pending updates in progress on other - * CPU's that we haven't seen yet (and that might - * still change the stack area. - * and - * - all other users take the lock (ie we can only - * have _one_ other CPU that looks at or modifies - * the list). - */ - if (!list_empty_careful(&wait->task_list)) { - spin_lock_irqsave(&q->lock, flags); - list_del_init(&wait->task_list); - spin_unlock_irqrestore(&q->lock, flags); - } - - /* free wait */ - wait_queue_destroy(wait); -} - -int wake_up(wait_queue_head_t *queue) -{ - return 0; /* KeSetEvent(&wait->event, 0, FALSE); */ -} - - -// -// kernel timer routines -// - -// -// buffer head routines -// - -struct _EXT2_BUFFER_HEAD { - kmem_cache_t * bh_cache; - atomic_t bh_count; - atomic_t bh_acount; -} g_jbh = {NULL, ATOMIC_INIT(0)}; - -int -ext2_init_bh() -{ - g_jbh.bh_count.counter = 0; - g_jbh.bh_acount.counter = 0; - g_jbh.bh_cache = kmem_cache_create( - "ext2_bh", /* bh */ - sizeof(struct buffer_head), - 0, /* offset */ - SLAB_TEMPORARY, /* flags */ - NULL); /* ctor */ - if (g_jbh.bh_cache == NULL) { - printk(KERN_EMERG "JBD: failed to create handle cache\n"); - return -ENOMEM; - } - return 0; -} - -void -ext2_destroy_bh() -{ - if (g_jbh.bh_cache) { - kmem_cache_destroy(g_jbh.bh_cache); - g_jbh.bh_cache = NULL; - } -} - -struct buffer_head * -new_buffer_head() -{ - struct buffer_head * bh = NULL; - bh = kmem_cache_alloc(g_jbh.bh_cache, GFP_NOFS); - if (bh) { - atomic_inc(&g_jbh.bh_count); - atomic_inc(&g_jbh.bh_acount); - - memset(bh, 0, sizeof(struct buffer_head)); - InitializeListHead(&bh->b_link); - KeQuerySystemTime(&bh->b_ts_creat); - DEBUG(DL_BH, ("bh=%p allocated.\n", bh)); - INC_MEM_COUNT(PS_BUFF_HEAD, bh, sizeof(struct buffer_head)); - } - - return bh; -} - -void -free_buffer_head(struct buffer_head * bh) -{ - if (bh) { - if (bh->b_mdl) { - - DEBUG(DL_BH, ("bh=%p mdl=%p (Flags:%xh VA:%p) released.\n", bh, bh->b_mdl, - bh->b_mdl->MdlFlags, bh->b_mdl->MappedSystemVa)); - if (IsFlagOn(bh->b_mdl->MdlFlags, MDL_MAPPED_TO_SYSTEM_VA)) { - MmUnmapLockedPages(bh->b_mdl->MappedSystemVa, bh->b_mdl); - } - Ext2DestroyMdl(bh->b_mdl); - } - if (bh->b_bcb) { - CcUnpinDataForThread(bh->b_bcb, (ERESOURCE_THREAD)bh | 0x3); - } - - DEBUG(DL_BH, ("bh=%p freed.\n", bh)); - DEC_MEM_COUNT(PS_BUFF_HEAD, bh, sizeof(struct buffer_head)); - kmem_cache_free(g_jbh.bh_cache, bh); - atomic_dec(&g_jbh.bh_count); - } -} - -// -// Red-black tree insert routine. -// - -static struct buffer_head *__buffer_head_search(struct rb_root *root, - sector_t blocknr) -{ - struct rb_node *new = root->rb_node; - - /* Figure out where to put new node */ - while (new) { - struct buffer_head *bh = - container_of(new, struct buffer_head, b_rb_node); - s64 result = blocknr - bh->b_blocknr; - - if (result < 0) - new = new->rb_left; - else if (result > 0) - new = new->rb_right; - else - return bh; - - } - - return NULL; -} - -static int buffer_head_blocknr_cmp(struct rb_node *a, struct rb_node *b) -{ - struct buffer_head *a_bh, *b_bh; - s64 result; - a_bh = container_of(a, struct buffer_head, b_rb_node); - b_bh = container_of(b, struct buffer_head, b_rb_node); - result = a_bh->b_blocknr - b_bh->b_blocknr; - - if (result < 0) - return -1; - if (result > 0) - return 1; - return 0; -} - -static struct buffer_head *buffer_head_search(struct block_device *bdev, - sector_t blocknr) -{ - struct rb_root *root; - root = &bdev->bd_bh_root; - return __buffer_head_search(root, blocknr); -} - -static void buffer_head_insert(struct block_device *bdev, struct buffer_head *bh) -{ - rb_insert(&bdev->bd_bh_root, &bh->b_rb_node, buffer_head_blocknr_cmp); -} - -void buffer_head_remove(struct block_device *bdev, struct buffer_head *bh) -{ - rb_erase(&bh->b_rb_node, &bdev->bd_bh_root); -} - -struct buffer_head * -get_block_bh_mdl( - struct block_device * bdev, - sector_t block, - unsigned long size, - int zero -) -{ - PEXT2_VCB Vcb = bdev->bd_priv; - LARGE_INTEGER offset; - PVOID bcb = NULL; - PVOID ptr = NULL; - - struct list_head *entry; - - /* allocate buffer_head and initialize it */ - struct buffer_head *bh = NULL, *tbh = NULL; - - /* check the block is valid or not */ - if (block >= TOTAL_BLOCKS) { - DbgBreak(); - goto errorout; - } - - /* search the bdev bh list */ - ExAcquireSharedStarveExclusive(&bdev->bd_bh_lock, TRUE); - tbh = buffer_head_search(bdev, block); - if (tbh) { - bh = tbh; - get_bh(bh); - ExReleaseResourceLite(&bdev->bd_bh_lock); - goto errorout; - } - ExReleaseResourceLite(&bdev->bd_bh_lock); - - bh = new_buffer_head(); - if (!bh) { - goto errorout; - } - bh->b_bdev = bdev; - bh->b_blocknr = block; - bh->b_size = size; - bh->b_data = NULL; - -again: - - offset.QuadPart = (s64) bh->b_blocknr; - offset.QuadPart <<= BLOCK_BITS; - - if (zero) { - /* PIN_EXCLUSIVE disabled, likely to deadlock with volume operations */ - if (!CcPreparePinWrite(Vcb->Volume, - &offset, - bh->b_size, - FALSE, - PIN_WAIT /* | PIN_EXCLUSIVE */, - &bcb, - &ptr)) { - Ext2Sleep(100); - goto again; - } - } else { - if (!CcPinRead( Vcb->Volume, - &offset, - bh->b_size, - PIN_WAIT, - &bcb, - &ptr)) { - Ext2Sleep(100); - goto again; - } - set_buffer_uptodate(bh); - } - - bh->b_mdl = Ext2CreateMdl(ptr, bh->b_size, IoModifyAccess); - if (bh->b_mdl) { - /* muse map the PTE to NonCached zone. journal recovery will - access the PTE under spinlock: DISPATCH_LEVEL IRQL */ - bh->b_data = MmMapLockedPagesSpecifyCache( - bh->b_mdl, KernelMode, MmNonCached, - NULL,FALSE, HighPagePriority); - /* bh->b_data = MmMapLockedPages(bh->b_mdl, KernelMode); */ - } - if (!bh->b_mdl || !bh->b_data) { - free_buffer_head(bh); - bh = NULL; - goto errorout; - } - - get_bh(bh); - - DEBUG(DL_BH, ("getblk: Vcb=%p bhcount=%u block=%u bh=%p mdl=%p (Flags:%xh VA:%p)\n", - Vcb, atomic_read(&g_jbh.bh_count), block, bh, bh->b_mdl, bh->b_mdl->MdlFlags, bh->b_data)); - - ExAcquireResourceExclusiveLite(&bdev->bd_bh_lock, TRUE); - /* do search again here */ - tbh = buffer_head_search(bdev, block); - if (tbh) { - free_buffer_head(bh); - bh = tbh; - get_bh(bh); - RemoveEntryList(&bh->b_link); - InitializeListHead(&bh->b_link); - ExReleaseResourceLite(&bdev->bd_bh_lock); - goto errorout; - } else { - buffer_head_insert(bdev, bh); - } - ExReleaseResourceLite(&bdev->bd_bh_lock); - - /* we get it */ -errorout: - - if (bcb) - CcUnpinData(bcb); - - return bh; -} - -int submit_bh_mdl(int rw, struct buffer_head *bh) -{ - struct block_device *bdev = bh->b_bdev; - PEXT2_VCB Vcb = bdev->bd_priv; - PBCB Bcb; - PVOID Buffer; - LARGE_INTEGER Offset; - - ASSERT(Vcb->Identifier.Type == EXT2VCB); - ASSERT(bh->b_data); - - if (rw == WRITE) { - - if (IsVcbReadOnly(Vcb)) { - goto errorout; - } - - SetFlag(Vcb->Volume->Flags, FO_FILE_MODIFIED); - Offset.QuadPart = ((LONGLONG)bh->b_blocknr) << BLOCK_BITS; - - /* PIN_EXCLUSIVE disabled, likely to deadlock with volume operations */ - if (CcPreparePinWrite( - Vcb->Volume, - &Offset, - BLOCK_SIZE, - FALSE, - PIN_WAIT /* | PIN_EXCLUSIVE */, - &Bcb, - &Buffer )) { -#if 0 - if (memcmp(Buffer, bh->b_data, BLOCK_SIZE) != 0) { - DbgBreak(); - } - memmove(Buffer, bh->b_data, BLOCK_SIZE); -#endif - CcSetDirtyPinnedData(Bcb, NULL); - Ext2AddBlockExtent( Vcb, NULL, - (ULONG)bh->b_blocknr, - (ULONG)bh->b_blocknr, - (bh->b_size >> BLOCK_BITS)); - CcUnpinData(Bcb); - } else { - - Ext2AddBlockExtent( Vcb, NULL, - (ULONG)bh->b_blocknr, - (ULONG)bh->b_blocknr, - (bh->b_size >> BLOCK_BITS)); - } - - } else { - } - -errorout: - - unlock_buffer(bh); - put_bh(bh); - return 0; -} - -struct buffer_head * -get_block_bh_pin( - struct block_device * bdev, - sector_t block, - unsigned long size, - int zero -) -{ - PEXT2_VCB Vcb = bdev->bd_priv; - LARGE_INTEGER offset; - - struct list_head *entry; - - /* allocate buffer_head and initialize it */ - struct buffer_head *bh = NULL, *tbh = NULL; - - /* check the block is valid or not */ - if (block >= TOTAL_BLOCKS) { - DbgBreak(); - goto errorout; - } - - /* search the bdev bh list */ - ExAcquireSharedStarveExclusive(&bdev->bd_bh_lock, TRUE); - tbh = buffer_head_search(bdev, block); - if (tbh) { - bh = tbh; - get_bh(bh); - ExReleaseResourceLite(&bdev->bd_bh_lock); - goto errorout; - } - ExReleaseResourceLite(&bdev->bd_bh_lock); - - bh = new_buffer_head(); - if (!bh) { - goto errorout; - } - bh->b_bdev = bdev; - bh->b_blocknr = block; - bh->b_size = size; - bh->b_data = NULL; - -again: - - offset.QuadPart = (s64) bh->b_blocknr; - offset.QuadPart <<= BLOCK_BITS; - - if (zero) { - if (!CcPreparePinWrite(Vcb->Volume, - &offset, - bh->b_size, - FALSE, - PIN_WAIT, - &bh->b_bcb, - &bh->b_data)) { - Ext2Sleep(100); - goto again; - } - } else { - if (!CcPinRead( Vcb->Volume, - &offset, - bh->b_size, - PIN_WAIT, - &bh->b_bcb, - &bh->b_data)) { - Ext2Sleep(100); - goto again; - } - set_buffer_uptodate(bh); - } - - if (bh->b_bcb) - CcSetBcbOwnerPointer(bh->b_bcb, (PVOID)((ERESOURCE_THREAD)bh | 0x3)); - - if (!bh->b_data) { - free_buffer_head(bh); - bh = NULL; - goto errorout; - } - get_bh(bh); - - DEBUG(DL_BH, ("getblk: Vcb=%p bhcount=%u block=%u bh=%p ptr=%p.\n", - Vcb, atomic_read(&g_jbh.bh_count), block, bh, bh->b_data)); - - ExAcquireResourceExclusiveLite(&bdev->bd_bh_lock, TRUE); - /* do search again here */ - tbh = buffer_head_search(bdev, block); - if (tbh) { - get_bh(tbh); - free_buffer_head(bh); - bh = tbh; - RemoveEntryList(&bh->b_link); - InitializeListHead(&bh->b_link); - ExReleaseResourceLite(&bdev->bd_bh_lock); - goto errorout; - } else { - buffer_head_insert(bdev, bh); - } - ExReleaseResourceLite(&bdev->bd_bh_lock); - - /* we get it */ -errorout: - - return bh; -} - -int submit_bh_pin(int rw, struct buffer_head *bh) -{ - struct block_device *bdev = bh->b_bdev; - PEXT2_VCB Vcb = bdev->bd_priv; - PVOID Buffer; - LARGE_INTEGER Offset; - - ASSERT(Vcb->Identifier.Type == EXT2VCB); - ASSERT(bh->b_data && bh->b_bcb); - - if (rw == WRITE) { - - if (IsVcbReadOnly(Vcb)) { - goto errorout; - } - - SetFlag(Vcb->Volume->Flags, FO_FILE_MODIFIED); - Offset.QuadPart = ((LONGLONG)bh->b_blocknr) << BLOCK_BITS; - - CcSetDirtyPinnedData(bh->b_bcb, NULL); - Ext2AddBlockExtent( Vcb, NULL, - (ULONG)bh->b_blocknr, - (ULONG)bh->b_blocknr, - (bh->b_size >> BLOCK_BITS)); - } else { - } - -errorout: - - unlock_buffer(bh); - put_bh(bh); - return 0; -} - -#if 0 - -struct buffer_head * -get_block_bh( - struct block_device * bdev, - sector_t block, - unsigned long size, - int zero -) -{ - return get_block_bh_mdl(bdev, block, size, zero); -} - -int submit_bh(int rw, struct buffer_head *bh) -{ - return submit_bh_mdl(rw, bh); -} - -#else - -struct buffer_head * -get_block_bh( - struct block_device * bdev, - sector_t block, - unsigned long size, - int zero -) -{ - return get_block_bh_pin(bdev, block, size, zero); -} - -int submit_bh(int rw, struct buffer_head *bh) -{ - return submit_bh_pin(rw, bh); -} -#endif - -struct buffer_head * -__getblk( - struct block_device * bdev, - sector_t block, - unsigned long size -) -{ - return get_block_bh(bdev, block, size, 0); -} - -void __brelse(struct buffer_head *bh) -{ - struct block_device *bdev = bh->b_bdev; - PEXT2_VCB Vcb = (PEXT2_VCB)bdev->bd_priv; - - ASSERT(Vcb->Identifier.Type == EXT2VCB); - - /* write data in case it's dirty */ - while (buffer_dirty(bh)) { - ll_rw_block(WRITE, 1, &bh); - } - - ExAcquireResourceExclusiveLite(&bdev->bd_bh_lock, TRUE); - if (atomic_dec_and_test(&bh->b_count)) { - ASSERT(0 == atomic_read(&bh->b_count)); - } else { - ExReleaseResourceLite(&bdev->bd_bh_lock); - return; - } - KeQuerySystemTime(&bh->b_ts_drop); - RemoveEntryList(&bh->b_link); - InsertTailList(&Vcb->bd.bd_bh_free, &bh->b_link); - KeClearEvent(&Vcb->bd.bd_bh_notify); - ExReleaseResourceLite(&bdev->bd_bh_lock); - KeSetEvent(&Ext2Global->bhReaper.Wait, 0, FALSE); - - DEBUG(DL_BH, ("brelse: cnt=%u size=%u blk=%10.10xh bh=%p ptr=%p\n", - atomic_read(&g_jbh.bh_count) - 1, bh->b_size, - bh->b_blocknr, bh, bh->b_data )); -} - - -void __bforget(struct buffer_head *bh) -{ - clear_buffer_dirty(bh); - __brelse(bh); -} - -void __lock_buffer(struct buffer_head *bh) -{ -} - -void unlock_buffer(struct buffer_head *bh) -{ - clear_buffer_locked(bh); -} - -void __wait_on_buffer(struct buffer_head *bh) -{ -} - -void ll_rw_block(int rw, int nr, struct buffer_head * bhs[]) -{ - int i; - - for (i = 0; i < nr; i++) { - - struct buffer_head *bh = bhs[i]; - - if (rw == SWRITE) - lock_buffer(bh); - else if (test_set_buffer_locked(bh)) - continue; - - if (rw == WRITE || rw == SWRITE) { - if (test_clear_buffer_dirty(bh)) { - get_bh(bh); - submit_bh(WRITE, bh); - continue; - } - } else { - if (!buffer_uptodate(bh)) { - get_bh(bh); - submit_bh(rw, bh); - continue; - } - } - unlock_buffer(bh); - } -} - -int bh_submit_read(struct buffer_head *bh) -{ - ll_rw_block(READ, 1, &bh); - return 0; -} - -int sync_dirty_buffer(struct buffer_head *bh) -{ - int ret = 0; - - ASSERT(atomic_read(&bh->b_count) <= 1); - lock_buffer(bh); - if (test_clear_buffer_dirty(bh)) { - get_bh(bh); - ret = submit_bh(WRITE, bh); - wait_on_buffer(bh); - } else { - unlock_buffer(bh); - } - return ret; -} - -void mark_buffer_dirty(struct buffer_head *bh) -{ - set_buffer_dirty(bh); -} - -int sync_blockdev(struct block_device *bdev) -{ - PEXT2_VCB Vcb = (PEXT2_VCB) bdev->bd_priv; - Ext2FlushVolume(NULL, Vcb, FALSE); - return 0; -} - -/* - * Perform a pagecache lookup for the matching buffer. If it's there, refre - * it in the LRU and mark it as accessed. If it is not present then return - * NULL - */ -struct buffer_head * -__find_get_block(struct block_device *bdev, sector_t block, unsigned long size) -{ - return __getblk(bdev, block, size); -} - - -// -// inode block mapping -// - -ULONGLONG bmap(struct inode *i, ULONGLONG b) -{ - ULONGLONG lcn = 0; - struct super_block *s = i->i_sb; - - PEXT2_MCB Mcb = (PEXT2_MCB)i->i_priv; - PEXT2_VCB Vcb = (PEXT2_VCB)s->s_priv; - PEXT2_EXTENT extent = NULL; - ULONGLONG offset = (ULONGLONG)b; - NTSTATUS status; - - if (!Mcb || !Vcb) { - goto errorout; - } - - offset <<= BLOCK_BITS; - status = Ext2BuildExtents( - NULL, - Vcb, - Mcb, - offset, - BLOCK_SIZE, - FALSE, - &extent - ); - - if (!NT_SUCCESS(status)) { - goto errorout; - } - - if (extent == NULL) { - goto errorout; - } - - lcn = (unsigned long)(extent->Lba >> BLOCK_BITS); - -errorout: - - if (extent) { - Ext2FreeExtent(extent); - } - - return lcn; -} - -void iget(struct inode *inode) -{ - atomic_inc(&inode->i_count); -} - -void iput(struct inode *inode) -{ - if (atomic_dec_and_test(&inode->i_count)) { - kfree(inode); - } -} - -// -// initialzer and destructor -// - -int -ext2_init_linux() -{ - int rc = 0; - - rc = ext2_init_bh(); - if (rc != 0) { - goto errorout; - } - -errorout: - - return rc; -} - -void -ext2_destroy_linux() -{ - ext2_destroy_bh(); -} +/* + * COPYRIGHT: See COPYRIGHT.TXT + * PROJECT: Ext2 File System Driver for WinNT/2K/XP + * FILE: linux.c + * PROGRAMMER: Matt Wu + * HOMEPAGE: http://www.ext2fsd.com + * UPDATE HISTORY: + */ + +/* INCLUDES *****************************************************************/ + +#include +#include +#include + +/* GLOBALS ***************************************************************/ + +extern PEXT2_GLOBAL Ext2Global; + +/* DEFINITIONS *************************************************************/ + +#ifdef ALLOC_PRAGMA +#pragma alloc_text(PAGE, kzalloc) +#endif + +struct task_struct current_task = { + /* pid */ 0, + /* tid */ 1, + /* comm */ "current\0", + /* journal_info */ NULL +}; +struct task_struct *current = ¤t_task; + +void *kzalloc(int size, int flags) +{ + void *buffer = kmalloc(size, flags); + if (buffer) { + memset(buffer, 0, size); + } + return buffer; +} + +// +// slab routines +// + +kmem_cache_t * +kmem_cache_create( + const char * name, + size_t size, + size_t offset, + unsigned long flags, + kmem_cache_cb_t ctor +) +{ + kmem_cache_t *kc = NULL; + + kc = kmalloc(sizeof(kmem_cache_t), GFP_KERNEL); + if (kc == NULL) { + goto errorout; + } + + memset(kc, 0, sizeof(kmem_cache_t)); + ExInitializeNPagedLookasideList( + &kc->la, + NULL, + NULL, + 0, + size, + 'JBKC', + 0); + + kc->size = size; + strncpy(kc->name, name, 31); + kc->constructor = ctor; + +errorout: + + return kc; +} + +int kmem_cache_destroy(kmem_cache_t * kc) +{ + ASSERT(kc != NULL); + + ExDeleteNPagedLookasideList(&(kc->la)); + kfree(kc); + + return 0; +} + +void* kmem_cache_alloc(kmem_cache_t *kc, int flags) +{ + PVOID ptr = NULL; + ptr = ExAllocateFromNPagedLookasideList(&(kc->la)); + if (ptr) { + atomic_inc(&kc->count); + atomic_inc(&kc->acount); + } + return ptr; +} + +void kmem_cache_free(kmem_cache_t *kc, void *p) +{ + if (p) { + atomic_dec(&kc->count); + ExFreeToNPagedLookasideList(&(kc->la), p); + } +} + +// +// wait queue routines +// + +void init_waitqueue_head(wait_queue_head_t *q) +{ + spin_lock_init(&q->lock); + INIT_LIST_HEAD(&q->task_list); +} + +struct __wait_queue * +wait_queue_create() +{ + struct __wait_queue * wait = NULL; + wait = kmalloc(sizeof(struct __wait_queue), GFP_KERNEL); + if (!wait) { + return NULL; + } + + memset(wait, 0, sizeof(struct __wait_queue)); + wait->flags = WQ_FLAG_AUTO_REMOVAL; + wait->private = (void *)KeGetCurrentThread(); + INIT_LIST_HEAD(&wait->task_list); + KeInitializeEvent(&(wait->event), + SynchronizationEvent, + FALSE); + + return wait; +} + +void +wait_queue_destroy(struct __wait_queue * wait) +{ + kfree(wait); +} + +static inline void __add_wait_queue(wait_queue_head_t *head, struct __wait_queue *new) +{ + list_add(&new->task_list, &head->task_list); +} + +/* + * Used for wake-one threads: + */ +static inline void __add_wait_queue_tail(wait_queue_head_t *head, + struct __wait_queue *new) +{ + list_add_tail(&new->task_list, &head->task_list); +} + +static inline void __remove_wait_queue(wait_queue_head_t *head, + struct __wait_queue *old) +{ + list_del(&old->task_list); +} + +void add_wait_queue(wait_queue_head_t *q, wait_queue_t *waiti) +{ + unsigned long flags; + struct __wait_queue *wait = *waiti; + + wait->flags &= ~WQ_FLAG_EXCLUSIVE; + spin_lock_irqsave(&q->lock, flags); + __add_wait_queue(q, wait); + spin_unlock_irqrestore(&q->lock, flags); +} + +void add_wait_queue_exclusive(wait_queue_head_t *q, wait_queue_t *waiti) +{ + unsigned long flags; + struct __wait_queue *wait = *waiti; + + wait->flags |= WQ_FLAG_EXCLUSIVE; + spin_lock_irqsave(&q->lock, flags); + __add_wait_queue_tail(q, wait); + spin_unlock_irqrestore(&q->lock, flags); +} + +void remove_wait_queue(wait_queue_head_t *q, wait_queue_t *waiti) +{ + unsigned long flags; + struct __wait_queue *wait = *waiti; + + spin_lock_irqsave(&q->lock, flags); + __remove_wait_queue(q, wait); + spin_unlock_irqrestore(&q->lock, flags); +} + +/* + * Note: we use "set_current_state()" _after_ the wait-queue add, + * because we need a memory barrier there on SMP, so that any + * wake-function that tests for the wait-queue being active + * will be guaranteed to see waitqueue addition _or_ subsequent + * tests in this thread will see the wakeup having taken place. + * + * The spin_unlock() itself is semi-permeable and only protects + * one way (it only protects stuff inside the critical region and + * stops them from bleeding out - it would still allow subsequent + * loads to move into the critical region). + */ +void +prepare_to_wait(wait_queue_head_t *q, wait_queue_t *waiti, int state) +{ + unsigned long flags; + struct __wait_queue *wait = *waiti; + + wait->flags &= ~WQ_FLAG_EXCLUSIVE; + spin_lock_irqsave(&q->lock, flags); + if (list_empty(&wait->task_list)) + __add_wait_queue(q, wait); + /* + * don't alter the task state if this is just going to + * queue an async wait queue callback + */ + if (is_sync_wait(wait)) + set_current_state(state); + spin_unlock_irqrestore(&q->lock, flags); +} + +void +prepare_to_wait_exclusive(wait_queue_head_t *q, wait_queue_t *waiti, int state) +{ + unsigned long flags; + struct __wait_queue *wait = *waiti; + + wait->flags |= WQ_FLAG_EXCLUSIVE; + spin_lock_irqsave(&q->lock, flags); + if (list_empty(&wait->task_list)) + __add_wait_queue_tail(q, wait); + /* + * don't alter the task state if this is just going to + * queue an async wait queue callback + */ + if (is_sync_wait(wait)) + set_current_state(state); + spin_unlock_irqrestore(&q->lock, flags); +} +EXPORT_SYMBOL(prepare_to_wait_exclusive); + +void finish_wait(wait_queue_head_t *q, wait_queue_t *waiti) +{ + unsigned long flags; + struct __wait_queue *wait = *waiti; + + __set_current_state(TASK_RUNNING); + /* + * We can check for list emptiness outside the lock + * IFF: + * - we use the "careful" check that verifies both + * the next and prev pointers, so that there cannot + * be any half-pending updates in progress on other + * CPU's that we haven't seen yet (and that might + * still change the stack area. + * and + * - all other users take the lock (ie we can only + * have _one_ other CPU that looks at or modifies + * the list). + */ + if (!list_empty_careful(&wait->task_list)) { + spin_lock_irqsave(&q->lock, flags); + list_del_init(&wait->task_list); + spin_unlock_irqrestore(&q->lock, flags); + } + + /* free wait */ + wait_queue_destroy(wait); +} + +int wake_up(wait_queue_head_t *queue) +{ + return 0; /* KeSetEvent(&wait->event, 0, FALSE); */ +} + + +// +// kernel timer routines +// + +// +// buffer head routines +// + +struct _EXT2_BUFFER_HEAD { + kmem_cache_t * bh_cache; + atomic_t bh_count; + atomic_t bh_acount; +} g_jbh = {NULL, ATOMIC_INIT(0)}; + +int +ext2_init_bh() +{ + g_jbh.bh_count.counter = 0; + g_jbh.bh_acount.counter = 0; + g_jbh.bh_cache = kmem_cache_create( + "ext2_bh", /* bh */ + sizeof(struct buffer_head), + 0, /* offset */ + SLAB_TEMPORARY, /* flags */ + NULL); /* ctor */ + if (g_jbh.bh_cache == NULL) { + printk(KERN_EMERG "JBD: failed to create handle cache\n"); + return -ENOMEM; + } + return 0; +} + +void +ext2_destroy_bh() +{ + if (g_jbh.bh_cache) { + kmem_cache_destroy(g_jbh.bh_cache); + g_jbh.bh_cache = NULL; + } +} + +struct buffer_head * +new_buffer_head() +{ + struct buffer_head * bh = NULL; + bh = kmem_cache_alloc(g_jbh.bh_cache, GFP_NOFS); + if (bh) { + atomic_inc(&g_jbh.bh_count); + atomic_inc(&g_jbh.bh_acount); + + memset(bh, 0, sizeof(struct buffer_head)); + InitializeListHead(&bh->b_link); + KeQuerySystemTime(&bh->b_ts_creat); + DEBUG(DL_BH, ("bh=%p allocated.\n", bh)); + INC_MEM_COUNT(PS_BUFF_HEAD, bh, sizeof(struct buffer_head)); + } + + return bh; +} + +void +free_buffer_head(struct buffer_head * bh) +{ + if (bh) { + if (bh->b_mdl) { + + DEBUG(DL_BH, ("bh=%p mdl=%p (Flags:%xh VA:%p) released.\n", bh, bh->b_mdl, + bh->b_mdl->MdlFlags, bh->b_mdl->MappedSystemVa)); + if (IsFlagOn(bh->b_mdl->MdlFlags, MDL_MAPPED_TO_SYSTEM_VA)) { + MmUnmapLockedPages(bh->b_mdl->MappedSystemVa, bh->b_mdl); + } + Ext2DestroyMdl(bh->b_mdl); + } + if (bh->b_bcb) { + CcUnpinDataForThread(bh->b_bcb, (ERESOURCE_THREAD)bh | 0x3); + } + + DEBUG(DL_BH, ("bh=%p freed.\n", bh)); + DEC_MEM_COUNT(PS_BUFF_HEAD, bh, sizeof(struct buffer_head)); + kmem_cache_free(g_jbh.bh_cache, bh); + atomic_dec(&g_jbh.bh_count); + } +} + +// +// Red-black tree insert routine. +// + +static struct buffer_head *__buffer_head_search(struct rb_root *root, + sector_t blocknr) +{ + struct rb_node *new = root->rb_node; + + /* Figure out where to put new node */ + while (new) { + struct buffer_head *bh = + container_of(new, struct buffer_head, b_rb_node); + s64 result = blocknr - bh->b_blocknr; + + if (result < 0) + new = new->rb_left; + else if (result > 0) + new = new->rb_right; + else + return bh; + + } + + return NULL; +} + +static int buffer_head_blocknr_cmp(struct rb_node *a, struct rb_node *b) +{ + struct buffer_head *a_bh, *b_bh; + s64 result; + a_bh = container_of(a, struct buffer_head, b_rb_node); + b_bh = container_of(b, struct buffer_head, b_rb_node); + result = a_bh->b_blocknr - b_bh->b_blocknr; + + if (result < 0) + return -1; + if (result > 0) + return 1; + return 0; +} + +static struct buffer_head *buffer_head_search(struct block_device *bdev, + sector_t blocknr) +{ + struct rb_root *root; + root = &bdev->bd_bh_root; + return __buffer_head_search(root, blocknr); +} + +static void buffer_head_insert(struct block_device *bdev, struct buffer_head *bh) +{ + rb_insert(&bdev->bd_bh_root, &bh->b_rb_node, buffer_head_blocknr_cmp); +} + +void buffer_head_remove(struct block_device *bdev, struct buffer_head *bh) +{ + rb_erase(&bh->b_rb_node, &bdev->bd_bh_root); +} + +struct buffer_head * +get_block_bh_mdl( + struct block_device * bdev, + sector_t block, + unsigned long size, + int zero +) +{ + PEXT2_VCB Vcb = bdev->bd_priv; + LARGE_INTEGER offset; + PVOID bcb = NULL; + PVOID ptr = NULL; + + struct list_head *entry; + + /* allocate buffer_head and initialize it */ + struct buffer_head *bh = NULL, *tbh = NULL; + + /* check the block is valid or not */ + if (block >= TOTAL_BLOCKS) { + DbgBreak(); + goto errorout; + } + + /* search the bdev bh list */ + ExAcquireSharedStarveExclusive(&bdev->bd_bh_lock, TRUE); + tbh = buffer_head_search(bdev, block); + if (tbh) { + bh = tbh; + get_bh(bh); + ExReleaseResourceLite(&bdev->bd_bh_lock); + goto errorout; + } + ExReleaseResourceLite(&bdev->bd_bh_lock); + + bh = new_buffer_head(); + if (!bh) { + goto errorout; + } + bh->b_bdev = bdev; + bh->b_blocknr = block; + bh->b_size = size; + bh->b_data = NULL; + +again: + + offset.QuadPart = (s64) bh->b_blocknr; + offset.QuadPart <<= BLOCK_BITS; + + if (zero) { + /* PIN_EXCLUSIVE disabled, likely to deadlock with volume operations */ + if (!CcPreparePinWrite(Vcb->Volume, + &offset, + bh->b_size, + FALSE, + PIN_WAIT /* | PIN_EXCLUSIVE */, + &bcb, + &ptr)) { + Ext2Sleep(100); + goto again; + } + } else { + if (!CcPinRead( Vcb->Volume, + &offset, + bh->b_size, + PIN_WAIT, + &bcb, + &ptr)) { + Ext2Sleep(100); + goto again; + } + set_buffer_uptodate(bh); + } + + bh->b_mdl = Ext2CreateMdl(ptr, bh->b_size, IoModifyAccess); + if (bh->b_mdl) { + /* muse map the PTE to NonCached zone. journal recovery will + access the PTE under spinlock: DISPATCH_LEVEL IRQL */ + bh->b_data = MmMapLockedPagesSpecifyCache( + bh->b_mdl, KernelMode, MmNonCached, + NULL,FALSE, HighPagePriority); + /* bh->b_data = MmMapLockedPages(bh->b_mdl, KernelMode); */ + } + if (!bh->b_mdl || !bh->b_data) { + free_buffer_head(bh); + bh = NULL; + goto errorout; + } + + get_bh(bh); + + DEBUG(DL_BH, ("getblk: Vcb=%p bhcount=%u block=%u bh=%p mdl=%p (Flags:%xh VA:%p)\n", + Vcb, atomic_read(&g_jbh.bh_count), block, bh, bh->b_mdl, bh->b_mdl->MdlFlags, bh->b_data)); + + ExAcquireResourceExclusiveLite(&bdev->bd_bh_lock, TRUE); + /* do search again here */ + tbh = buffer_head_search(bdev, block); + if (tbh) { + free_buffer_head(bh); + bh = tbh; + get_bh(bh); + RemoveEntryList(&bh->b_link); + InitializeListHead(&bh->b_link); + ExReleaseResourceLite(&bdev->bd_bh_lock); + goto errorout; + } else { + buffer_head_insert(bdev, bh); + } + ExReleaseResourceLite(&bdev->bd_bh_lock); + + /* we get it */ +errorout: + + if (bcb) + CcUnpinData(bcb); + + return bh; +} + +int submit_bh_mdl(int rw, struct buffer_head *bh) +{ + struct block_device *bdev = bh->b_bdev; + PEXT2_VCB Vcb = bdev->bd_priv; + PBCB Bcb; + PVOID Buffer; + LARGE_INTEGER Offset; + + ASSERT(Vcb->Identifier.Type == EXT2VCB); + ASSERT(bh->b_data); + + if (rw == WRITE) { + + if (IsVcbReadOnly(Vcb)) { + goto errorout; + } + + SetFlag(Vcb->Volume->Flags, FO_FILE_MODIFIED); + Offset.QuadPart = ((LONGLONG)bh->b_blocknr) << BLOCK_BITS; + + /* PIN_EXCLUSIVE disabled, likely to deadlock with volume operations */ + if (CcPreparePinWrite( + Vcb->Volume, + &Offset, + BLOCK_SIZE, + FALSE, + PIN_WAIT /* | PIN_EXCLUSIVE */, + &Bcb, + &Buffer )) { +#if 0 + if (memcmp(Buffer, bh->b_data, BLOCK_SIZE) != 0) { + DbgBreak(); + } + memmove(Buffer, bh->b_data, BLOCK_SIZE); +#endif + CcSetDirtyPinnedData(Bcb, NULL); + Ext2AddBlockExtent( Vcb, NULL, + (ULONG)bh->b_blocknr, + (ULONG)bh->b_blocknr, + (bh->b_size >> BLOCK_BITS)); + CcUnpinData(Bcb); + } else { + + Ext2AddBlockExtent( Vcb, NULL, + (ULONG)bh->b_blocknr, + (ULONG)bh->b_blocknr, + (bh->b_size >> BLOCK_BITS)); + } + + } else { + } + +errorout: + + unlock_buffer(bh); + put_bh(bh); + return 0; +} + +struct buffer_head * +get_block_bh_pin( + struct block_device * bdev, + sector_t block, + unsigned long size, + int zero +) +{ + PEXT2_VCB Vcb = bdev->bd_priv; + LARGE_INTEGER offset; + + struct list_head *entry; + + /* allocate buffer_head and initialize it */ + struct buffer_head *bh = NULL, *tbh = NULL; + + /* check the block is valid or not */ + if (block >= TOTAL_BLOCKS) { + DbgBreak(); + goto errorout; + } + + /* search the bdev bh list */ + ExAcquireSharedStarveExclusive(&bdev->bd_bh_lock, TRUE); + tbh = buffer_head_search(bdev, block); + if (tbh) { + bh = tbh; + get_bh(bh); + ExReleaseResourceLite(&bdev->bd_bh_lock); + goto errorout; + } + ExReleaseResourceLite(&bdev->bd_bh_lock); + + bh = new_buffer_head(); + if (!bh) { + goto errorout; + } + bh->b_bdev = bdev; + bh->b_blocknr = block; + bh->b_size = size; + bh->b_data = NULL; + +again: + + offset.QuadPart = (s64) bh->b_blocknr; + offset.QuadPart <<= BLOCK_BITS; + + if (zero) { + if (!CcPreparePinWrite(Vcb->Volume, + &offset, + bh->b_size, + FALSE, + PIN_WAIT, + &bh->b_bcb, + &bh->b_data)) { + Ext2Sleep(100); + goto again; + } + } else { + if (!CcPinRead( Vcb->Volume, + &offset, + bh->b_size, + PIN_WAIT, + &bh->b_bcb, + &bh->b_data)) { + Ext2Sleep(100); + goto again; + } + set_buffer_uptodate(bh); + } + + if (bh->b_bcb) + CcSetBcbOwnerPointer(bh->b_bcb, (PVOID)((ERESOURCE_THREAD)bh | 0x3)); + + if (!bh->b_data) { + free_buffer_head(bh); + bh = NULL; + goto errorout; + } + get_bh(bh); + + DEBUG(DL_BH, ("getblk: Vcb=%p bhcount=%u block=%u bh=%p ptr=%p.\n", + Vcb, atomic_read(&g_jbh.bh_count), block, bh, bh->b_data)); + + ExAcquireResourceExclusiveLite(&bdev->bd_bh_lock, TRUE); + /* do search again here */ + tbh = buffer_head_search(bdev, block); + if (tbh) { + get_bh(tbh); + free_buffer_head(bh); + bh = tbh; + RemoveEntryList(&bh->b_link); + InitializeListHead(&bh->b_link); + ExReleaseResourceLite(&bdev->bd_bh_lock); + goto errorout; + } else { + buffer_head_insert(bdev, bh); + } + ExReleaseResourceLite(&bdev->bd_bh_lock); + + /* we get it */ +errorout: + + return bh; +} + +int submit_bh_pin(int rw, struct buffer_head *bh) +{ + struct block_device *bdev = bh->b_bdev; + PEXT2_VCB Vcb = bdev->bd_priv; + PVOID Buffer; + LARGE_INTEGER Offset; + + ASSERT(Vcb->Identifier.Type == EXT2VCB); + ASSERT(bh->b_data && bh->b_bcb); + + if (rw == WRITE) { + + if (IsVcbReadOnly(Vcb)) { + goto errorout; + } + + SetFlag(Vcb->Volume->Flags, FO_FILE_MODIFIED); + Offset.QuadPart = ((LONGLONG)bh->b_blocknr) << BLOCK_BITS; + + CcSetDirtyPinnedData(bh->b_bcb, NULL); + Ext2AddBlockExtent( Vcb, NULL, + (ULONG)bh->b_blocknr, + (ULONG)bh->b_blocknr, + (bh->b_size >> BLOCK_BITS)); + } else { + } + +errorout: + + unlock_buffer(bh); + put_bh(bh); + return 0; +} + +#if 0 + +struct buffer_head * +get_block_bh( + struct block_device * bdev, + sector_t block, + unsigned long size, + int zero +) +{ + return get_block_bh_mdl(bdev, block, size, zero); +} + +int submit_bh(int rw, struct buffer_head *bh) +{ + return submit_bh_mdl(rw, bh); +} + +#else + +struct buffer_head * +get_block_bh( + struct block_device * bdev, + sector_t block, + unsigned long size, + int zero +) +{ + return get_block_bh_pin(bdev, block, size, zero); +} + +int submit_bh(int rw, struct buffer_head *bh) +{ + return submit_bh_pin(rw, bh); +} +#endif + +struct buffer_head * +__getblk( + struct block_device * bdev, + sector_t block, + unsigned long size +) +{ + return get_block_bh(bdev, block, size, 0); +} + +void __brelse(struct buffer_head *bh) +{ + struct block_device *bdev = bh->b_bdev; + PEXT2_VCB Vcb = (PEXT2_VCB)bdev->bd_priv; + + ASSERT(Vcb->Identifier.Type == EXT2VCB); + + /* write data in case it's dirty */ + while (buffer_dirty(bh)) { + ll_rw_block(WRITE, 1, &bh); + } + + ExAcquireResourceExclusiveLite(&bdev->bd_bh_lock, TRUE); + if (atomic_dec_and_test(&bh->b_count)) { + ASSERT(0 == atomic_read(&bh->b_count)); + } else { + ExReleaseResourceLite(&bdev->bd_bh_lock); + return; + } + KeQuerySystemTime(&bh->b_ts_drop); + RemoveEntryList(&bh->b_link); + InsertTailList(&Vcb->bd.bd_bh_free, &bh->b_link); + KeClearEvent(&Vcb->bd.bd_bh_notify); + ExReleaseResourceLite(&bdev->bd_bh_lock); + KeSetEvent(&Ext2Global->bhReaper.Wait, 0, FALSE); + + DEBUG(DL_BH, ("brelse: cnt=%u size=%u blk=%10.10xh bh=%p ptr=%p\n", + atomic_read(&g_jbh.bh_count) - 1, bh->b_size, + bh->b_blocknr, bh, bh->b_data )); +} + + +void __bforget(struct buffer_head *bh) +{ + clear_buffer_dirty(bh); + __brelse(bh); +} + +void __lock_buffer(struct buffer_head *bh) +{ +} + +void unlock_buffer(struct buffer_head *bh) +{ + clear_buffer_locked(bh); +} + +void __wait_on_buffer(struct buffer_head *bh) +{ +} + +void ll_rw_block(int rw, int nr, struct buffer_head * bhs[]) +{ + int i; + + for (i = 0; i < nr; i++) { + + struct buffer_head *bh = bhs[i]; + + if (rw == SWRITE) + lock_buffer(bh); + else if (test_set_buffer_locked(bh)) + continue; + + if (rw == WRITE || rw == SWRITE) { + if (test_clear_buffer_dirty(bh)) { + get_bh(bh); + submit_bh(WRITE, bh); + continue; + } + } else { + if (!buffer_uptodate(bh)) { + get_bh(bh); + submit_bh(rw, bh); + continue; + } + } + unlock_buffer(bh); + } +} + +int bh_submit_read(struct buffer_head *bh) +{ + ll_rw_block(READ, 1, &bh); + return 0; +} + +int sync_dirty_buffer(struct buffer_head *bh) +{ + int ret = 0; + + ASSERT(atomic_read(&bh->b_count) <= 1); + lock_buffer(bh); + if (test_clear_buffer_dirty(bh)) { + get_bh(bh); + ret = submit_bh(WRITE, bh); + wait_on_buffer(bh); + } else { + unlock_buffer(bh); + } + return ret; +} + +void mark_buffer_dirty(struct buffer_head *bh) +{ + set_buffer_dirty(bh); +} + +int sync_blockdev(struct block_device *bdev) +{ + PEXT2_VCB Vcb = (PEXT2_VCB) bdev->bd_priv; + Ext2FlushVolume(NULL, Vcb, FALSE); + return 0; +} + +/* + * Perform a pagecache lookup for the matching buffer. If it's there, refre + * it in the LRU and mark it as accessed. If it is not present then return + * NULL + */ +struct buffer_head * +__find_get_block(struct block_device *bdev, sector_t block, unsigned long size) +{ + return __getblk(bdev, block, size); +} + + +// +// inode block mapping +// + +ULONGLONG bmap(struct inode *i, ULONGLONG b) +{ + ULONGLONG lcn = 0; + struct super_block *s = i->i_sb; + + PEXT2_MCB Mcb = (PEXT2_MCB)i->i_priv; + PEXT2_VCB Vcb = (PEXT2_VCB)s->s_priv; + PEXT2_EXTENT extent = NULL; + ULONGLONG offset = (ULONGLONG)b; + NTSTATUS status; + + if (!Mcb || !Vcb) { + goto errorout; + } + + offset <<= BLOCK_BITS; + status = Ext2BuildExtents( + NULL, + Vcb, + Mcb, + offset, + BLOCK_SIZE, + FALSE, + &extent + ); + + if (!NT_SUCCESS(status)) { + goto errorout; + } + + if (extent == NULL) { + goto errorout; + } + + lcn = (unsigned long)(extent->Lba >> BLOCK_BITS); + +errorout: + + if (extent) { + Ext2FreeExtent(extent); + } + + return lcn; +} + +void iget(struct inode *inode) +{ + atomic_inc(&inode->i_count); +} + +void iput(struct inode *inode) +{ + if (atomic_dec_and_test(&inode->i_count)) { + kfree(inode); + } +} + +// +// string functions from linux/lib/string.c +// + +int _strnicmp(const char* str1, const char* str2, size_t count) +{ + unsigned int c1, c2; + + if (!count) + return 0; + + do { + c1 = *str1++; + c2 = *str2++; + if (!c1 || !c2) + break; + if (c1 == c2) + continue; + c1 = tolower(c1); + c2 = tolower(c2); + if (c1 != c2) + break; + } while (--count); + return (int)c1 - (int)c2; +} + +int strncmp(const char* str1, const char* str2, size_t count) +{ + unsigned char c1, c2; + + while (count) { + c1 = *str1++; + c2 = *str2++; + if (c1 != c2) + return c1 < c2 ? -1 : 1; + if (!c1) + break; + count--; + } + return 0; +} + +char* strncpy(char* dest, const char* src, size_t count) +{ + char *p = dest; + + while (count) { + if ((*p = *src) != 0) + src++; + p++; + count--; + } + return dest; +} + +// +// initialzer and destructor +// + +int +ext2_init_linux() +{ + int rc = 0; + + rc = ext2_init_bh(); + if (rc != 0) { + goto errorout; + } + +errorout: + + return rc; +} + +void +ext2_destroy_linux() +{ + ext2_destroy_bh(); +} diff --git a/Ext4Fsd/misc.c b/Ext4Fsd/misc.c index 91c3740..d78f5b8 100644 --- a/Ext4Fsd/misc.c +++ b/Ext4Fsd/misc.c @@ -436,8 +436,8 @@ NTSTATUS Ext2WinntError(int rc) case -EBUSY: return STATUS_DEVICE_BUSY; - case -ENOSYS: - return STATUS_NOT_IMPLEMENTED; +/* case -ENOSYS: + return STATUS_NOT_IMPLEMENTED;*/ case -ENOSPC: return STATUS_DISK_FULL; @@ -445,8 +445,8 @@ NTSTATUS Ext2WinntError(int rc) case -EOPNOTSUPP: return STATUS_NOT_SUPPORTED; - case -EDEADLK: - return STATUS_POSSIBLE_DEADLOCK; +/* case -EDEADLK: + return STATUS_POSSIBLE_DEADLOCK;*/ case -EEXIST: return STATUS_OBJECT_NAME_COLLISION; @@ -460,8 +460,8 @@ NTSTATUS Ext2WinntError(int rc) case -EISDIR: return STATUS_FILE_IS_A_DIRECTORY; - case -ENOTEMPTY: - return STATUS_DIRECTORY_NOT_EMPTY; +/* case -ENOTEMPTY: + return STATUS_DIRECTORY_NOT_EMPTY;*/ case -ENODEV: return STATUS_NO_SUCH_DEVICE;