From 8a5efb6908f505a80f8a6499d5cbc32929cf11e7 Mon Sep 17 00:00:00 2001 From: gfdgd_xi <3025613752@qq.com> Date: Sat, 24 Sep 2022 21:02:50 +0800 Subject: [PATCH] 2.2.0 --- Makefile | 2 + RegShot/182to183.exe | Bin 0 -> 49152 bytes RegShot/build/CMakeLists.txt | 114 ++ RegShot/build/build_wdk.bat | 166 ++ .../cmake_how_to_create_project_files.txt | 66 + RegShot/build/make_zip.bat | 280 +++ RegShot/build/makefile.mak | 160 ++ RegShot/build/regshot_icl12.sln | 26 + RegShot/build/regshot_icl12.vcxproj | 224 +++ RegShot/build/regshot_icl12.vcxproj.filters | 66 + RegShot/build/regshot_vs2008.sln | 26 + RegShot/build/regshot_vs2008.vcproj | 440 +++++ RegShot/build/regshot_vs2010.sln | 26 + RegShot/build/regshot_vs2010.vcxproj | 203 ++ RegShot/build/regshot_vs2010.vcxproj.filters | 69 + RegShot/gpl.txt | 339 ++++ RegShot/language.ini | 1424 ++++++++++++++ RegShot/regshot.exe | Bin 0 -> 107008 bytes RegShot/regshot.ini | 15 + RegShot/regshot_x64.exe | Bin 0 -> 123392 bytes RegShot/src/182to183/align.c | 123 ++ RegShot/src/182to183/global.h | 158 ++ RegShot/src/182to183/loadsave.c | 359 ++++ RegShot/src/182to183/main.c | 41 + RegShot/src/Makefile | 120 ++ RegShot/src/fileshot.c | 586 ++++++ RegShot/src/global.h | 415 ++++ RegShot/src/language.c | 323 +++ RegShot/src/misc.c | 143 ++ RegShot/src/output.c | 179 ++ RegShot/src/regshot.c | 1725 +++++++++++++++++ RegShot/src/regshot.rc | 177 ++ RegShot/src/res/Regshot.exe.manifest | 40 + RegShot/src/res/regshot.ico | Bin 0 -> 22486 bytes RegShot/src/resource.h | 77 + RegShot/src/setup.c | 172 ++ RegShot/src/ui.c | 371 ++++ RegShot/src/version.h | 103 + RegShot/src/winmain.c | 459 +++++ information.json | 2 +- mainwindow.py | 18 +- package-script/information.json | 2 +- req/__init__.py | 2 +- req/__pycache__/__init__.cpython-37.pyc | Bin 1065 -> 1075 bytes wine/installwine | 2 +- 45 files changed, 9231 insertions(+), 12 deletions(-) create mode 100644 RegShot/182to183.exe create mode 100644 RegShot/build/CMakeLists.txt create mode 100644 RegShot/build/build_wdk.bat create mode 100644 RegShot/build/cmake_how_to_create_project_files.txt create mode 100644 RegShot/build/make_zip.bat create mode 100644 RegShot/build/makefile.mak create mode 100644 RegShot/build/regshot_icl12.sln create mode 100644 RegShot/build/regshot_icl12.vcxproj create mode 100644 RegShot/build/regshot_icl12.vcxproj.filters create mode 100644 RegShot/build/regshot_vs2008.sln create mode 100644 RegShot/build/regshot_vs2008.vcproj create mode 100644 RegShot/build/regshot_vs2010.sln create mode 100644 RegShot/build/regshot_vs2010.vcxproj create mode 100644 RegShot/build/regshot_vs2010.vcxproj.filters create mode 100644 RegShot/gpl.txt create mode 100644 RegShot/language.ini create mode 100644 RegShot/regshot.exe create mode 100644 RegShot/regshot.ini create mode 100644 RegShot/regshot_x64.exe create mode 100644 RegShot/src/182to183/align.c create mode 100644 RegShot/src/182to183/global.h create mode 100644 RegShot/src/182to183/loadsave.c create mode 100644 RegShot/src/182to183/main.c create mode 100644 RegShot/src/Makefile create mode 100644 RegShot/src/fileshot.c create mode 100644 RegShot/src/global.h create mode 100644 RegShot/src/language.c create mode 100644 RegShot/src/misc.c create mode 100644 RegShot/src/output.c create mode 100644 RegShot/src/regshot.c create mode 100644 RegShot/src/regshot.rc create mode 100644 RegShot/src/res/Regshot.exe.manifest create mode 100644 RegShot/src/res/regshot.ico create mode 100644 RegShot/src/resource.h create mode 100644 RegShot/src/setup.c create mode 100644 RegShot/src/ui.c create mode 100644 RegShot/src/version.h create mode 100644 RegShot/src/winmain.c diff --git a/Makefile b/Makefile index 36ecd15..54cc860 100755 --- a/Makefile +++ b/Makefile @@ -12,6 +12,8 @@ build: zip -v -q -r package-script.zip package-script cp -rv VM deb/opt/apps/deepin-wine-runner cp -rv AllInstall.py deb/opt/apps/deepin-wine-runner + cp -rv req deb/opt/apps/deepin-wine-runner + cp -rv RegShot deb/opt/apps/deepin-wine-runner cp -rv BeCyIconGrabber.exe deb/opt/apps/deepin-wine-runner cp -rv deepin-wine-packager-with-script.py deb/opt/apps/deepin-wine-runner cp -rv deepin-wine-packager.py deb/opt/apps/deepin-wine-runner diff --git a/RegShot/182to183.exe b/RegShot/182to183.exe new file mode 100644 index 0000000000000000000000000000000000000000..29bb56c216f45e8ac94e5b1210179466845d08f2 GIT binary patch literal 49152 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 literal 0 HcmV?d00001 diff --git a/RegShot/build/CMakeLists.txt b/RegShot/build/CMakeLists.txt new file mode 100644 index 0000000..f159545 --- /dev/null +++ b/RegShot/build/CMakeLists.txt @@ -0,0 +1,114 @@ +### +### CMake settings +### +# see http://www.cmake.org/Wiki/CMake_Policies +cmake_minimum_required(VERSION 2.8) + + +### +### Project settings +### +project(RegShot) + +set(EXE_SUFFIX "-alpha") + + +### +### Project options +### + +## Build options +# --> Microsoft Visual C++ +# see http://msdn.microsoft.com/en-us/library/aa278396(v=VS.60).aspx +# http://msdn.microsoft.com/en-us/library/2kzt1wy3(v=VS.71).aspx +option(MSVC_SHARED_RT "MSVC: Build with shared runtime libs (/MD)" OFF) +option(MSVC_STHREADED_RT "MSVC: Build with single-threaded static runtime libs (/ML until VS .NET 2003)" OFF) + + +### +### Sources, headers, directories and libs +### +file(GLOB sources "../src/[a-zA-Z]*.c") +file(GLOB private_headers "../src/[a-zA-Z]*.h") +file(GLOB resources "../src/[a-zA-Z]*.rc") +file(GLOB manifests "../src/res/[a-zA-Z]*.manifest") + + +### +### General compilation settings +### +if(WIN32) + if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set(CMAKE_INSTALL_PREFIX "C:/") + endif() +endif() + +# GCC specialities +if(CMAKE_COMPILER_IS_GNUC) + message(FATAL_ERROR "GNU compiler not supported. Patch submissions welcome.") +endif() + +# Microsoft VisualC++ specialities +if(MSVC) + ### General stuff + # a) Change MSVC runtime library settings (/MD[d], /MT[d], /ML[d] (single-threaded until VS 2003)) + # plus set lib suffix for later use and project label accordingly + # see http://msdn.microsoft.com/en-us/library/aa278396(v=VS.60).aspx + # http://msdn.microsoft.com/en-us/library/2kzt1wy3(v=VS.71).aspx + set(LIB_RT_SUFFIX "md") # CMake defaults to /MD for MSVC + set(LIB_RT_OPTION "/MD") + # + if(NOT MSVC_SHARED_RT) # User wants to have static runtime libraries (/MT, /ML) + if(MSVC_STHREADED_RT) # User wants to have old single-threaded static runtime libraries + set(LIB_RT_SUFFIX "ml") + set(LIB_RT_OPTION "/ML") + if(NOT ${MSVC_VERSION} LESS 1400) + message(FATAL_ERROR "Single-threaded static runtime libraries (/ML) only available until VS .NET 2003 (7.1).") + endif() + else() + set(LIB_RT_SUFFIX "mt") + set(LIB_RT_OPTION "/MT") + endif() + + # correct linker options + foreach(flag_var CMAKE_C_FLAGS CMAKE_CXX_FLAGS) + foreach(config_name "" DEBUG RELEASE MINSIZEREL RELWITHDEBINFO) + set(var_name "${flag_var}") + if(NOT "${config_name}" STREQUAL "") + set(var_name "${var_name}_${config_name}") + endif() + string(REPLACE "/MD" "${LIB_RT_OPTION}" ${var_name} "${${var_name}}") + endforeach() + endforeach() + endif() + # + set(LABEL_SUFFIX "${LABEL_SUFFIX} ${LIB_RT_SUFFIX}") + + ### Project stuff + if(NOT ${MSVC_VERSION} LESS 1400) + add_definitions(-D_CRT_SECURE_NO_WARNINGS) + endif() + + if(CMAKE_CL_64) + set(PLATFORM_SUFFIX "-x64") + else() + set(PLATFORM_SUFFIX "") + endif() +endif() + + +### +### Executable +### +add_executable(${PROJECT_NAME}${PLATFORM_SUFFIX}${EXE_SUFFIX} + WIN32 + ${sources} + ${private_headers} + ${resources} + ${manifests} +) + +set_target_properties(${PROJECT_NAME}${PLATFORM_SUFFIX}${EXE_SUFFIX} + PROPERTIES + PROJECT_LABEL "${PROJECT_NAME}${PLATFORM_SUFFIX}${EXE_SUFFIX}${LABEL_SUFFIX}" +) diff --git a/RegShot/build/build_wdk.bat b/RegShot/build/build_wdk.bat new file mode 100644 index 0000000..438f87c --- /dev/null +++ b/RegShot/build/build_wdk.bat @@ -0,0 +1,166 @@ +@ECHO OFF +rem ****************************************************************************** +rem * Copyright 2010-2011 XhmikosR +rem * +rem * This file is part of Regshot. +rem * +rem * Regshot is free software; you can redistribute it and/or modify +rem * it under the terms of the GNU General Public License as published by +rem * the Free Software Foundation; either version 2 of the License, or +rem * (at your option) any later version. +rem * +rem * Regshot is distributed in the hope that it will be useful, +rem * but WITHOUT ANY WARRANTY; without even the implied warranty of +rem * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +rem * GNU General Public License for more details. +rem * +rem * You should have received a copy of the GNU General Public License +rem * along with Regshot; if not, write to the Free Software +rem * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +rem * +rem * +rem * build_wdk.bat +rem * Batch file "wrapper" for makefile.mak, used to build Regshot with WDK +rem ****************************************************************************** + + +SETLOCAL ENABLEEXTENSIONS +CD /D %~dp0 + +rem Set the WDK directory +IF NOT DEFINED WDKBASEDIR SET "WDKBASEDIR=C:\WinDDK\7600.16385.1" + +rem Check the building environment +IF NOT EXIST "%WDKBASEDIR%" CALL :SUBMSG "ERROR" "Specify your WDK directory!" + + +rem Check for the help switches +IF /I "%~1" == "help" GOTO SHOWHELP +IF /I "%~1" == "/help" GOTO SHOWHELP +IF /I "%~1" == "-help" GOTO SHOWHELP +IF /I "%~1" == "--help" GOTO SHOWHELP +IF /I "%~1" == "/?" GOTO SHOWHELP + + +rem Check for the first switch +IF "%~1" == "" ( + SET "BUILDTYPE=Build" +) ELSE ( + IF /I "%~1" == "Build" SET "BUILDTYPE=Build" & GOTO CHECKSECONDARG + IF /I "%~1" == "/Build" SET "BUILDTYPE=Build" & GOTO CHECKSECONDARG + IF /I "%~1" == "-Build" SET "BUILDTYPE=Build" & GOTO CHECKSECONDARG + IF /I "%~1" == "--Build" SET "BUILDTYPE=Build" & GOTO CHECKSECONDARG + IF /I "%~1" == "Clean" SET "BUILDTYPE=Clean" & GOTO CHECKSECONDARG + IF /I "%~1" == "/Clean" SET "BUILDTYPE=Clean" & GOTO CHECKSECONDARG + IF /I "%~1" == "-Clean" SET "BUILDTYPE=Clean" & GOTO CHECKSECONDARG + IF /I "%~1" == "--Clean" SET "BUILDTYPE=Clean" & GOTO CHECKSECONDARG + IF /I "%~1" == "Rebuild" SET "BUILDTYPE=Rebuild" & GOTO CHECKSECONDARG + IF /I "%~1" == "/Rebuild" SET "BUILDTYPE=Rebuild" & GOTO CHECKSECONDARG + IF /I "%~1" == "-Rebuild" SET "BUILDTYPE=Rebuild" & GOTO CHECKSECONDARG + IF /I "%~1" == "--Rebuild" SET "BUILDTYPE=Rebuild" & GOTO CHECKSECONDARG + + ECHO. + ECHO Unsupported commandline switch! + ECHO Run "%~nx0 help" for details about the commandline switches. + CALL :SUBMSG "ERROR" "Compilation failed!" +) + + +:CHECKSECONDARG +rem Check for the second switch +IF "%~2" == "" ( + SET "ARCH=all" +) ELSE ( + IF /I "%~2" == "x86" SET "ARCH=x86" & GOTO START + IF /I "%~2" == "/x86" SET "ARCH=x86" & GOTO START + IF /I "%~2" == "-x86" SET "ARCH=x86" & GOTO START + IF /I "%~2" == "--x86" SET "ARCH=x86" & GOTO START + IF /I "%~2" == "x64" SET "ARCH=x64" & GOTO START + IF /I "%~2" == "/x64" SET "ARCH=x64" & GOTO START + IF /I "%~2" == "-x64" SET "ARCH=x64" & GOTO START + IF /I "%~2" == "--x64" SET "ARCH=x64" & GOTO START + IF /I "%~2" == "all" SET "ARCH=all" & GOTO START + IF /I "%~2" == "/all" SET "ARCH=all" & GOTO START + IF /I "%~2" == "-all" SET "ARCH=all" & GOTO START + IF /I "%~2" == "--all" SET "ARCH=all" & GOTO START + + ECHO. + ECHO Unsupported commandline switch! + ECHO Run "%~nx0 help" for details about the commandline switches. + CALL :SUBMSG "ERROR" "Compilation failed!" +) + + +:START +IF "%ARCH%" == "x64" GOTO x64 +IF "%ARCH%" == "x86" GOTO x86 + + +:x86 +SET "INCLUDE=%WDKBASEDIR%\inc\api;%WDKBASEDIR%\inc\api\crt\stl60;%WDKBASEDIR%\inc\crt;%WDKBASEDIR%\inc\ddk" +SET "LIB=%WDKBASEDIR%\lib\crt\i386;%WDKBASEDIR%\lib\win7\i386" +SET "PATH=%WDKBASEDIR%\bin\x86;%WDKBASEDIR%\bin\x86\x86" + +TITLE Building Regshot x86 with WDK... +ECHO. & ECHO. + +CALL :SUBNMAKE + +IF "%ARCH%" == "x86" GOTO END + + +:x64 +SET "INCLUDE=%WDKBASEDIR%\inc\api;%WDKBASEDIR%\inc\api\crt\stl60;%WDKBASEDIR%\inc\crt;%WDKBASEDIR%\inc\ddk" +SET "LIB=%WDKBASEDIR%\lib\crt\amd64;%WDKBASEDIR%\lib\win7\amd64" +SET "PATH=%WDKBASEDIR%\bin\x86;%WDKBASEDIR%\bin\x86\amd64" + +TITLE Building Regshot x64 with WDK... +ECHO. & ECHO. + +CALL :SUBNMAKE "x64=1" + + +:END +TITLE Building Regshot with WDK - Finished! +ENDLOCAL +EXIT /B + + +:SUBNMAKE +nmake /NOLOGO /f "makefile.mak" %BUILDTYPE% %1 +IF %ERRORLEVEL% NEQ 0 CALL :SUBMSG "ERROR" "Compilation failed!" +EXIT /B + + +:SHOWHELP +TITLE "%~nx0 %1" +ECHO. & ECHO. +ECHO Usage: %~nx0 [Clean^|Build^|Rebuild] [x86^|x64^|all] +ECHO. +ECHO Notes: You can also prefix the commands with "-", "--" or "/". +ECHO The arguments are not case sensitive. +ECHO. & ECHO. +ECHO Edit "%~nx0" and set your WDK directory. +ECHO You shouldn't need to make any changes other than that. +ECHO. & ECHO. +ECHO Executing "%~nx0" will use the defaults: "%~nx0 build all" +ECHO. +ECHO If you skip the second argument the default one will be used. Example: +ECHO "%~nx0 rebuild" is the same as "%~nx0 rebuild all" +ECHO. +ECHO WARNING: "%~nx0 x86" won't work. +ECHO. +ENDLOCAL +EXIT /B + + +:SUBMSG +ECHO. & ECHO ______________________________ +ECHO [%~1] %~2 +ECHO ______________________________ & ECHO. +IF /I "%~1" == "ERROR" ( + PAUSE + EXIT +) ELSE ( + EXIT /B +) diff --git a/RegShot/build/cmake_how_to_create_project_files.txt b/RegShot/build/cmake_how_to_create_project_files.txt new file mode 100644 index 0000000..2fcb3a0 --- /dev/null +++ b/RegShot/build/cmake_how_to_create_project_files.txt @@ -0,0 +1,66 @@ +CMake allows to create project and make files for many different compilers from +a single source. This text will tell you how to create project files for RegShot. +If your compiler is not explained here then check out CMake's good documentation +at http://www.cmake.org/cmake/help/documentation.html + +First get CMake from http://www.cmake.org/ (Resources -> Download). +On Windows either use the installer, or extract the zip to a folder which will +contain the CMake folder and then add CMake's bin folder to your path. + +It is recommended to build out-of-source and not inside the source directory. + +The following commands use shell variables to allow re-using them via a script. + + +Preparation for different compilers: +==================================== +* set TDIR=vc6 & set CMGEN="Visual Studio 6" + "%ProgramFiles%\Microsoft Visual Studio\VC98\Bin\vcvars32.bat" + +* set TDIR=vc2002 & set CMGEN="Visual Studio 7" + "%ProgramFiles%\Microsoft Visual Studio .NET\VC7\bin\vcvars32.bat" + +* set TDIR=vc2003 & set CMGEN="Visual Studio 7 .NET 2003" + "%ProgramFiles%\Microsoft Visual Studio .NET 2003\VC7\bin\vcvars32.bat" + +* set TDIR=vc2005 & set CMGEN="Visual Studio 8 2005" + "%ProgramFiles%\Microsoft Visual Studio 8\VC\vcvarsall.bat" + +* set TDIR=vc2005-x64 & set CMGEN="Visual Studio 8 2005 Win64" + "%ProgramFiles%\Microsoft Visual Studio 8\VC\vcvarsall.bat" + +* set TDIR=vc2008 & set CMGEN="Visual Studio 9 2008" + "%ProgramFiles%\Microsoft Visual Studio 9.0\VC\vcvarsall.bat" + +* set TDIR=vc2008-x64 & set CMGEN="Visual Studio 9 2008 Win64" + "%ProgramFiles%\Microsoft Visual Studio 9.0\VC\vcvarsall.bat" + +* set TDIR=vc2010 & set CMGEN="Visual Studio 10" + "%ProgramFiles%\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" + +* set TDIR=vc2010-x64 & set CMGEN="Visual Studio 10 Win64" + "%ProgramFiles%\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" + + +Creating project files: +======================= +* cd /d C:\Coding\Regshot\trunk +* set CMOPTS= + Here you can set options to modify the resulting project files. + All options are listed in CMakeLists.txt and are normally self-explaining. + * Some important ones are: + -DMSVC_SHARED_RT=ON - link with shared runtime libs on MSVC + * Example: + set CMOPTS=-DMSVC_SHARED_RT=ON + +* mkdir bin\%TDIR% +* cd bin\%TDIR% +* del /s /q * & rmdir /s /q . +* cmake %CMOPTS% -G %CMGEN% ..\..\build + + +Tested compilers: +================= +VS 6 (32-Bit, Maddes, just remove DS_SHELLFONT from src/regshot.rc) +VS 2002 (32-Bit, Maddes) +VS 2008 (32-Bit & 64-Bit, Maddes) diff --git a/RegShot/build/make_zip.bat b/RegShot/build/make_zip.bat new file mode 100644 index 0000000..8fd6eaa --- /dev/null +++ b/RegShot/build/make_zip.bat @@ -0,0 +1,280 @@ +@ECHO OFF +rem ****************************************************************************** +rem * Copyright 2010-2011 XhmikosR +rem * +rem * This file is part of Regshot. +rem * +rem * Regshot is free software; you can redistribute it and/or modify +rem * it under the terms of the GNU General Public License as published by +rem * the Free Software Foundation; either version 2 of the License, or +rem * (at your option) any later version. +rem * +rem * Regshot is distributed in the hope that it will be useful, +rem * but WITHOUT ANY WARRANTY; without even the implied warranty of +rem * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +rem * GNU General Public License for more details. +rem * +rem * You should have received a copy of the GNU General Public License +rem * along with Regshot; if not, write to the Free Software +rem * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +rem * +rem * +rem * make_packages.bat +rem * Batch file for building Regshot with WDK and creating the zip packages +rem ****************************************************************************** + + +SETLOCAL +CD /D %~dp0 + + +rem Check for the help switches +IF /I "%~1" == "help" GOTO SHOWHELP +IF /I "%~1" == "/help" GOTO SHOWHELP +IF /I "%~1" == "-help" GOTO SHOWHELP +IF /I "%~1" == "--help" GOTO SHOWHELP +IF /I "%~1" == "/?" GOTO SHOWHELP + + +rem Check for the first switch +IF "%~1" == "" ( + SET INPUTDIRx86=bin\WDK\Release_Win32 + SET INPUTDIRx64=bin\WDK\Release_x64 + SET SUFFIX=_WDK +) ELSE ( + IF /I "%~1" == "WDK" ( + SET INPUTDIRx86=bin\WDK\Release_Win32 + SET INPUTDIRx64=bin\WDK\Release_x64 + SET SUFFIX=_WDK + GOTO START + ) + IF /I "%~1" == "/WDK" ( + SET INPUTDIRx86=bin\WDK\Release_Win32 + SET INPUTDIRx64=bin\WDK\Release_x64 + SET SUFFIX=_WDK + GOTO START + ) + IF /I "%~1" == "-WDK" ( + SET INPUTDIRx86=bin\WDK\Release_Win32 + SET INPUTDIRx64=bin\WDK\Release_x64 + SET SUFFIX=_WDK + GOTO START + ) + IF /I "%~1" == "--WDK" ( + SET INPUTDIRx86=bin\WDK\Release_Win32 + SET INPUTDIRx64=bin\WDK\Release_x64 + SET SUFFIX=_WDK + GOTO START + ) + IF /I "%~1" == "VS2010" ( + SET INPUTDIRx86=bin\VS2010\Release_Win32 + SET INPUTDIRx64=bin\VS2010\Release_x64 + SET SUFFIX=_VS2010 + GOTO START + ) + IF /I "%~1" == "/VS2010" ( + SET INPUTDIRx86=bin\VS2010\Release_Win32 + SET INPUTDIRx64=bin\VS2010\Release_x64 + SET SUFFIX=_VS2010 + GOTO START + ) + IF /I "%~1" == "-VS2010" ( + SET INPUTDIRx86=bin\VS2010\Release_Win32 + SET INPUTDIRx64=bin\VS2010\Release_x64 + SET SUFFIX=_VS2010 + GOTO START + ) + IF /I "%~1" == "--VS2010" ( + SET INPUTDIRx86=bin\VS2010\Release_Win32 + SET INPUTDIRx64=bin\VS2010\Release_x64 + SET SUFFIX=_VS2010 + GOTO START + ) + IF /I "%~1" == "VS2008" ( + SET INPUTDIRx86=bin\VS2008\Release_Win32 + SET INPUTDIRx64=bin\VS2008\Release_x64 + SET SUFFIX=_VS2008 + GOTO START + ) + IF /I "%~1" == "/VS2008" ( + SET INPUTDIRx86=bin\VS2008\Release_Win32 + SET INPUTDIRx64=bin\VS2008\Release_x64 + SET SUFFIX=_VS2008 + GOTO START + ) + IF /I "%~1" == "-VS2008" ( + SET INPUTDIRx86=bin\VS2008\Release_Win32 + SET INPUTDIRx64=bin\VS2008\Release_x64 + SET SUFFIX=_VS2008 + GOTO START + ) + IF /I "%~1" == "--VS2008" ( + SET INPUTDIRx86=bin\VS2008\Release_Win32 + SET INPUTDIRx64=bin\VS2008\Release_x64 + SET SUFFIX=_VS2008 + GOTO START + ) + IF /I "%~1" == "ICL12" ( + SET INPUTDIRx86=bin\ICL12\Release_Win32 + SET INPUTDIRx64=bin\ICL12\Release_x64 + SET SUFFIX=_ICL12 + GOTO START + ) + IF /I "%~1" == "/ICL12" ( + SET INPUTDIRx86=bin\ICL12\Release_Win32 + SET INPUTDIRx64=bin\ICL12\Release_x64 + SET SUFFIX=_ICL12 + GOTO START + ) + IF /I "%~1" == "-ICL12" ( + SET INPUTDIRx86=bin\ICL12\Release_Win32 + SET INPUTDIRx64=bin\ICL12\Release_x64 + SET SUFFIX=_ICL12 + GOTO START + ) + IF /I "%~1" == "--ICL12" ( + SET INPUTDIRx86=bin\ICL12\Release_Win32 + SET INPUTDIRx64=bin\ICL12\Release_x64 + SET SUFFIX=_ICL12 + GOTO START + ) + IF /I "%~1" == "GCC" ( + SET INPUTDIRx86=bin\GCC\Release_Win32 + SET INPUTDIRx64=bin\GCC\Release_x64 + SET SUFFIX=_GCC + GOTO START + ) + IF /I "%~1" == "/GCC" ( + SET INPUTDIRx86=bin\GCC\Release_Win32 + SET INPUTDIRx64=bin\GCC\Release_x64 + SET SUFFIX=_GCC + GOTO START + ) + IF /I "%~1" == "-GCC" ( + SET INPUTDIRx86=bin\GCC\Release_Win32 + SET INPUTDIRx64=bin\GCC\Release_x64 + SET SUFFIX=_GCC + GOTO START + ) + IF /I "%~1" == "--GCC" ( + SET INPUTDIRx86=bin\GCC\Release_Win32 + SET INPUTDIRx64=bin\GCC\Release_x64 + SET SUFFIX=_GCC + GOTO START + ) + + ECHO. + ECHO Unsupported commandline switch! + ECHO Run "%~nx0 help" for details about the commandline switches. + CALL :SUBMSG "ERROR" "Compilation failed!" +) + + +:START +SET "TEMP_NAME=temp_zip%SUFFIX%" + +IF NOT EXIST "..\%INPUTDIRx86%\Regshot.exe" CALL :SUBMSG "ERROR" "Compile Regshot Win32 first!" +IF NOT EXIST "..\%INPUTDIRx64%\Regshot.exe" CALL :SUBMSG "ERROR" "Compile Regshot x64 first!" + +CALL :SubGetVersion +CALL :SubZipFiles %INPUTDIRx86% Win32 +CALL :SubZipFiles %INPUTDIRx64% x64 + + +:END +TITLE Finished! +ECHO. +ENDLOCAL +PAUSE +EXIT /B + + +:SubZipFiles +TITLE Creating the %2 ZIP file... +CALL :SUBMSG "INFO" "Creating the %2 ZIP file..." + +IF EXIST "%TEMP_NAME%" RD /S /Q "%TEMP_NAME%" +IF NOT EXIST "%TEMP_NAME%" MD "%TEMP_NAME%" + +COPY /Y /V "..\gpl.txt" "%TEMP_NAME%\GPL.txt" +COPY /Y /V "..\files\history.txt" "%TEMP_NAME%\History.txt" +COPY /Y /V "..\files\language.ini" "%TEMP_NAME%\" +COPY /Y /V "..\files\readme.txt" "%TEMP_NAME%\Readme.txt" +COPY /Y /V "..\files\regshot.ini" "%TEMP_NAME%\" +COPY /Y /V "..\%1\Regshot.exe" "%TEMP_NAME%\" + +PUSHD "%TEMP_NAME%" +START "" /B /WAIT "..\..\files\7za.exe" a -tzip -mx=9 "Regshot_%REGSHOTVER%_%2%SUFFIX%.zip" >NUL +IF %ERRORLEVEL% NEQ 0 CALL :SUBMSG "ERROR" "Compilation failed!" + +CALL :SUBMSG "INFO" "Regshot_%REGSHOTVER%_%2%SUFFIX%.zip created successfully!" + +MOVE /Y "Regshot_%REGSHOTVER%_%2%SUFFIX%.zip" "..\" >NUL +POPD +IF EXIST "%TEMP_NAME%" RD /S /Q "%TEMP_NAME%" +EXIT /B + + +:SubGetVersion +rem Get the version +FOR /F "tokens=3,4 delims= " %%K IN ( + 'FINDSTR /I /L /C:"define REGSHOT_VERSION_MAJOR" "..\src\version.h"') DO ( + SET "VerMajor=%%K"&Call :SubVerMajor %%VerMajor:*Z=%%) +FOR /F "tokens=3,4 delims= " %%L IN ( + 'FINDSTR /I /L /C:"define REGSHOT_VERSION_MINOR" "..\src\version.h"') DO ( + SET "VerMinor=%%L"&Call :SubVerMinor %%VerMinor:*Z=%%) +FOR /F "tokens=3,4 delims= " %%M IN ( + 'FINDSTR /I /L /C:"define REGSHOT_VERSION_PATCH" "..\src\version.h"') DO ( + SET "VerBuild=%%M"&Call :SubVerBuild %%VerBuild:*Z=%%) +FOR /F "tokens=3,4 delims= " %%N IN ( + 'FINDSTR /I /L /C:"define REGSHOT_VERSION_REV" "..\src\version.h"') DO ( + SET "VerRev=%%N"&Call :SubVerRev %%VerRev:*Z=%%) + +SET REGSHOTVER=%VerMajor%.%VerMinor%.%VerBuild% +EXIT /B + + +:SubVerMajor +SET VerMajor=%* +EXIT /B + + +:SubVerMinor +SET VerMinor=%* +EXIT /B + + +:SubVerBuild +SET VerBuild=%* +EXIT /B + + +:SubVerRev +SET VerRev=%* +EXIT /B + + +:SHOWHELP +TITLE "%~nx0 %1" +ECHO. & ECHO. +ECHO Usage: %~nx0 [GCC^|ICL12^|VS2008^|VS2010^|WDK] +ECHO. +ECHO Notes: You can also prefix the commands with "-", "--" or "/". +ECHO The arguments are not case sensitive. +ECHO. & ECHO. +ECHO Executing "%~nx0" will use the defaults: "%~nx0 WDK" +ECHO. +ENDLOCAL +EXIT /B + + +:SUBMSG +ECHO. & ECHO ______________________________ +ECHO [%~1] %~2 +ECHO ______________________________ & ECHO. +IF /I "%~1"=="ERROR" ( + PAUSE + EXIT +) ELSE ( + EXIT /B +) diff --git a/RegShot/build/makefile.mak b/RegShot/build/makefile.mak new file mode 100644 index 0000000..9f17816 --- /dev/null +++ b/RegShot/build/makefile.mak @@ -0,0 +1,160 @@ +#****************************************************************************** +#* Copyright 2010-2011 XhmikosR +#* +#* This file is part of Regshot. +#* +#* Regshot is free software; you can redistribute it and/or modify +#* it under the terms of the GNU General Public License as published by +#* the Free Software Foundation; either version 2 of the License, or +#* (at your option) any later version. +#* +#* Regshot is distributed in the hope that it will be useful, +#* but WITHOUT ANY WARRANTY; without even the implied warranty of +#* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +#* GNU General Public License for more details. +#* +#* You should have received a copy of the GNU General Public License +#* along with Regshot; if not, write to the Free Software +#* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#* +#* +#* makefile.mak +#* makefile for building Regshot with WDK +#* +#* Use build_wdk.bat and set there your WDK directory. +#****************************************************************************** + + +# Remove the .SILENT directive in order to display all the commands +.SILENT: + + +CC = cl.exe +LD = link.exe +RC = rc.exe + +!IFDEF x64 +BINDIR = ..\bin\WDK\Release_x64 +!ELSE +BINDIR = ..\bin\WDK\Release_Win32 +!ENDIF +OBJDIR = $(BINDIR)\obj +EXE = $(BINDIR)\Regshot.exe +SRC = ..\src +RES = $(SRC)\res + + +DEFINES = /D "_WINDOWS" /D "NDEBUG" /D "_CRT_SECURE_NO_WARNINGS" /D "WDK_BUILD" +CFLAGS = /nologo /c /Fo"$(OBJDIR)/" /W3 /EHsc /MD /O2 /GL /MP $(DEFINES) +LDFLAGS = /NOLOGO /WX /INCREMENTAL:NO /RELEASE /OPT:REF /OPT:ICF /MERGE:.rdata=.text \ + /DYNAMICBASE /NXCOMPAT /LTCG /DEBUG +LIBS = advapi32.lib comdlg32.lib kernel32.lib shell32.lib user32.lib +RFLAGS = /l 0x0409 + + +!IFDEF x64 +CFLAGS = $(CFLAGS) /D "_WIN64" /D "_WIN32_WINNT=0x0502" +LIBS = $(LIBS) msvcrt_win2003.obj +LDFLAGS = $(LDFLAGS) /STACK:67108864 /SUBSYSTEM:WINDOWS,5.02 /MACHINE:X64 +RFLAGS = $(RFLAGS) /d "_WIN64" +!ELSE +CFLAGS = $(CFLAGS) /D "WIN32" /D "_WIN32_WINNT=0x0500" +LIBS = $(LIBS) msvcrt_win2000.obj +LDFLAGS = $(LDFLAGS) /STACK:33554432 /LARGEADDRESSAWARE /SUBSYSTEM:WINDOWS,5.0 /MACHINE:X86 +RFLAGS = $(RFLAGS) /d "WIN32" +!ENDIF + + +############### +## Targets ## +############### +BUILD: CHECKDIRS $(EXE) + +CHECKDIRS: + IF NOT EXIST "$(OBJDIR)" MD "$(OBJDIR)" + +CLEAN: + ECHO Cleaning... & ECHO. + IF EXIST "$(EXE)" DEL "$(EXE)" + IF EXIST "$(OBJDIR)\*.obj" DEL "$(OBJDIR)\*.obj" + IF EXIST "$(OBJDIR)\Regshot.res" DEL "$(OBJDIR)\Regshot.res" + IF EXIST "$(BINDIR)\Regshot.pdb" DEL "$(BINDIR)\Regshot.pdb" + -IF EXIST "$(OBJDIR)" RD /Q "$(OBJDIR)" + -IF EXIST "$(BINDIR)" RD /Q "$(BINDIR)" + +REBUILD: CLEAN BUILD + + +#################### +## Object files ## +#################### +OBJECTS= \ + $(OBJDIR)\fileshot.obj \ + $(OBJDIR)\language.obj \ + $(OBJDIR)\misc.obj \ + $(OBJDIR)\output.obj \ + $(OBJDIR)\regshot.obj \ + $(OBJDIR)\regshot.res \ + $(OBJDIR)\setup.obj \ + $(OBJDIR)\ui.obj \ + $(OBJDIR)\winmain.obj + + +################## +## Batch rule ## +################## +{$(SRC)}.c{$(OBJDIR)}.obj:: + $(CC) $(CFLAGS) /Tc $< + + +################ +## Commands ## +################ +$(EXE): $(OBJECTS) + $(RC) $(RFLAGS) /fo"$(OBJDIR)\regshot.res" "$(SRC)\regshot.rc" >NUL + $(LD) $(LDFLAGS) $(LIBS) $(OBJECTS) /OUT:"$(EXE)" + + +#################### +## Dependencies ## +#################### +$(OBJDIR)\fileshot.obj: \ + $(SRC)\fileshot.c \ + $(SRC)\global.h + +$(OBJDIR)\language.obj: \ + $(SRC)\language.c \ + $(SRC)\global.h + +$(OBJDIR)\misc.obj: \ + $(SRC)\misc.c \ + $(SRC)\global.h + +$(OBJDIR)\output.obj: \ + $(SRC)\output.c \ + $(SRC)\global.h + +$(OBJDIR)\regshot.obj: \ + $(SRC)\regshot.c \ + $(SRC)\global.h \ + $(SRC)\version.h + +$(OBJDIR)\regshot.res: \ + $(SRC)\regshot.rc \ + $(SRC)\resource.h \ + $(RES)\Regshot.exe.manifest \ + $(RES)\regshot.ico \ + $(SRC)\version.h + +$(OBJDIR)\setup.obj: \ + $(SRC)\setup.c \ + $(SRC)\global.h + +$(OBJDIR)\ui.obj: \ + $(SRC)\ui.c \ + $(SRC)\global.h + +$(OBJDIR)\winmain.obj: \ + $(SRC)\winmain.c \ + $(SRC)\global.h \ + $(SRC)\version.h diff --git a/RegShot/build/regshot_icl12.sln b/RegShot/build/regshot_icl12.sln new file mode 100644 index 0000000..a8d4eb3 --- /dev/null +++ b/RegShot/build/regshot_icl12.sln @@ -0,0 +1,26 @@ + +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio 2010 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "regshot", "regshot_icl12.vcxproj", "{4C971282-E758-4BA4-B2EF-905613EAADD8}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {4C971282-E758-4BA4-B2EF-905613EAADD8}.Debug|Win32.ActiveCfg = Debug|Win32 + {4C971282-E758-4BA4-B2EF-905613EAADD8}.Debug|Win32.Build.0 = Debug|Win32 + {4C971282-E758-4BA4-B2EF-905613EAADD8}.Debug|x64.ActiveCfg = Debug|x64 + {4C971282-E758-4BA4-B2EF-905613EAADD8}.Debug|x64.Build.0 = Debug|x64 + {4C971282-E758-4BA4-B2EF-905613EAADD8}.Release|Win32.ActiveCfg = Release|Win32 + {4C971282-E758-4BA4-B2EF-905613EAADD8}.Release|Win32.Build.0 = Release|Win32 + {4C971282-E758-4BA4-B2EF-905613EAADD8}.Release|x64.ActiveCfg = Release|x64 + {4C971282-E758-4BA4-B2EF-905613EAADD8}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/RegShot/build/regshot_icl12.vcxproj b/RegShot/build/regshot_icl12.vcxproj new file mode 100644 index 0000000..a1921cf --- /dev/null +++ b/RegShot/build/regshot_icl12.vcxproj @@ -0,0 +1,224 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {4C971282-E758-4BA4-B2EF-905613EAADD8} + Win32Proj + regshot + + + + Application + true + MultiByte + Intel C++ Compiler 12.1 + + + Application + true + MultiByte + Intel C++ Compiler 12.1 + + + Application + false + true + MultiByte + Intel C++ Compiler 12.1 + true + + + Application + false + true + MultiByte + Intel C++ Compiler 12.1 + true + + + + + + + + + + + + + + + + + + + true + ..\bin\ICL12\$(Configuration)_$(Platform)\ + ..\bin\ICL12\$(Configuration)_$(Platform)\obj\ + Regshot + false + + + true + ..\bin\ICL12\$(Configuration)_$(Platform)\ + ..\bin\ICL12\$(Configuration)_$(Platform)\obj\ + Regshot + false + + + false + ..\bin\ICL12\$(Configuration)_$(Platform)\ + ..\bin\ICL12\$(Configuration)_$(Platform)\obj\ + Regshot + false + + + false + ..\bin\ICL12\$(Configuration)_$(Platform)\ + ..\bin\ICL12\$(Configuration)_$(Platform)\obj\ + Regshot + false + + + + Level3 + Disabled + WIN32;_DEBUG;_WINDOWS + MultiThreadedDebug + ProgramDatabase + + + Windows + true + 33554432 + + + WIN32;%(PreprocessorDefinitions) + true + + + + + Level3 + Disabled + _WIN64;_DEBUG;_WINDOWS + MultiThreadedDebug + ProgramDatabase + + + Windows + true + 67108864 + + + _WIN64;%(PreprocessorDefinitions) + true + + + + + Level3 + MaxSpeedHighLevel + WIN32;NDEBUG;_WINDOWS;_CRT_SECURE_NO_WARNINGS + true + MultiThreaded + ProgramDatabase + true + true + Fast + AnySuitable + true + true + + + Windows + true + true + true + true + .rdata=.text + true + $(IntDir) + $(IntDir) + 33554432 + + + WIN32;%(PreprocessorDefinitions) + true + + + + + Level3 + MaxSpeedHighLevel + _WIN64;NDEBUG;_WINDOWS;_CRT_SECURE_NO_WARNINGS + true + MultiThreaded + ProgramDatabase + true + true + Fast + AnySuitable + true + true + + + Windows + true + true + true + .rdata=.text + true + $(IntDir) + $(IntDir) + 67108864 + + + _WIN64;%(PreprocessorDefinitions) + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/RegShot/build/regshot_icl12.vcxproj.filters b/RegShot/build/regshot_icl12.vcxproj.filters new file mode 100644 index 0000000..273ba69 --- /dev/null +++ b/RegShot/build/regshot_icl12.vcxproj.filters @@ -0,0 +1,66 @@ + + + + + {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 + + + + + Header Files + + + Header Files + + + + + Resource Files + + + + + Resource Files + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + + + Resource Files + + + \ No newline at end of file diff --git a/RegShot/build/regshot_vs2008.sln b/RegShot/build/regshot_vs2008.sln new file mode 100644 index 0000000..3812fa3 --- /dev/null +++ b/RegShot/build/regshot_vs2008.sln @@ -0,0 +1,26 @@ + +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual Studio 2008 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Regshot", "regshot_vs2008.vcproj", "{A7D5D156-E803-459D-B768-7EBBC5D09DC6}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {A7D5D156-E803-459D-B768-7EBBC5D09DC6}.Debug|Win32.ActiveCfg = Debug|Win32 + {A7D5D156-E803-459D-B768-7EBBC5D09DC6}.Debug|Win32.Build.0 = Debug|Win32 + {A7D5D156-E803-459D-B768-7EBBC5D09DC6}.Debug|x64.ActiveCfg = Debug|x64 + {A7D5D156-E803-459D-B768-7EBBC5D09DC6}.Debug|x64.Build.0 = Debug|x64 + {A7D5D156-E803-459D-B768-7EBBC5D09DC6}.Release|Win32.ActiveCfg = Release|Win32 + {A7D5D156-E803-459D-B768-7EBBC5D09DC6}.Release|Win32.Build.0 = Release|Win32 + {A7D5D156-E803-459D-B768-7EBBC5D09DC6}.Release|x64.ActiveCfg = Release|x64 + {A7D5D156-E803-459D-B768-7EBBC5D09DC6}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/RegShot/build/regshot_vs2008.vcproj b/RegShot/build/regshot_vs2008.vcproj new file mode 100644 index 0000000..24f3be3 --- /dev/null +++ b/RegShot/build/regshot_vs2008.vcproj @@ -0,0 +1,440 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/RegShot/build/regshot_vs2010.sln b/RegShot/build/regshot_vs2010.sln new file mode 100644 index 0000000..b731cda --- /dev/null +++ b/RegShot/build/regshot_vs2010.sln @@ -0,0 +1,26 @@ + +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio 2010 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Regshot", "regshot_vs2010.vcxproj", "{4C971282-E758-4BA4-B2EF-905613EAADD8}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {4C971282-E758-4BA4-B2EF-905613EAADD8}.Debug|Win32.ActiveCfg = Debug|Win32 + {4C971282-E758-4BA4-B2EF-905613EAADD8}.Debug|Win32.Build.0 = Debug|Win32 + {4C971282-E758-4BA4-B2EF-905613EAADD8}.Debug|x64.ActiveCfg = Debug|x64 + {4C971282-E758-4BA4-B2EF-905613EAADD8}.Debug|x64.Build.0 = Debug|x64 + {4C971282-E758-4BA4-B2EF-905613EAADD8}.Release|Win32.ActiveCfg = Release|Win32 + {4C971282-E758-4BA4-B2EF-905613EAADD8}.Release|Win32.Build.0 = Release|Win32 + {4C971282-E758-4BA4-B2EF-905613EAADD8}.Release|x64.ActiveCfg = Release|x64 + {4C971282-E758-4BA4-B2EF-905613EAADD8}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/RegShot/build/regshot_vs2010.vcxproj b/RegShot/build/regshot_vs2010.vcxproj new file mode 100644 index 0000000..3a7bb40 --- /dev/null +++ b/RegShot/build/regshot_vs2010.vcxproj @@ -0,0 +1,203 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {4C971282-E758-4BA4-B2EF-905613EAADD8} + Win32Proj + Regshot + + + + Application + true + MultiByte + + + Application + true + MultiByte + + + Application + false + true + MultiByte + + + Application + false + true + MultiByte + + + + + + + + + + + + + + + + + + + true + ..\bin\VS2010\$(Configuration)_$(Platform)\ + ..\bin\VS2010\$(Configuration)_$(Platform)\obj\ + Regshot + false + + + true + ..\bin\VS2010\$(Configuration)_$(Platform)\ + ..\bin\VS2010\$(Configuration)_$(Platform)\obj\ + Regshot + false + + + false + ..\bin\VS2010\$(Configuration)_$(Platform)\ + ..\bin\VS2010\$(Configuration)_$(Platform)\obj\ + Regshot + false + + + false + ..\bin\VS2010\$(Configuration)_$(Platform)\ + ..\bin\VS2010\$(Configuration)_$(Platform)\obj\ + Regshot + false + + + + Level4 + Disabled + WIN32;_DEBUG;_WINDOWS;_CRT_SECURE_NO_WARNINGS + MultiThreadedDebug + ProgramDatabase + true + false + + + Windows + true + 33554432 + + + WIN32;%(PreprocessorDefinitions) + + + + + Level4 + Disabled + _WIN64;_DEBUG;_WINDOWS;_CRT_SECURE_NO_WARNINGS + MultiThreadedDebug + ProgramDatabase + true + false + + + Windows + true + 67108864 + + + _WIN64;%(PreprocessorDefinitions) + + + + + Level3 + MaxSpeed + WIN32;NDEBUG;_WINDOWS;_CRT_SECURE_NO_WARNINGS + true + MultiThreaded + ProgramDatabase + + + Windows + true + true + true + true + .rdata=.text + true + 33554432 + + + WIN32;%(PreprocessorDefinitions) + + + + + Level3 + MaxSpeed + _WIN64;NDEBUG;_WINDOWS;_CRT_SECURE_NO_WARNINGS + true + MultiThreaded + ProgramDatabase + + + Windows + true + true + true + .rdata=.text + true + 67108864 + + + _WIN64;%(PreprocessorDefinitions) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/RegShot/build/regshot_vs2010.vcxproj.filters b/RegShot/build/regshot_vs2010.vcxproj.filters new file mode 100644 index 0000000..c0bba02 --- /dev/null +++ b/RegShot/build/regshot_vs2010.vcxproj.filters @@ -0,0 +1,69 @@ + + + + + {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 + + + + + Header Files + + + Header Files + + + Header Files + + + + + Resource Files + + + + + Resource Files + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + + + Resource Files + + + \ No newline at end of file diff --git a/RegShot/gpl.txt b/RegShot/gpl.txt new file mode 100644 index 0000000..48807be --- /dev/null +++ b/RegShot/gpl.txt @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/RegShot/language.ini b/RegShot/language.ini new file mode 100644 index 0000000..ac88f55 --- /dev/null +++ b/RegShot/language.ini @@ -0,0 +1,1424 @@ +[Current] +Current=English + +[English] +1=Keys: +2=Values: +3=Dirs: +4=Files: +5=Time: +6=Keys added: +7=Keys deleted: +8=Values added: +9=Values deleted: +10=Values modified: +11=Files added: +12=Files deleted: +13=Files [attributes?] modified: +14=Folders added: +15=Folders deleted: +16=Folders attributes changed: +17=Total changes: +18=Comments: +19=Datetime: +20=Computer: +21=Username: +22=About +23=Error +24=Error call External Viewer! +25=Error creating file! +26=Error open file! +27=Error move file pointer! +28=&1st shot +29=&2nd shot +30=C&ompare +31=&Clear +32=&Quit +33=&About +34=&Monitor.. +35=Compare logs save as: +36=Output path: +37=Add comment into the log: +38=Plain &TXT +39=&HTML document +40=&Scan dir1[;dir2;dir3;...;dir nn]: +41=&Shot +42=Shot and Sa&ve... +43=Loa&d... +44=&Clear All +45=Clear &1st shot +46=Clear &2nd shot + +[Espaol] +Translator=[FESTL] Freelance English-Spanish Technical Localizations +1=Claves: +2=Valores: +3=Directorios: +4=Archivos: +5=Tiempo: +6=Claves aadidas: +7=Claves borradas: +8=Valores aadidos: +9=Valores borrados: +10=Valores modificados: +11=Archivos aadidos: +12=Archivos borrados: +13=Atributos de archivo modificados: +14=Carpetas aadidas: +15=Carpetas borradas: +16=Atributos de carpeta modificados: +17=Total de cambios: +18=Comentarios: +19=Fecha y hora: +20=Computador: +21=Usuario: +22=Sobre +23=Error +24=Error al llamar visor externo! +25=Error al crear archivo! +26=Error al abrir archivos! +27=Error al mover puntero de archivo! +28=&1er. Foto +29=&2da. Foto +30=C&omparar +31=&Limpiar +32=S&alir +33=&Sobre +34=&Monitor.. +35=Comparar logs guardados como: +36=Ruta de salida: +37=Aadir comentario al log: +38=&Texto +39=Documento &HTML +40=&Escanear dir1[;dir2;...;dir nn] +41=&Foto +42=Foto + &guardar... +43=&Cargar... +44=&Limpiar +45=Limpiar &1er. Foto +46=Limpiar &2da. Foto + +[Russian] +Translator=Mikhail A.Medvedev +1=: +2=: +3=: +4=: +5=: +6= : +7= : +8= : +9= : +10= : +11= : +12= : +13= []: +14= : +15= : +16= []: +17= : +18=: +19= : +20= : +21= : +22= +23= +24= ! +25= ! +26= ! +27=Error move file pointer! +28=&1 +29=&2 +30=& +31=& +32=& +33= & +34=&... +35= : +36= : +37= : +38=& +39=& HTML +40=& 1[;dir2;...;dir nn]: +41=& +42= + &... +43=&... +44=& +45= &1 +46= &2 + +[Franais] +Translator=Marcel Drappier - Charles Fitoussi +1=Cls : +2=Valeurs : +3=Dirs : +4=Fichiers : +5=Temps : +6=Cls ajoutes : +7=Cls effaces : +8=Valeurs ajoutes : +9=Valeurs effaces : +10=Valeurs modifies : +11=Fichiers ajouts : +12=Fichiers effacs : +13=Fichiers [attributs ?] modifis : +14=Dossiers ajouts : +15=Dossiers effacs : +16=Attributs de dossiers modifis : +17=Nombre de modifications : +18=Commentaires : +19=Dates & Heures : +20=Ordinateur : +21=Utilisateur : +22=A propos de RegShot +23=Erreur +24=Erreur d'appel du programme de visualisation externe ! +25=Erreur en crant le fichier ! +26=Erreur d'ouverture du fichier ! +27=Erreur de dplacement du pointeur de fichier ! +28=&1er clich +29=&2me clich +30=C&omparer +31=Effa&cer +32=&Quitter +33=&A propos... +34=&Moniteur... +35=Sauver les comparaisons comme : +36=Rpertoire de sauvegarde : +37=Commentaire additionnel : +38=Fichier &Txt +39=Document &Html +40=&Scan dir1[;dir2;...;dir n] : +41=&Clich +42=Clich + &Sauvegarde... +43=Char&ger... +44=Effa&cer tout +45=Effacer &1er clich +46=Effacer &2me clich + +[GB] +Translator=!!! +1=: +2=ֵ: +3=Ŀ¼: +4=ļ: +5=ʱ: +6=Ӽ: +7=ɾ: +8=ֵ: +9=ɾֵ: +10=޸ֵ: +11=ļ: +12=ļɾ: +13=ļ޸: +14=Ŀ¼: +15=Ŀ¼ɾ: +16=Ŀ¼޸: +17=ܼ: +18=Ҫע: +19=ʱ: +20=: +21=ʹ: +22= +23= +24=޷ⲿ! +25=޷ļ! +26=޷ļ! +27=޷ƶļָ! +28=ȡ[&1] +29=ȡ[&2] +30=Ƚ[&O] +31=[&C] +32=˳[&Q] +33=[&A] +34=[&M].. +35=Ƚϼ¼Ϊ: +36=·: +37=ڼ¼ļע: +38=&TXT ĵ +39=&HTML ĵ +40=ɨ[&S] dir1[;dir2;...dir nn]: +41=ȡ[&S] +42=ȡ浵[&V]... +43=ᵵ[&D]... +44=ȫ[&C] +45=ȡ1[&1] +46=ȡ2[&2] + +[Big5] +Translator=!!! +1=: +2=: +3=ؿ: +4=: +5=ɶ: +6=W[: +7=R: +8=W[: +9=R: +10=ק: +11=W[: +12=R: +13=ק: +14=ؿW[: +15=ؿR: +16=ؿݩʭק: +17=`p: +18=nI`: +19=ɶ: +20=pW: +21=ϥΪ̦W: +22=_ +23=~ +24=LkեΥ~su! +25=LkЫؤ! +26=Lk}! +27=Lkʤw! +28=[&1] +29=[&2] +30=[&O] +31=M[&C] +32=hX[&Q] +33=_[&A] +34=ʱ[&M].. +35=Ots: +36=X|: +37=bO󤺲K[`: +38=&TXT +39=&HTML +40=y[&S] dir1[;dir2;...dir nn]: +41=[&S] +42=}s[&V]... +43=[&D]... +44=M[&C] +45=M1[&1] +46=M2[&2] + +[Norsk] +Translator=Kenneth Aarseth +1=Nkler: +2=Verdier: +3=Mapper: +4=Filer: +5=Tid: +6=Nkler lagt til: +7=Slettede nkler: +8=Verdier lagt til: +9=Slettede verdier: +10=Forandrede verdier: +11=Fil lagt til: +12=Slettede filer: +13=Filer [engenskaper] forandret: +14=Mapper lagt til: +15=Mapper slettet: +16=Mappe egenskaper forandret: +17=Antall endringer: +18=Kommentarer: +19=Dato tid: +20=Maskin navn: +21=Brukernavn: +22=Om +23=Error +24=Error call External Viewer! +25=Error creating file! +26=Error open file! +27=Error move file pointer! +28=F&ste sk +29=A&ndre sk +30=&Sammenlign +31=&Tilbakestill +32=&Avslutt +33=&Om Regshot +34=Over&vk.. +35=Lagre logg som: +36=Logg fil plassering: +37=Legg til en kommentar: +38=&Ren tekst +39=&Web format +40=S?k mappe1[;mappe2;osv]: +41=&Sk +42=Sk and La&gre... +43=Loa&d... +44=&Tilbakestill +45=Tilbakestill F&ste sk +46=Tilbakestill A&ndre sk + +[Italiano] +Translator=Vittorio +1=Chiave: +2=Valore: +3=Dir: +4=File: +5=Tempo: +6=Chiave aggiunta: +7=Chiave cancellata: +8=Valore aggiunto: +9=Valore cancellato: +10=Valore modificato: +11=File aggiunto: +12=File cancellato: +13=File [attributi?] modificato: +14=Cartella aggiunta: +15=Cartella cancellata: +16=Attributi cambiati nella cartella: +17=Variazioni totali: +18=Commenti: +19=Dataora: +20=Computer: +21=Username: +22=About +23=Error +24=Error call External Viewer! +25=Error creating file! +26=Error open file! +27=Error move file pointer! +28=&1st shot +29=&2nd shot +30=C&onfronta +31=&Pulisci +32=&Esci +33=&Info +34=&Monitor.. +35=Confronta il log salvato come: +36=Directory di destinazione: +37=Aggiungi commenti nel log: +38=File &TXT +39=&Documento HTML +40=&Scan dir1[;dir2;...;dir nn]: +41=&Shot +42=Shot and Sa&lva... +43=Loa&d... +44=&Pulisci +45=Pulisci &1st shot +46=Pulisci &2nd shot + +[Deutsch] +Translator=Gnatix & AVE7 +1=Schlssel: +2=Werte: +3=Ordner: +4=Dateien: +5=Zeit: +6=Schlssel hinzugefgt: +7=Schlssel gelscht: +8=Werte hinzugefgt: +9=Werte gelscht: +10=Werte gendert: +11=Dateien hinzugefgt: +12=Dateien gelscht: +13=Dateiattribute gendert: +14=Ordner hinzugefgt: +15=Ordner gelscht: +16=Ordnerattribute gendert: +17=Gesamte nderungen: +18=Kommentar: +19=Datum und Zeit: +20=Computer: +21=Benutzername: +22=ber +23=Fehler +24=Fehler beim Starten von externem Viewer! +25=Fehler beim Erstellen von Datei! +26=Fehler beim ffnen von Dateien! +27=Fehler beim Verschieben von Dateizeiger! +28=&1. Schu +29=&2. Schu +30=&Vergleichen +31=&Leeren +32=&Beenden +33=be&r +34=ber&wachen.. +35=Speichern Vergleichslogdatei als: +36=Ausgabepfad: +37=Kommentar in Logdatei hinzufgen: +38=&TXT Datei +39=&HTML Datei +40=&Scannen dir1[;dir2;...;dir nn]: +41=&Schu +42=Schu + Spei&chern... +43=La&den... +44=&Leeren +45=Leeren &1. Schu +46=Leeren &2. Schu + +[Trke] +Translator=Murat KASABOGLU +1=Anahtar: +2=Deerler: +3=Klasrler: +4=Dosyalar: +5=Sre: +6=Anahtarlar eklenmi? +7=Anahtarlar silinmi? +8=Deerler eklenmi? +9=Deerler silinmi? +10=Deerler deitirilmi? +11=Dosyalar?eklenmi? +12=Dosyalar?silinmi? +13=Dosyalarn zellikleri deitirilmi? +14=Klasrler eklenmi? +15=Klasrler silinmi? +16=Klasrlerin zellikleri deitirilmi? +17=Tm deiiklikler: +18=Aklamalar: +19=Zaman: +20=Bilgisayar: +21=Kullanc? +22=Hakknda +23=Hata +24=Hata harici gstericinin arlmasnda olutu +25=Hata dosya yaratlamad? +26=Hata dosya alamad? +27=Hata dosya gstergesinin tanmasnda olutu +28=&1. kayt +29=&2. kayt +30=&Karlatrma +31=&Temizle +32=&k +33=&Hakknda +34=T&akip.. +35=Karlatrmay?kaydet: +36=Kayt yeri: +37=Yaplan kayda, aklama ekle: +38=&Dz Metin +39=&HTML dosyas +40=&Klasr tara; kls1[;kls2;kls nn]: +41=&Gzle +42=Gzle &ve Kaydet... +43=&Ykle +44=T&emizle +45=1. G?zlemi temizle +46=2. Gz&lemi temizle + +[Nederlands] +Translator=Paul Lowagie +1=Sleutels: +2=Waarden: +3=Mappen: +4=Bestanden: +5=Tijd: +6=Sleutels toegevoegd: +7=Sleutels verwijderd: +8=Waarden toegevoegd: +9=Waarden verwijderd: +10=Waarden gewijzigd: +11=Bestanden toegevoegd: +12=Bestanden verwijderd: +13=Bestanden (kenmerken?) gewijzigd: +14=Mappen toegevoegd: +15=Mappen verwijderd: +16=Mapkemmerken gewijzigd: +17=Totaal aantal wijzigingen: +18=Commentaar: +19=Datum & tijd: +20=Computer: +21=Gebruikersnaam: +22=Info +23=Fout +24=Fout bij starten externe kijker! +25=Fout bij creren bestand! +26=Fout bij openen regshot.vxd! +27=Fout bij bestandtoewijzing! +28=&1ste opname +29=&2de opname +30=V&ergelijken +31=&Wissen +32=&Afsluiten +33=&Info +34=&Monitor.. +35=Vergelijking opslaan als +36=Uitvoerpad: +37=Commentaar toevoegen in logbestand: +38=Platte &TXT +39=&HTML document +40=&Scan map1[;map2;...;map nn]: +41=&Opnemen +42=Opnemen en bewa&ren... +43=Lade&n... +44=&Alles wissen +45=Wissen &1ste opname +46=Wissen &2de opname + +[esky] +Translator=ondra +1=Kl? +2=Hodnot: +3=Adres? +4=Soubor? +5=as: +6=Kl?pidno: +7=Kl?vymazno: +8=Hodnot pidno: +9=Hodnot vymazno: +10=Hodnot zmnno: +11=Soubor?pidno: +12=Soubor?vymazno: +13=Soubor?[atribut?] zmnno: +14=Sloek pidno: +15=Sloek vymazno: +16=Atribut?sloek zmnno: +17=Celkem zmn: +18=Komente: +19=Datum&as: +20=Pota? +21=Jmno uivatele: +22=O programu +23=Chyba +24=Chyba pi spoutn?externho prohlee! +25=Chyba pi tvorb?souboru! +26=Chyba pi otevrn?souboru! +27=Error move file pointer! +28=&1. zznam +29=&2. zznam +30=P&orovnat +31=&Vymazat +32=&Konec +33=&O programu +34=&Monitor.. +35=Zznam o porovnn?uloit jako: +36=Pracovn?adres: +37=Pidat koment do zznamu: +38=&TXT +39=&HTML +40=Sl&oky: adr1[;...;adr nn]: +41=&Vytvoit +42=Vytvoit a ul&oit... +43=N&ast... +44=Vym&azat ve +45=Vymazat &1. zznam +46=Vymazat &2. zznam + +[Catal] +Translator=Pau Bosch i Crespo PauBCrespo@hotmail.com. Visiteu: www.all4you.dk si voleu ms programes gratuts en catal. +1=Claus: +2=Valors: +3=Directoris: +4=Arxius: +5=Temps: +6=Claus afegides: +7=Claus esborrades: +8=Valors afegits: +9=Valors esborrats: +10=Valors modificats: +11=Arxius afegits: +12=Arxius esborrats: +13=Atributs modificats d'arxiu: +14=Carpetes afegides: +15=Carpetes esborrades: +16=Atributs modificats de carpeta: +17=Total de canvis: +18=Comentaris: +19=Data i hora: +20=Ordinador: +21=Usuari: +22=Sobre +23=Error +24=Error en connectar amb el visualitzador extern! +25=Error en crear arxiu! +26=Error en obrir arxius! +27=Error en moure cursor d'arxiu! +28=&1r. Tret +29=&2n. Tret +30=C&ompara +31=&Neteja +32=S&urt +33=&Sobre +34=&Monitor.. +35=Compara registres desats com a: +36=Ruta de sortida: +37=Afegeix comentari al registre: +38=&Text +39=Document &HTML +40=&Escaneja dir1[;dir2;...;dir nn] +41=&Dispara +42=Dispara i &desa... +43=&Carrega... +44=&Neteja +45=Neteja &1r Tret +46=Neteja &2n Tret + +[] +Translator=Michael Papadakis +1=: +2=: +3=: +4=: +5=: +6= : +7= : +8= : +9= : +10= : +11= : +12= : +13= () : +14= : +15= : +16= () : +17= : +18=: +19=/: +20=: +21=: +22= +23= +24= Viewer! +25= ! +26= ! +27= ! +28=&1 +29=&2 +30=& +31=& +32=& +33=& +34=&.. +35= : +36= : +37= : +38= &TXT +39= &HTML +40= &1(;2;...): +41=& +42= &... +43=&... +44=& +45= &1 +46= &2 + +[Dansk] +Translator=Per Bryldt +1=Ngler: +2=Vrdier: +3=Mapper: +4=Filer: +5=Tid: +6=Ngler lagt til: +7=Slettede ngler: +8=Vrdier lagt til: +9=Slettede vrdier: +10=Forandrede vrdier: +11=Fil lagt til: +12=Slettede filer: +13=Filer [egenskaber] forandret: +14=Mapper lagt til: +15=Mapper slettet: +16=Mappe egenskaber forandret: +17=Antal ndringer: +18=Kommentarer: +19=Dato tid: +20=Computer navn: +21=Brugernavn: +22=Om +23=Fejl +24=Fejl bner External Viewer! +25=Fejl oprettelse af fil! +26=Fejl ben fil! +27=Fejl flyt fil pointer! +28=F&ste sgning +29=A&nden sgning +30=&Sammenlign +31=&Fortryd +32=&Afslut +33=&Om Regshot +34=Over&vg.. +35=Gemmer log som: +36=Log fil placering: +37=Tilfj en kommentar: +38=&Ren tekst +39=&Html format +40=Sg mappe1[;mappe2;osv]: +41=&Sg +42=Sg og G&em... +43=He&nt... +44=&Fortryd +45=Fortryd F&ste sgning +46=Fortryd A&nden sgning + +[Latvieu] +Translator=Armands Radzuka +1=Atslgas: +2=Vrtbas: +3=Mapes: +4=Faili: +5=Laiks: +6=Pievienots atslgas: +7=Dzsts atslgas: +8=Pievienots vrtbas: +9=Dzsts vrtbas: +10=Prveidots vrtbas: +11=Pievienotie faili: +12=Dzstie faili: +13=Prveidotie faili [atribti?]: +14=Pievienots mapes: +15=Dzsts mapes: +16=Prveidotie mapju atribti: +17=Kop izmaias: +18=Komentri: +19=Datums, laiks: +20=Dators: +21=Lietotjs: +22=Par +23=Kda +24=Kda izsaucot rjo apskattju! +25=Kda izveidojot failu! +26=Kda atverot failu! +27=Kda prveidojot faila rdtju! +28=&1. viens +29=&2. viens +30=&Saldzint +31=&Dzst +32=&Beigt +33=&Par +34=&Novrot.. +35=Saldzinanas protokolus saglabt k: +36=Izejas ce: +37=Pievienot komentru protokolam: +38=&Tekstu +39=&HTML dokumentu +40=&Skant mapi1[;mapi2;...]: +41=&viens +42=aut un sa&glabt... +43=Iel&dt... +44=&Dzst visu +45=Dzst &1. vienu +46=Dzst &2. vienu + + +[Portuguese] +Translator=Leandro +1=Chaves: +2=Valores: +3=Diretrios: +4=Arquivos: +5=Tempo: +6=Chaves adicionadas: +7=Chaves apagadas: +8=Valores adicionados: +9=Valores apagados: +10=Valores modificados: +11=Arquivos adicionados: +12=Arquivos apagados: +13=Arquivos [atributos?] modificados: +14=Pastas adicionadas: +15=Pastas apagadas: +16=Atributos de pastas alterados: +17=Total de alteraes: +18=Comentrios: +19=Dia/hora: +20=Computador: +21=Usurio: +22=Sobre +23=Erro +24=Erro ao chamar visualizador externo! +25=Erro ao criar arquivo! +26=Erro ao abrir arquivo! +27=Erro ao mover o ponteiro do arquivo! +28=&1 foto +29=&2 foto +30=&Comparar +31=&Limpar +32=Sai&r +33=&Sobre +34=&Monitor... +35=Salvar notas comparadas como: +36=Destino: +37=Adicionar comentrio em nota: +38=&Texto +39=&HTML +40=&Pesquisar diretrio: +41=&Fotografar +42=Fotografar e &salvar... +43=&Carregar... +44=&Limpar tudo +45=Apagar &1 foto +46=Apagar &2 foto + +[Slovensk] +Translator=Roland Turcan (regshot@rotursoft.sk) +1=Klvesy: +2=Hodnoty: +3=Prieinky: +4=Sbory: +5=as: +6=Ke pridan: +7=Ke zmazan: +8=Hodnoty pridan: +9=Hodnoty zmazan: +10=Hodnoty zmenen: +11=Sbory pridan: +12=Sbory zmazan: +13=Sbory [atribty?] zmenen: +14=Prieinky pridan: +15=Prieinky zmazan: +16=Atribty prieinkov zmenen: +17=Spolu zmien: +18=Komentre: +19=Dtum/as: +20=Pota: +21=Uvate: +22=O programe +23=Chyba +24=Chyba pri volan externho prehliadaa! +25=Chyba pri vytvran sboru! +26=Chyba pri otvoren sboru! +27=Chyba pri presvan ukazovatea v sbore! +28=&1. zznam +29=&2. zznam +30=P&orovnaj +31=&Vyma +32=&Koniec +33=&O Programe +34=&Monitor.. +35=Porovnaj zznamy a ulo ako: +36=Vstup ulo do: +37=Pridaj komentr do zznamu: +38=ist &TXT +39=&HTML dokument +40=&Hadaj dir1[;dir2;...;dir nn]: +41=&Zznam +42=Zaznamenaj a ulo... +43=Nataj... +44=&Vyma vetko +45=Vyma &1. zznam +46=Vyma &2. zznam + +[{] +Translator=Kentaro Okude +1=Keys: +2=Values: +3=Dirs: +4=Files: +5=Time: +6=ljꂽWXgL[: +7=폜ꂽWXgL[: +8=ljꂽl: +9=폜ꂽl: +10=ύX̂l: +11=ljꂽt@C: +12=폜ꂽt@C: +13=iHjύX̂t@C: +14=ljꂽtH_: +15=폜ꂽtH_: +16=ύX̂tH_: +17=S̕ύX: +18=Rg: +19=: +20=Rs[^: +21=[U[l[: +22=About +23=G[ +24=֘AtꂽvONł܂łB +25=t@C쐬ł܂łB +26=t@CJ炯܂łB +27=t@C|C^[𓮂܂łB +28=P +29=Q +30=r +31= +32=‚ +33=About +34=Ď +35=O̕ۑ`: +36=ۑ: +37=OɃRg}: +38=Text +39=HTML +40=ĎtH_: +41=sI +42=sZ[u +43=[h +44=ׂď +45=Pڂ̃O +46=Qڂ̃O + +[Polski] +Translator=Adam Mikusiski +1=Klucze: +2=Wartoci: +3=Katalogi: +4=Pliki: +5=Czas: +6=Klucze dodane: +7=Klucze usunite: +8=Wartoci dodane: +9=Wartoci usunite: +10=Wartoci zmodyfikowane: +11=Pliki dodane: +12=Pliki usunite: +13=Pliki [atrybuty?] zmodyfikowane: +14=Katalogi dodane: +15=Katalogi usunite: +16=Zmienione atrybuty katalogw: +17=Wszystkie zmiany: +18=Komentarze: +19=Data i godzina: +20=Komputer: +21=Nazwa uytkownika: +22=O programie +23=Bd +24=Bd wywoania przegldarki zewntrznej! +25=Bd tworzenia pliku! +26=Bd otwarcia pliku! +27=Bd przesunicia wskanika pliku! +28=Zdjcie &1 +29=Zdjcie &2 +30=&Porwnaj +31=W&yma +32=&Wyjcie +33=&O programie +34=&Monitor.. +35=Zapisz porwnanie rejestru jako: +36=Katalog docelowy: +37=Dodaj komentarz do rejestru: +38=&TXT +39=Dokument &HTML +40=&Skanuj kat1[;kat2;...;kat nn]: +41=&Zdjcie +42=Zdjcie + Za&pis... +43=W&czytaj... +44=W&yma wszystko +45=Wyma zdjcie &1 +46=Wyma zdjcie &2 + +[Serbian] +Translator=Computer Wizard +1=Kljuevi: +2=Vrednosti: +3=Direktorijumi: +4=Fajlovi: +5=Vreme: +6=Dodato kljuceva: +7=Obrisano kljuceva: +8=Dodato vrednosti: +9=Izbrisano vrednosti: +10=Izmenjeno vrednosti: +11=Dodato fajlova: +12=Izbrisano fajlova: +13=Fajlova [atributa?] izmenjeno: +14=Dodato foldera: +15=Izbrisano foldera: +16=Promenjeno atributa foldera: +17=Ukupno promena: +18=Komanda: +19=Datum i vreme: +20=Kompjuter: +21=Korisnicko ime: +22=O programu +23=Greka +24=Greka pri pozivanju eksternog viewer-a! +25=Greka pri kreiranju fajla! +26=Greka pri otvaranju fajla! +27=Greka pri promeni pokazivaa fajla! +28=&Prvi snimak +29=&Drugi snimak +30=&Uporedi +31=O&brii +32=&Izlaz +33=&O programu +34=&Monitor... +35=Rezultat poreenja snimi kao: +36=Izlazna putanja: +37=Dodaj komentar u log: +38=&Tekst +39=&HTML dokument +40=&Skeniraj dir1[;dir2;...;dir nn]: +41=&Snimi +42=Snimi i sauvaj na &disku... +43=&Uitaj... +44=&Obrii sve +45=Obrii prvi snimak +46=Obrii drugi snimak + +[Hebrew-] +Translator=Jack Gorji-[' ']-Email:zakgj@hotmail.com +1=: +2=: +3=: +4=: +5=-Time: +6= : +7= : +8= : +9= : +10= : +11= : +12= : +13= : +14= : +15= : +16= : +17=" : +18=: +19= : +20= : +21= : +22=& +23= +24= ! +25= ! +26= ! +27= ! +28=& '1 +29=& '2 +30=& +31=& +32=& +33=& +34= +35= +36= : +37= : +38=Plain &TXT +39=&HTML document +40=& dir1[;dir2;...;dir nn]: +41=& +42= ... +43=... +44= & +45= & +46= & + +[Galego] +Translator=Xos Antn Vicente Rodrguez (antonvicente@navegalia.com) +1=Claves: +2=Valores: +3=Directorios: +4=Arquivos: +5=Tempo: +6=Claves engadidas: +7=Claves borradas: +8=Valores engadidos: +9=Valores borrados: +10=Valores modificados: +11=Arquivos engadidos: +12=Arquivos borrados: +13=Atributos de arquivo modificados: +14=Cartafois engadidos: +15=Cartafois borrados: +16=Atributos de cartafol modificados: +17=Total de trocos: +18=Comentarios: +19=Data e hora: +20=Computador: +21=Usuario: +22=Sobre +23=Erro +24=Erro ao chamar a un visor externo! +25=Erro ao crear arquivo! +26=Erro ao abrir arquivos! +27=Erro ao mover punteiro de arquivo! +28=&1ra. Foto +29=&2da. Foto +30=C&omparar +31=&Limpar +32=S&ar +33=&Sobre +34=&Monitor.. +35=Comparar logs gardados como: +36=Ruta de sada: +37=Engadir comentario ao log: +38=&Texto +39=Documento &HTML +40=&Escanear dir1[;dir2;...;dir nn] +41=&Foto +42=Foto + &gardar... +43=&Cargar... +44=&Limpar +45=Limpar &1ra. Foto +46=Limpar &2da. Foto + +[Hrvatski] +Translator=Obelix (JK875@yahoo.cu.uk) +1=Kljuevi: +2=Vrijednosti: +3=Direktoriji: +4=Datoteke: +5=Vrijeme: +6=Dodano kljuceva: +7=Brisano kljuceva: +8=Dodano vrijednosti: +9=Brisano vrijednosti: +10=Izmijenjeno vrijednosti: +11=Dodano datoteka: +12=Izbrisano datoteka: +13=Datoteka [atributa?] izmijenjeno: +14=Dodano pod_direktorija: +15=Brisano pod_direktorija: +16=Promijenjeno atributa pod_direktorija: +17=Ukupno promjena: +18=Komanda: +19=Datum i vrijeme: +20=Kompjutor: +21=Korisniko ime: +22=O programu +23=Greka +24=Greka pri pozivanju vanjskog preglednika! +25=Greka pri kreiranju datoteke! +26=Greka pri otvaranju datoteke! +27=Greka pri promjeni pokazivaa datoteke! +28=&Prvi snimak +29=&Drugi snimak +30=&Usporedi +31=&Brii +32=&Izlaz +33=&O programu +34=&Monitor... +35=Rezultat usporedbe spremi kao: +36=Izlazna putanja: +37=Dodaj komentar u log: +38=&Tekst +39=&HTML dokument +40=&Pretrai dir1[;dir2;...;dir nn]: +41=&Snimi +42=Snimi i spremi na &disk... +43=&Uitaj... +44=&Bbrii sve +45=Brii prvi snimak +46=Brii drugi snimak + +[Bulgarian] +Translator=Alex Simidchiev +1=: +2=: +3=: +4=: +5=: +6= : +7= : +8= : +9= : +10= : +11= : +12= : +13= []: +14= : +15= : +16= []: +17= : +18=: +19= : +20= : +21= : +22= +23= +24= ! +25= ! +26= ! +27=Error move file pointer! +28=&1 +29=&2 +30=& +31=& +32=& +33=& +34=&... +35= : +36= : +37= : +38=& +39=& HTML +40=& [dir1;dir2;...;dir nn]: +41=& +42= + ... +43=&... +44=& +45= &1 +46= &2 + +[Svenska] +Translator=joup@algonet.se +1=Nycklar: +2=Vrden: +3=Kataloger: +4=Filer: +5=Tid: +6=Adderade nycklar: +7=Borttagna nycklar: +8=Adderade vrden: +9=Borttagna vrden: +10=ndrade vrden: +11=Adderade filer: +12=Borttagna filer: +13=ndrade filer [attribut?]: +14=Adderade kataloger: +15=Borttagna kataloger: +16=ndrade katalogattribut: +17=Totala ndringar: +18=Kommentarer: +19=Datum/tid: +20=Dator: +21=Anvndarnamn: +22=Om +23=Fel +24=Fel vid anrop av extern filvisare! +25=Kunde inte skapa fil! +26=Kunde inte ppna fil! +27=Fel vid flyttning av filpekare! +28=&1:a tagningen +29=&2:a tagningen +30=&Jmfr +31=&Tm +32=A&vsluta +33=&Om Regshot +34=&Bevaka.. +35=Jmfrelselog sparas som: +36=Mlkatalog: +37=Lgg till kommentar i loggen: +38=Ren &TXT +39=&HTMLdokument +40=&Scanna dir1[;dir2;...;dir nn]: +41=&Shot +42=Shot och spa&ra... +43=Ls &in... +44=&Tm allt +45=Tm &1:a tagningen +46=Tm &2:a tagningen + +[Hungarian] +Translator=Bata Gyrgy +1=Kulcsok: +2=rtkek: +3=Mappk: +4=Fjlok: +5=Id: +6=Hozzadott rendszerler kulcsok: +7=Trlt rendszerler kulcsok: +8=Hozzadott rendszerler rtkek: +9=Trlt rendszerler rtkek: +10=Mdostott rendszerler rtkek: +11=Hozzadott fjlok: +12=Trlt fjlok: +13=Mdostott fjlok [attribtumok]: +14=Hozzadott mappk: +15=Trlt mappk: +16=Mdostott mappa attribtumok: +17=sszes vltozs: +18=Megjegyzs: +19=Dtum s id: +20=Szmtgp: +21=Felhasznlnv: +22=Nvjegy +23=Hiba +24=Hiba a kls szerkeszt meghvsakor! +25=Hiba a fjl ltrehozsakor! +26=Hiba a fjl megnyitsakor! +27=Hiba a fjlmutat mozgatsakor! +28=&1. Minta +29=&2. Minta +30=&sszevets +31=&Trls +32=&Kilps +33=&Nvjegy +34=Figy&els... +35=Naplfjl formtuma: +36=Eredmny mentse ide: +37=Megjegyzs a naplfjlban, fjlnv: +38=T&XT fjl +39=&HTML fjl +40=&Figyelt mappk [a;b;c;...]: +41=&Vizsglat +42=Vizsglat s &ments... +43=&Betlts... +44=&Mind trlse +45=&1. Minta trlse +46=&2. Minta trlse + +[] +Translator=Dmitry P. +1=: +2=: +3=: +4=: +5=: +6= : +7= : +8= : +9= : +10= : +11= : +12= : +13= []: +14= : +15= : +16= []: +17= : +18=: +19= : +20=' ': +21=' : +22= +23= +24= ! +25= ! +26= ! +27=Error move file pointer! +28=1 +29=2 +30= +31= +32= +33= +34= +35= : +36= : +37= : +38= +39= HTML +40= 1[;dir2;...]: +41= +42= + ... +43=³... +44= +45= 1 +46= 2 + +[Kazakh] +Translator= +1=: +2=: +3=: +4=: +5=: +6= : +7=f o: +8= : +9=f : +10= : +11= : +12=f : +13= []: +14= : +15=f : +16= []: +17= : +18= : +19=ff : +20= : +21= : +22=C +23= +24= ! +25= ! +26= ! +27=Error move file pointer! +28=&1 +29=&2 +30=& +31=& +32=&f +33=&C +34=&... +35= : +36= : +37= : +38=& +39=&HTML +40=& 1[;dir2;...;dir nn]: +41=& +42= + &... +43=&... +44=& +45= &1 +46= &2 + diff --git a/RegShot/regshot.exe b/RegShot/regshot.exe new file mode 100644 index 0000000000000000000000000000000000000000..3e9527b98c06d4ccc503eb976ac50c61b849cc4d GIT binary patch literal 107008 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 literal 0 HcmV?d00001 diff --git a/RegShot/src/182to183/align.c b/RegShot/src/182to183/align.c new file mode 100644 index 0000000..44e4fcd --- /dev/null +++ b/RegShot/src/182to183/align.c @@ -0,0 +1,123 @@ +/* + Copyright 2011 Regshot Team + + Regshot is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + Regshot is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Regshot; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "global.h" + +//-------------------------------------------------- +// Realign key & value content after loading from hive file +//-------------------------------------------------- +VOID ReAlignReg(LPKEYCONTENT lpKey, size_t nBase) +{ + LPVALUECONTENT lpv; + + if (lpKey->lpkeyname != NULL) { + lpKey->lpkeyname += nBase; + } + if (lpKey->lpfirstvalue != NULL) { + lpKey->lpfirstvalue = (LPVALUECONTENT)((LPBYTE)lpKey->lpfirstvalue + nBase); + } + if (lpKey->lpfirstsubkey != NULL) { + lpKey->lpfirstsubkey = (LPKEYCONTENT)((LPBYTE)lpKey->lpfirstsubkey + nBase); + } + if (lpKey->lpbrotherkey != NULL) { + lpKey->lpbrotherkey = (LPKEYCONTENT)((LPBYTE)lpKey->lpbrotherkey + nBase); + } + if (lpKey->lpfatherkey != NULL) { + lpKey->lpfatherkey = (LPKEYCONTENT)((LPBYTE)lpKey->lpfatherkey + nBase); + } + + + for (lpv = lpKey->lpfirstvalue; lpv != NULL; lpv = lpv->lpnextvalue) { + + if (lpv->lpvaluename != NULL) { + lpv->lpvaluename += nBase; + } + if (lpv->lpvaluedata != NULL) { + lpv->lpvaluedata += nBase; + } + if (lpv->lpnextvalue != NULL) { + lpv->lpnextvalue = (LPVALUECONTENT)((LPBYTE)lpv->lpnextvalue + nBase); + } + if (lpv->lpfatherkey != NULL) { + lpv->lpfatherkey = (LPKEYCONTENT)((LPBYTE)lpv->lpfatherkey + nBase); + } + + } + + if (lpKey->lpfirstsubkey != NULL) { + ReAlignReg(lpKey->lpfirstsubkey, nBase); + } + + if (lpKey->lpbrotherkey != NULL) { + ReAlignReg(lpKey->lpbrotherkey, nBase); + } +} + + +//-------------------------------------------------- +// Realign filecontent, called by ReAlignFile() +//-------------------------------------------------- +VOID ReAlignFileContent(LPFILECONTENT lpFC, size_t nBase) +{ + + if (lpFC->lpfilename != NULL) { + lpFC->lpfilename += nBase; + } + if (lpFC->lpfirstsubfile != NULL) { + lpFC->lpfirstsubfile = (LPFILECONTENT)((LPBYTE)lpFC->lpfirstsubfile + nBase); + } + if (lpFC->lpbrotherfile != NULL) { + lpFC->lpbrotherfile = (LPFILECONTENT)((LPBYTE)lpFC->lpbrotherfile + nBase); + } + if (lpFC->lpfatherfile != NULL) { + lpFC->lpfatherfile = (LPFILECONTENT)((LPBYTE)lpFC->lpfatherfile + nBase); + } + + + if (lpFC->lpfirstsubfile != NULL) { + ReAlignFileContent(lpFC->lpfirstsubfile, nBase); + } + + if (lpFC->lpbrotherfile != NULL) { + ReAlignFileContent(lpFC->lpbrotherfile, nBase); + } + +} + + +//-------------------------------------------------- +// Realign file, walk through chain +//-------------------------------------------------- +VOID ReAlignFile(LPHEADFILE lpHF, size_t nBase) +{ + LPHEADFILE lphf; + + for (lphf = lpHF; lphf != NULL; lphf = lphf->lpnextheadfile) { + + if (lphf->lpnextheadfile != NULL) { + lphf->lpnextheadfile = (LPHEADFILE)((LPBYTE)lphf->lpnextheadfile + nBase); + } + if (lphf->lpfilecontent != NULL) { + lphf->lpfilecontent = (LPFILECONTENT)((LPBYTE)lphf->lpfilecontent + nBase); + } + + if (lphf->lpfilecontent != NULL) { // I wouldn't find crash bug(loadhive->readfile) in 1.8.0 if I had added it in that version + ReAlignFileContent(lphf->lpfilecontent, nBase); + } + } +} diff --git a/RegShot/src/182to183/global.h b/RegShot/src/182to183/global.h new file mode 100644 index 0000000..80ec9d6 --- /dev/null +++ b/RegShot/src/182to183/global.h @@ -0,0 +1,158 @@ +/* + Copyright 2011 Regshot Team + + Regshot is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + Regshot is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Regshot; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include +#include +#include + +#define REGSHOT_HIVE_SIGNATURE_182 "REGSHOTHIVE" +#define REGSHOT_HIVE_SIGNATURE "RSHIVE183" + +#define HIVEBEGINOFFSET 512 // Hive file out put header computerlen*2+sizeof(systemtime)+32 must lpkeyname) + 1; // Get len+1 + nPad = (nLenPlus1 % sizeof(DWORD) == 0) ? 0 : (sizeof(DWORD) - nLenPlus1 % sizeof(DWORD)); + nFPHeader = SetFilePointer(hFileWholeReg, 0, NULL, FILE_CURRENT); // Save head fp + + // using struct ,idea from maddes + skc.fpos_keyname = nFPHeader + sizeof(SAVEKEYCONTENT); + skc.fpos_firstvalue = (lpKeyContent->lpfirstvalue != NULL) ? (nFPHeader + sizeof(SAVEKEYCONTENT) + nLenPlus1 + nPad) : 0; + skc.fpos_firstsubkey = 0; // it is filled later. + skc.fpos_brotherkey = 0; // it is filled later + skc.fpos_fatherkey = nFPCurrentFatherKey; + skc.bkeymatch = 0; + WriteFile(hFileWholeReg, &skc, sizeof(skc), &NBW, NULL); + + WriteFile(hFileWholeReg, lpKeyContent->lpkeyname, nLenPlus1, &NBW, NULL); // Save the current keyname + + nFPTemp4Write = 0; + if (nPad > 0) { + WriteFile(hFileWholeReg, &nFPTemp4Write, nPad, &NBW, NULL); + } + + + // Save the sub-value of current KeyContent + for (lpv = lpKeyContent->lpfirstvalue; lpv != NULL; lpv = lpv->lpnextvalue) { + + nLenPlus1 = (DWORD)strlen(lpv->lpvaluename) + 1; + nPad = (nLenPlus1 % sizeof(DWORD) == 0) ? 0 : (sizeof(DWORD) - nLenPlus1 % sizeof(DWORD)); // determine if pad to 4bytes is needed + nPad1 = (lpv->datasize % sizeof(DWORD) == 0) ? 0 : (sizeof(DWORD) - lpv->datasize % sizeof(DWORD)); + + nFPCurrent = SetFilePointer(hFileWholeReg, 0, NULL, FILE_CURRENT); // Save fp + svc.typecode = lpv->typecode; + svc.datasize = lpv->datasize; + svc.fpos_valuename = nFPCurrent + sizeof(SAVEVALUECONTENT); // size must same for valuecontent and savevaluecontent + svc.fpos_valuedata = (lpv->datasize > 0) ? (nFPCurrent + sizeof(SAVEVALUECONTENT) + nLenPlus1 + nPad) : 0; // if no lpvaluedata, we write 0 + svc.fpos_nextvalue = (lpv->lpnextvalue != NULL) ? (nFPCurrent + sizeof(SAVEVALUECONTENT) + nLenPlus1 + nPad + lpv->datasize + nPad1) : 0; // if no nextvalue we write 0 + svc.fpos_fatherkey = nFPHeader; + svc.bvaluematch = 0; + WriteFile(hFileWholeReg, &svc, sizeof(svc), &NBW, NULL); + + + WriteFile(hFileWholeReg, lpv->lpvaluename, nLenPlus1, &NBW, NULL); // Save lpvaluename + + nFPTemp4Write = 0; + if (nPad > 0) { + WriteFile(hFileWholeReg, &nFPTemp4Write, nPad, &NBW, NULL); + } + + if (lpv->datasize > 0) { + WriteFile(hFileWholeReg, lpv->lpvaluedata, lpv->datasize, &NBW, NULL); // Save lpvaluedata + + if (nPad1 > 0) { + WriteFile(hFileWholeReg, &nFPTemp4Write, nPad1, &NBW, NULL); + } + } + + } + + if (lpKeyContent->lpfirstsubkey != NULL) { + // pass this keycontent's position as subkey's fatherkey's position and pass the "lpfirstsubkey field" + SaveRegKey(lpKeyContent->lpfirstsubkey, nFPHeader, nFPHeader + 2 * sizeof(DWORD)); + } + + if (lpKeyContent->lpbrotherkey != NULL) { + // pass this key's fatherkey's position as brother's father and pass "lpbrotherkey field" + SaveRegKey(lpKeyContent->lpbrotherkey, nFPCurrentFatherKey, nFPHeader + 3 * sizeof(DWORD)); + } + + if (nFPCaller > 0) { // save position of current key in current father key + nFPCurrent = SetFilePointer(hFileWholeReg, 0, NULL, FILE_CURRENT); + SetFilePointer(hFileWholeReg, nFPCaller, NULL, FILE_BEGIN); + WriteFile(hFileWholeReg, &nFPHeader, sizeof(nFPHeader), &NBW, NULL); + SetFilePointer(hFileWholeReg, nFPCurrent, NULL, FILE_BEGIN); + } + +} + +//-------------------------------------------------- +// File save engine (It is stupid again!) added in 1.8 +// 1.8.3 changed some struct +// modi 20111216 +//-------------------------------------------------- +VOID SaveFileContent(LPFILECONTENT lpFileContent, DWORD nFPCurrentFatherFile, DWORD nFPCaller) +{ + + DWORD nFPTemp4Write; + DWORD nFPHeader; + DWORD nFPCurrent; + DWORD nLenPlus1; + int nPad; + + nLenPlus1 = (DWORD)strlen(lpFileContent->lpfilename) + 1; // Get len+1 + nFPHeader = SetFilePointer(hFileWholeReg, 0, NULL, FILE_CURRENT); // Save head fp + // using struct, idea from maddes + sfc.fpos_filename = nFPHeader + sizeof(SAVEFILECONTENT); // 1.8.3 11*4 former is 10*4+1 + sfc.writetimelow = lpFileContent->writetimelow; + sfc.writetimehigh = lpFileContent->writetimehigh; + sfc.filesizelow = lpFileContent->filesizelow; + sfc.filesizehigh = lpFileContent->filesizehigh; + sfc.fileattr = lpFileContent->fileattr; + sfc.cksum = lpFileContent->cksum; + sfc.fpos_firstsubfile = 0; + sfc.fpos_brotherfile = 0; + sfc.fpos_fatherfile = nFPCurrentFatherFile; + sfc.bfilematch = 0; + WriteFile(hFileWholeReg, &sfc, sizeof(sfc), &NBW, NULL); + + WriteFile(hFileWholeReg, lpFileContent->lpfilename, nLenPlus1, &NBW, NULL); // Save the current filename + + nPad = (nLenPlus1 % sizeof(DWORD) == 0) ? 0 : (sizeof(DWORD) - nLenPlus1 % sizeof(DWORD)); + + nFPTemp4Write = 0; + if (nPad > 0) { + WriteFile(hFileWholeReg, &nFPTemp4Write, nPad, &NBW, NULL); // Save the current filename + } + + if (lpFileContent->lpfirstsubfile != NULL) { + // pass this filecontent's position as subfile's fatherfile's position and pass the "lpfirstsubfile field" + SaveFileContent(lpFileContent->lpfirstsubfile, nFPHeader, nFPHeader + 7 * sizeof(DWORD)); + } + + if (lpFileContent->lpbrotherfile != NULL) { + // pass this file's fatherfile's position as brother's father and pass "lpbrotherfile field" + SaveFileContent(lpFileContent->lpbrotherfile, nFPCurrentFatherFile, nFPHeader + 8 * sizeof(DWORD)); + } + + if (nFPCaller > 0) { // save position of current file in current father file + nFPCurrent = SetFilePointer(hFileWholeReg, 0, NULL, FILE_CURRENT); + SetFilePointer(hFileWholeReg, nFPCaller, NULL, FILE_BEGIN); + WriteFile(hFileWholeReg, &nFPHeader, sizeof(nFPHeader), &NBW, NULL); + SetFilePointer(hFileWholeReg, nFPCurrent, NULL, FILE_BEGIN); + } + +} + +//--------------------------------------------------------------------------------- +// Load registry from HIVE file (After this, we should realign the data in memory) +//--------------------------------------------------------------------------------- +BOOL LoadHive(LPCSTR lpFileName, LPKEYCONTENT FAR *lplpKeyHLM, LPKEYCONTENT FAR *lplpKeyUSER, + LPHEADFILE FAR *lplpHeadFile) +{ + DWORD nFileSize; + DWORD nOffSet = 0; + size_t nBase; + DWORD i, j; + DWORD nRemain; + DWORD nReadSize; + BOOL bRet = FALSE; + LPBYTE lpHive; + + hFileWholeReg = CreateFile(lpFileName, GENERIC_READ , FILE_SHARE_READ , NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + if (hFileWholeReg != INVALID_HANDLE_VALUE) { + lpHive = MYALLOC0(16); + ReadFile(hFileWholeReg, lpHive, 16, &NBW, NULL); + + if (strcmp(str_RegshotHiveSignature182, (const char *)(lpHive)) != 0) { + printf("Error:Does not detect regshot_hive_signagure used by version <=1.8.2"); //changed in 1.8.3 + bRet = FALSE; + } else { + nFileSize = GetFileSize(hFileWholeReg, NULL); + MYFREE(lpHive); + + lpHive = MYALLOC(nFileSize); + nBase = (size_t) lpHive; + lpOldHiveHeader = lpHive; + + ReadFile(hFileWholeReg, &nOffSet, 4, &NBW, NULL); + *lplpKeyHLM = (LPKEYCONTENT)(nBase + nOffSet); + + ReadFile(hFileWholeReg, &nOffSet, 4, &NBW, NULL); + *lplpKeyUSER = (LPKEYCONTENT)(nBase + nOffSet); + + ReadFile(hFileWholeReg, &nOffSet, 4, &NBW, NULL); + if (nOffSet == 0) { + *lplpHeadFile = NULL; + } else { + *lplpHeadFile = (LPHEADFILE)(nBase + nOffSet); + } + + SetFilePointer(hFileWholeReg, 0, NULL, FILE_BEGIN); + +#define READ_BATCH_SIZE 8192 + + printf("Reading %s....", lpFileName); + for (i = 0, j = 0, nRemain = nFileSize;; i += READ_BATCH_SIZE, j++) { + if (nRemain >= READ_BATCH_SIZE) { + nReadSize = READ_BATCH_SIZE; + } else { + nReadSize = nRemain; + } + ReadFile(hFileWholeReg, (lpHive) + i, nReadSize, &NBW, NULL); // read the whole file now + if (NBW != nReadSize) { + printf("Reading ERROR!"); + break; + } + nRemain -= nReadSize; + if (nRemain == 0) { + break; + } + + } +#undef READ_BATCH_SIZE + + ReAlignReg(*lplpKeyHLM, nBase); + ReAlignReg(*lplpKeyUSER, nBase); + + if (*lplpHeadFile != NULL) { + ReAlignFile(*lplpHeadFile, nBase); + } + + bRet = TRUE; + + } + CloseHandle(hFileWholeReg); + } else { + printf("Error:Can not open file!\n"); + bRet = FALSE; + } + + return(bRet); + +} + + +//-------------------------------------------------- +// Routine to call registry save engine and file save engine +//-------------------------------------------------- +BOOL SaveHive(LPCSTR lpFileName, LPKEYCONTENT lpKeyHLM, LPKEYCONTENT lpKeyUSER, + LPHEADFILE lpHF) +{ + DWORD nFPcurrent; + DWORD nFPcurrent1; + DWORD nFPTemp4Write; + BOOL bRet; + LPHEADFILE lphf; + + bRet = FALSE; + + if (lpKeyHLM != NULL || lpKeyUSER != NULL) { + + hFileWholeReg = CreateFile(lpFileName, GENERIC_WRITE, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL); + if (hFileWholeReg != INVALID_HANDLE_VALUE) { + + WriteFile(hFileWholeReg, str_RegshotHiveSignature183, sizeof(str_RegshotHiveSignature183) - 1, &NBW, NULL); + + // 0 signature( <= 12) last 4 bytes may be used in furture + // 16 startoflpkeyhlm (512) + // 20 startoflpkeyuser(???) + // 24 fileheadchain begin (new) ->(file -> nextfilehead(4) next4bytes is filecontent) added in 1.8 + // 28 future use! + // 32 computer name + // 96 username + // 160 systemtime + + // Save the position of H_L_M + nFPcurrent = HIVEBEGINOFFSET; // computerlen*2+sizeof(systemtime)+32 must lpfilecontent, 0, 0); + nFPcurrent1 = SetFilePointer(hFileWholeReg, 0, NULL, FILE_CURRENT); + nFPTemp4Write = nFPcurrent1; + SetFilePointer(hFileWholeReg, nFPcurrent, NULL, FILE_BEGIN); + lphf = lphf->lpnextheadfile; + if (lphf != NULL) { + WriteFile(hFileWholeReg, &nFPTemp4Write, sizeof(nFPTemp4Write), &NBW, NULL); + } else { + nFPTemp4Write = 0; + WriteFile(hFileWholeReg, &nFPTemp4Write, sizeof(nFPTemp4Write), &NBW, NULL); + break; + } + SetFilePointer(hFileWholeReg, nFPcurrent1, NULL, FILE_BEGIN); + } + } + + CloseHandle(hFileWholeReg); + printf("\nDone.\n"); + bRet = TRUE; + } else { + printf("Error:Can not create file!\n"); + bRet = FALSE; + } + + } + return bRet; +} diff --git a/RegShot/src/182to183/main.c b/RegShot/src/182to183/main.c new file mode 100644 index 0000000..17e4477 --- /dev/null +++ b/RegShot/src/182to183/main.c @@ -0,0 +1,41 @@ +/* + Copyright 2011 Regshot Team + + Regshot is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + Regshot is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Regshot; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "global.h" + +int main(int argc, char *argv[]) +{ +#ifdef _WIN64 + printf("Cannot be compiled as 64bit program.\n"); + return 1; +#else + printf("Regshot hive file transfer program version 1.8.3beta1V4\n\ +Transfer hive file used in <= 1.8.2 to new structure used in 1.8.3\n\ +Usage: 182to183 infile.hiv outfile.hiv\n\n"); + if (argc < 3) { + printf("[X] Need input and output filenames!\n"); + return 1; + } + if (LoadHive(argv[1], &lpHeadLocalMachine, &lpHeadUsers, &lpHeadFile) != TRUE) { + return 1; + } + SaveHive(argv[2], lpHeadLocalMachine, lpHeadUsers, lpHeadFile); + + return 0; +#endif +} diff --git a/RegShot/src/Makefile b/RegShot/src/Makefile new file mode 100644 index 0000000..d6480f6 --- /dev/null +++ b/RegShot/src/Makefile @@ -0,0 +1,120 @@ +#****************************************************************************** +#* Copyright 2011 XhmikosR +#* +#* This file is part of Regshot. +#* +#* Regshot is free software; you can redistribute it and/or modify +#* it under the terms of the GNU General Public License as published by +#* the Free Software Foundation; either version 2 of the License, or +#* (at your option) any later version. +#* +#* Regshot is distributed in the hope that it will be useful, +#* but WITHOUT ANY WARRANTY; without even the implied warranty of +#* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +#* GNU General Public License for more details. +#* +#* You should have received a copy of the GNU General Public License +#* along with Regshot; if not, write to the Free Software +#* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#* +#* +#* makefile +#* makefile for building Regshot with GCC +#* +#****************************************************************************** + + +CC=gcc.exe + +all:.all +distclean: clean + +#DEBUG=yes +#64BIT=yes + +ifeq ($(64BIT),yes) + MY_PREFIX=x86_64-w64-mingw32- + CFLAGS=-DWIN64 -D_WIN64 -D_WIN32_WINNT=0x0502 + OPTFLAGS=-O3 -m64 + STACK_SIZE=67108864 +else + CFLAGS=-DWIN32 -D_WIN32 -D_WIN32_WINNT=0x0500 + OPTFLAGS=-O3 -march=i686 -msse -mfpmath=sse + STACK_SIZE=33554432 +endif + +ifeq ($(DEBUG),yes) + CFLAGS+=-DDEBUG -D_DEBUG -g +else + CFLAGS+=-DNDEBUG -UDEBUG +endif + +SRCS_C=\ + fileshot.c \ + language.c \ + misc.c \ + output.c \ + regshot.c \ + setup.c \ + ui.c \ + winmain.c + +RESSRC=regshot.rc + +TARGET_DIR=../bin/GCC/ + +ifeq ($(DEBUG),yes) + MY_DIR_PREFIX=Debug +else + MY_DIR_PREFIX=Release +endif + +ifeq ($(64BIT),yes) + MY_ARCH=x64 +else + MY_ARCH=Win32 +endif + +OBJ_DIR=$(TARGET_DIR)$(MY_DIR_PREFIX)_$(MY_ARCH)/obj/ + +OUTFLAGS=-MMD -o\ + +TARGET_EXE=$(TARGET_DIR)$(MY_DIR_PREFIX)_$(MY_ARCH)/Regshot.exe + + +# Targets + +.all: outdirs $(TARGET_EXE) + +.PHONY: outdirs $(OBJ_DIR) +outdirs: $(OBJ_DIR) +$(OBJ_DIR): + $(shell test -d $(@) || mkdir -p $(@)) + + +.PHONY: clean +clean: + rm -f $(TARGET_EXE) + rm -r -f $(OBJ_DIR) + + +# Commands + +OBJS+=$(SRCS_C:%.c=$(OBJ_DIR)%.o) $(RESSRC:%.rc=$(OBJ_DIR)%.res.o) + +$(OBJ_DIR)%.o: %.c + @echo $< + @$(MY_PREFIX)$(CC) -c $(CFLAGS) $(OPTFLAGS) $(OUTFLAGS) $@ $< + +$(OBJ_DIR)%.res.o: %.rc + @echo $< + @$(MY_PREFIX)windres -o $@ $< + +$(TARGET_EXE): $(OBJS) + @echo $@ + @$(MY_PREFIX)$(CC) -mwindows -Wl,--stack=$(STACK_SIZE) -o $@ $(OBJS) +ifneq ($(DEBUG),yes) + @$(MY_PREFIX)strip $@ +endif + +-include $(SRCS_C:%.c=$(OBJ_DIR)%.d) diff --git a/RegShot/src/fileshot.c b/RegShot/src/fileshot.c new file mode 100644 index 0000000..b7d1d6c --- /dev/null +++ b/RegShot/src/fileshot.c @@ -0,0 +1,586 @@ +/* + Copyright 1999-2003,2007,2011 TiANWEi + Copyright 2004 tulipfan + Copyright 2011 maddes + + This file is part of Regshot. + + Regshot is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + Regshot is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Regshot; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "global.h" +// ISDIR, ISFILE added in 1.8.0 +#define ISDIR(x) ( (x&FILE_ATTRIBUTE_DIRECTORY) != 0 ) +#define ISFILE(x) ( (x&FILE_ATTRIBUTE_DIRECTORY) == 0 ) + +SAVEFILECONTENT sFC; + + +extern LPBYTE lan_dir; +extern LPBYTE lan_file; + + +//------------------------------------------------------------- +// Routine to get Whole File Name[root dir] from a FILECONTENT +//------------------------------------------------------------- +LPSTR GetWholeFileName(LPFILECONTENT lpFileContent) +{ + LPFILECONTENT lpf; + LPSTR lpName; + LPSTR lptail; + size_t nLen = 0; + + for (lpf = lpFileContent; lpf != NULL; lpf = lpf->lpfatherfile) { + nLen += strlen(lpf->lpfilename) + 1; + } + if (nLen == 0) { + nLen++; + } + lpName = MYALLOC(nLen); + + lptail = lpName + nLen - 1; + *lptail = 0x00; + + for (lpf = lpFileContent; lpf != NULL; lpf = lpf->lpfatherfile) { + nLen = strlen(lpf->lpfilename); + memcpy(lptail -= nLen, lpf->lpfilename, nLen); + if (lptail > lpName) { + *--lptail = '\\'; // 0x5c; + } + } + return lpName; +} + + +//------------------------------------------------------------- +// Routine to walk through all sub tree of current directory [File system] +//------------------------------------------------------------- +VOID GetAllSubFile( + BOOL needbrother, + DWORD typedir, + DWORD typefile, + LPDWORD lpcountdir, + LPDWORD lpcountfile, + LPFILECONTENT lpFileContent +) +{ + //LPSTR lpTemp; + + if (ISDIR(lpFileContent->fileattr)) { + //lpTemp = lpFileContent->lpfilename; + if (strcmp(lpFileContent->lpfilename, ".") != 0 && strcmp(lpFileContent->lpfilename, "..") != 0) { // tfx added in 1.7.3 fixed at 1.8.0 we should add here 1.8.0 + //if (*(unsigned short *)lpTemp != 0x002E && !(*(unsigned short *)lpTemp == 0x2E2E && *(lpTemp + 2) == 0x00)) { // 1.8.2 + LogToMem(typedir, lpcountdir, lpFileContent); + } + } else { + LogToMem(typefile, lpcountfile, lpFileContent); + } + + if (lpFileContent->lpfirstsubfile != NULL) { + GetAllSubFile(TRUE, typedir, typefile, lpcountdir, lpcountfile, lpFileContent->lpfirstsubfile); + } + if (needbrother == TRUE) { + if (lpFileContent->lpbrotherfile != NULL) { + GetAllSubFile(TRUE, typedir, typefile, lpcountdir, lpcountfile, lpFileContent->lpbrotherfile); + } + } + + +} + + +//------------------------------------------------------------ +// File Shot Engine +//------------------------------------------------------------ +VOID GetFilesSnap(LPFILECONTENT lpFatherFile) +{ + LPSTR lpFilename; + LPSTR lpTemp; + HANDLE filehandle; + WIN32_FIND_DATA finddata; + LPFILECONTENT lpFileContent; + LPFILECONTENT lpFileContentTemp; + + lpTemp = GetWholeFileName(lpFatherFile); + //Not used + //if (bWinNTDetected) + //{ + // lpFilename = MYALLOC(strlen(lpTemp) + 5 + 4); + // strcpy(lpFilename,"\\\\?\\"); + // strcat(lpFilename,lpTemp); + //} + //else + { + lpFilename = MYALLOC(strlen(lpTemp) + 5); + strcpy(lpFilename, lpTemp); + } + strcat(lpFilename, "\\*.*"); + + MYFREE(lpTemp); + //_asm int 3; + filehandle = FindFirstFile(lpFilename, &finddata); + MYFREE(lpFilename); + if (filehandle == INVALID_HANDLE_VALUE) { + return; + } + + //lpTemp = finddata.cFileName; // 1.8 + + lpFileContent = MYALLOC0(sizeof(FILECONTENT)); + lpFileContent->lpfilename = MYALLOC0(strlen(finddata.cFileName) + 1); // must add one! + strcpy(lpFileContent->lpfilename, finddata.cFileName); + lpFileContent->writetimelow = finddata.ftLastWriteTime.dwLowDateTime; + lpFileContent->writetimehigh = finddata.ftLastWriteTime.dwHighDateTime; + lpFileContent->filesizelow = finddata.nFileSizeLow; + lpFileContent->filesizehigh = finddata.nFileSizeHigh; + lpFileContent->fileattr = finddata.dwFileAttributes; + lpFileContent->lpfatherfile = lpFatherFile; + lpFatherFile->lpfirstsubfile = lpFileContent; + lpFileContentTemp = lpFileContent; + + if (ISDIR(lpFileContent->fileattr)) { + if (strcmp(lpFileContent->lpfilename, ".") != 0 && strcmp(lpFileContent->lpfilename, "..") != 0 + && !IsInSkipList(lpFileContent->lpfilename, lplpFileSkipStrings)) { // tfx + + nGettingDir++; + GetFilesSnap(lpFileContent); + } + } else { + nGettingFile++; + } + + + for (; FindNextFile(filehandle, &finddata) != FALSE;) { + lpFileContent = MYALLOC0(sizeof(FILECONTENT)); + lpFileContent->lpfilename = MYALLOC0(strlen(finddata.cFileName) + 1); + strcpy(lpFileContent->lpfilename, finddata.cFileName); + lpFileContent->writetimelow = finddata.ftLastWriteTime.dwLowDateTime; + lpFileContent->writetimehigh = finddata.ftLastWriteTime.dwHighDateTime; + lpFileContent->filesizelow = finddata.nFileSizeLow; + lpFileContent->filesizehigh = finddata.nFileSizeHigh; + lpFileContent->fileattr = finddata.dwFileAttributes; + lpFileContent->lpfatherfile = lpFatherFile; + lpFileContentTemp->lpbrotherfile = lpFileContent; + lpFileContentTemp = lpFileContent; + + if (ISDIR(lpFileContent->fileattr)) { + if (strcmp(lpFileContent->lpfilename, ".") != 0 && strcmp(lpFileContent->lpfilename, "..") != 0 + && !IsInSkipList(lpFileContent->lpfilename, lplpFileSkipStrings)) { // tfx + nGettingDir++; + GetFilesSnap(lpFileContent); + } + } else { + nGettingFile++; + } + + } + FindClose(filehandle); + + nGettingTime = GetTickCount(); + if ((nGettingTime - nBASETIME1) > REFRESHINTERVAL) { + UpdateCounters(lan_dir, lan_file, nGettingDir, nGettingFile); + } + + return ; +} + + +//------------------------------------------------------------- +// File comparison engine (lp1 and lp2 run parallel) +//------------------------------------------------------------- +VOID CompareFirstSubFile(LPFILECONTENT lpHead1, LPFILECONTENT lpHead2) +{ + LPFILECONTENT lp1; + LPFILECONTENT lp2; + + for (lp1 = lpHead1; lp1 != NULL; lp1 = lp1->lpbrotherfile) { + for (lp2 = lpHead2; lp2 != NULL; lp2 = lp2->lpbrotherfile) { + if ((lp2->bfilematch == NOTMATCH) && strcmp(lp1->lpfilename, lp2->lpfilename) == 0) { // 1.8.2 from lstrcmp to strcmp + // Two files have the same name, but we are not sure they are the same, so we compare them! + if (ISFILE(lp1->fileattr) && ISFILE(lp2->fileattr)) + //(lp1->fileattr&FILE_ATTRIBUTE_DIRECTORY) != FILE_ATTRIBUTE_DIRECTORY && (lp2->fileattr&FILE_ATTRIBUTE_DIRECTORY) != FILE_ATTRIBUTE_DIRECTORY) + { + // Lp1 is file, lp2 is file + if (lp1->writetimelow == lp2->writetimelow && lp1->writetimehigh == lp2->writetimehigh && + lp1->filesizelow == lp2->filesizelow && lp1->filesizehigh == lp2->filesizehigh && lp1->fileattr == lp2->fileattr) { + // We found a match file! + lp2->bfilematch = ISMATCH; + } else { + // We found a dismatch file, they will be logged + lp2->bfilematch = ISMODI; + LogToMem(FILEMODI, &nFILEMODI, lp1); + } + + } else { + // At least one file of the pair is directory, so we try to determine + if (ISDIR(lp1->fileattr) && ISDIR(lp2->fileattr)) + // (lp1->fileattr&FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY && (lp2->fileattr&FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY) + { + // The two 'FILE's are all dirs + if (lp1->fileattr == lp2->fileattr) { + // Same dir attributes, we compare their subfiles + lp2->bfilematch = ISMATCH; + CompareFirstSubFile(lp1->lpfirstsubfile, lp2->lpfirstsubfile); + } else { + // Dir attributes changed, they will be logged + lp2->bfilematch = ISMODI; + LogToMem(DIRMODI, &nDIRMODI, lp1); + } + //break; + } else { + // One of the 'FILE's is dir, but which one? + if (ISFILE(lp1->fileattr) && ISDIR(lp2->fileattr)) + //(lp1->fileattr&FILE_ATTRIBUTE_DIRECTORY) != FILE_ATTRIBUTE_DIRECTORY && (lp2->fileattr&FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY) + { + // lp1 is file, lp2 is dir + lp1->bfilematch = ISDEL; + LogToMem(FILEDEL, &nFILEDEL, lp1); + GetAllSubFile(FALSE, DIRADD, FILEADD, &nDIRADD, &nFILEADD, lp2); + } else { + // lp1 is dir, lp2 is file + lp2->bfilematch = ISADD; + LogToMem(FILEADD, &nFILEADD, lp2); + GetAllSubFile(FALSE, DIRDEL, FILEDEL, &nDIRDEL, &nFILEDEL, lp1); + } + } + } + break; + } + } + + if (lp2 == NULL) { + // lp2 looped to the end, that is, we can not find a lp2 matches lp1, so lp1 is deleted! + if (ISDIR(lp1->fileattr)) { + GetAllSubFile(FALSE, DIRDEL, FILEDEL, &nDIRDEL, &nFILEDEL, lp1); // if lp1 is dir + } else { + LogToMem(FILEDEL, &nFILEDEL, lp1); // if lp1 is file + } + } + } + + // We loop to the end, then we do an extra loop of lp2 use flag we previous made + for (lp2 = lpHead2; lp2 != NULL; lp2 = lp2->lpbrotherfile) { + nComparing++; + if (lp2->bfilematch == NOTMATCH) { + // We did not find a lp1 matches a lp2, so lp2 is added! + if (ISDIR(lp2->fileattr)) { + GetAllSubFile(FALSE, DIRADD, FILEADD, &nDIRADD, &nFILEADD, lp2); + } else { + LogToMem(FILEADD, &nFILEADD, lp2); + } + } + } + + // Progress bar update + if (nGettingFile != 0) + if (nComparing % nGettingFile > nFileStep) { + nComparing = 0; + SendDlgItemMessage(hWnd, IDC_PBCOMPARE, PBM_STEPIT, (WPARAM)0, (LPARAM)0); + } + +} + + +//------------------------------------------------------------- +// Routines to free all file tree +//------------------------------------------------------------- +VOID FreeAllFileContent(LPFILECONTENT lpFile) +{ + if (lpFile != NULL) { + FreeAllFileContent(lpFile->lpfirstsubfile); + FreeAllFileContent(lpFile->lpbrotherfile); + MYFREE(lpFile->lpfilename); + MYFREE(lpFile); + } +} + + +//------------------------------------------------------------- +// Routines to free head files +//------------------------------------------------------------- +VOID FreeAllFileHead(LPHEADFILE lp) +{ + if (lp != NULL) { + FreeAllFileHead(lp->lpnextheadfile); + FreeAllFileContent(lp->lpfilecontent); + //FreeAllFileContent(lp->lpfilecontent2); + MYFREE(lp); + } + +} + + +//-------------------------------------------------- +// File save engine (It is stupid again!) added in 1.8 +//-------------------------------------------------- +VOID SaveFileContent(LPFILECONTENT lpFileContent, DWORD nFPCurrentFatherFile, DWORD nFPCaller) +{ + + DWORD nFPTemp4Write; + DWORD nFPHeader; + DWORD nFPCurrent; + DWORD nLenPlus1; + int nPad; + + nLenPlus1 = (DWORD)strlen(lpFileContent->lpfilename) + 1; // Get len+1,this (dword) is for the writefile below. + nFPHeader = SetFilePointer(hFileWholeReg, 0, NULL, FILE_CURRENT); // Save head fp + // using struct, idea from maddes + sFC.fpos_filename = nFPHeader + sizeof(SAVEFILECONTENT); + sFC.writetimelow = lpFileContent->writetimelow; + sFC.writetimehigh = lpFileContent->writetimehigh; + sFC.filesizelow = lpFileContent->filesizelow; + sFC.filesizehigh = lpFileContent->filesizehigh; + sFC.fileattr = lpFileContent->fileattr; + sFC.cksum = lpFileContent->cksum; + sFC.fpos_firstsubfile = 0; //lpFileContent->lpfirstsubfile; + sFC.fpos_brotherfile = 0; //lpFileContent->lpbrotherfile; + sFC.fpos_fatherfile = nFPCurrentFatherFile; + sFC.bfilematch = 0; + WriteFile(hFileWholeReg, &sFC, sizeof(sFC), &NBW, NULL); + +/* + nFPTemp4Write = nFPHeader + sizeof(FILECONTENT); // + WriteFile(hFileWholeReg, &nFPTemp4Write, sizeof(nFPTemp4Write), &NBW, NULL); // Save the location of lpfilename + + WriteFile(hFileWholeReg, (LPBYTE)lpFileContent + sizeof(LPSTR), 6*sizeof(DWORD), &NBW, NULL); // Write time, size etc. 6*4 + + //nFPTemp4Write = (lpFileContent->lpfirstsubfile!=NULL) ? (nFPHeader + 41 + nLenPlus1) : 0; // We write lpfilename plus a "\0" + //WriteFile(hFileWholeReg,&nFPTemp4Write,4,&NBW,NULL); // Save the location of lpfirstsubfile + WriteFile(hFileWholeReg, (LPBYTE)lpFileContent + sizeof(LPSTR)+6*sizeof(DWORD), sizeof(LPFILECONTENT)*2, &NBW, NULL); // Save lpfirstsubfile and lpbrotherfile + WriteFile(hFileWholeReg, &nFPCurrentFatherFile, sizeof(nFPCurrentFatherFile), &NBW, NULL); // Save nFPCurrentFatherKey passed by caller + + lpFileContent->bfilematch=0; + WriteFile(hFileWholeReg, &(lpFileContent->bfilematch), sizeof(lpFileContent->bfilematch), &NBW, NULL); // Clear and save bfilematch +*/ + WriteFile(hFileWholeReg, lpFileContent->lpfilename, nLenPlus1, &NBW, NULL); // Save the current filename + + nPad = (nLenPlus1 % sizeof(DWORD) == 0) ? 0 : (sizeof(DWORD) - nLenPlus1 % sizeof(DWORD)); + + nFPTemp4Write = 0; + if (nPad > 0) { + WriteFile(hFileWholeReg, &nFPTemp4Write, nPad, &NBW, NULL); // Save the current filename + } + + if (lpFileContent->lpfirstsubfile != NULL) { + // pass this filecontent's position as subfile's fatherfile's position and pass the "lpfirstsubfile field" + SaveFileContent(lpFileContent->lpfirstsubfile, nFPHeader, nFPHeader + 7 * sizeof(DWORD)); + } + + if (lpFileContent->lpbrotherfile != NULL) { + // pass this file's fatherfile's position as brother's father and pass "lpbrotherfile field" + SaveFileContent(lpFileContent->lpbrotherfile, nFPCurrentFatherFile, nFPHeader + 8 * sizeof(DWORD)); + } + + if (nFPCaller > 0) { // save position of current file in current father file + nFPCurrent = SetFilePointer(hFileWholeReg, 0, NULL, FILE_CURRENT); + SetFilePointer(hFileWholeReg, nFPCaller, NULL, FILE_BEGIN); + WriteFile(hFileWholeReg, &nFPHeader, sizeof(nFPHeader), &NBW, NULL); + SetFilePointer(hFileWholeReg, nFPCurrent, NULL, FILE_BEGIN); + } + + // Need adjust progress bar para!! + nSavingFile++; + + if (nGettingFile != 0) + if (nSavingFile % nGettingFile > nFileStep) { + nSavingFile = 0; + SendDlgItemMessage(hWnd, IDC_PBCOMPARE, PBM_STEPIT, (WPARAM)0, (LPARAM)0); + UpdateWindow(hWnd); + PeekMessage(&msg, hWnd, WM_ACTIVATE, WM_ACTIVATE, PM_REMOVE); + } + + +} + + +#ifdef _WIN64 +//------------------------------------------------------------- +//Rebuild file snap from file buffer +//------------------------------------------------------------- +VOID RebuildFromHive_file(LPSAVEFILECONTENT lpFile, LPFILECONTENT lpFatherFC, LPFILECONTENT lpFC, LPBYTE lpHiveFileBase) +{ + LPFILECONTENT lpsubfile; + + if (lpFile->fpos_filename != 0) { + lpFC->lpfilename = (LPSTR)(lpHiveFileBase + lpFile->fpos_filename); + } + lpFC->writetimelow = lpFile->writetimelow; + lpFC->writetimehigh = lpFile->writetimehigh; + lpFC->filesizelow = lpFile->filesizelow; + lpFC->filesizehigh = lpFile->filesizehigh; + lpFC->fileattr = lpFile->fileattr; + lpFC->cksum = lpFile->cksum; + lpFC->lpfatherfile = lpFatherFC; + if (ISDIR(lpFC->fileattr)) { + nGettingDir++; + } else { + nGettingFile++; + } + + if (lpFile->fpos_firstsubfile != 0) { + lpsubfile = MYALLOC0(sizeof(FILECONTENT)); + lpFC->lpfirstsubfile = lpsubfile; + RebuildFromHive_file((LPSAVEFILECONTENT)(lpHiveFileBase + lpFile->fpos_firstsubfile), lpFC, lpsubfile, lpHiveFileBase); + } + + if (lpFile->fpos_brotherfile != 0) { + lpsubfile = MYALLOC0(sizeof(FILECONTENT)); + lpFC->lpbrotherfile = lpsubfile; + RebuildFromHive_file((LPSAVEFILECONTENT)(lpHiveFileBase + lpFile->fpos_brotherfile), lpFatherFC, lpsubfile, lpHiveFileBase); + } + + + nGettingTime = GetTickCount(); + if ((nGettingTime - nBASETIME1) > REFRESHINTERVAL) { + UpdateCounters(lan_dir, lan_file, nGettingDir, nGettingFile); + } + +} +//------------------------------------------------------------- +//Rebuild filehead from file buffer +//------------------------------------------------------------- +VOID RebuildFromHive_filehead(LPSAVEHEADFILE lpSHF, LPHEADFILE lpHeadFile, LPBYTE lpHiveFileBase) +{ + LPSAVEHEADFILE lpshf; + LPHEADFILE lpHF; + LPHEADFILE lpHFLast; + + for (lpshf = lpSHF, lpHF = lpHeadFile; lpHiveFileBase != (LPBYTE)lpshf; lpshf = (LPSAVEHEADFILE)(lpHiveFileBase + lpshf->fpos_nextheadfile)) { + + if (lpshf->fpos_filecontent != 0) { + lpHF->lpfilecontent = MYALLOC0(sizeof(FILECONTENT)); + RebuildFromHive_file((LPSAVEFILECONTENT)(lpHiveFileBase + lpshf->fpos_filecontent), NULL, lpHF->lpfilecontent, lpHiveFileBase); + } + if (lpshf->fpos_nextheadfile != 0) { + lpHF->lpnextheadfile = MYALLOC0(sizeof(HEADFILE)); + lpHFLast = lpHF; + lpHF = lpHF->lpnextheadfile; + } + + } +} + +#else +//-------------------------------------------------- +// Realign filecontent, called by ReAlignFile() +//-------------------------------------------------- +VOID ReAlignFileContent(LPFILECONTENT lpFC, size_t nBase) +{ + + if (lpFC->lpfilename != NULL) { + lpFC->lpfilename += nBase; + } + if (lpFC->lpfirstsubfile != NULL) { + lpFC->lpfirstsubfile = (LPFILECONTENT)((LPBYTE)lpFC->lpfirstsubfile + nBase); + } + if (lpFC->lpbrotherfile != NULL) { + lpFC->lpbrotherfile = (LPFILECONTENT)((LPBYTE)lpFC->lpbrotherfile + nBase); + } + if (lpFC->lpfatherfile != NULL) { + lpFC->lpfatherfile = (LPFILECONTENT)((LPBYTE)lpFC->lpfatherfile + nBase); + } + + + nGettingFile++; // just for the progress bar + + if (lpFC->lpfirstsubfile != NULL) { + ReAlignFileContent(lpFC->lpfirstsubfile, nBase); + } + + if (lpFC->lpbrotherfile != NULL) { + ReAlignFileContent(lpFC->lpbrotherfile, nBase); + } + +} + + +//-------------------------------------------------- +// Realign file, walk through chain +//-------------------------------------------------- +VOID ReAlignFile(LPHEADFILE lpHF, size_t nBase) +{ + LPHEADFILE lphf; + + for (lphf = lpHF; lphf != NULL; lphf = lphf->lpnextheadfile) { + + + if (lphf->lpnextheadfile != NULL) { + lphf->lpnextheadfile = (LPHEADFILE)((LPBYTE)lphf->lpnextheadfile + nBase); + } + if (lphf->lpfilecontent != NULL) { + lphf->lpfilecontent = (LPFILECONTENT)((LPBYTE)lphf->lpfilecontent + nBase); + ReAlignFileContent(lphf->lpfilecontent, nBase); + } + } +} + +#endif + +//-------------------------------------------------- +// Walkthrough lpHF and find lpname matches +//-------------------------------------------------- +LPFILECONTENT SearchDirChain(LPSTR lpname, LPHEADFILE lpHF) +{ + LPHEADFILE lphf; + + if (lpname != NULL) + for (lphf = lpHF; lphf != NULL; lphf = lphf->lpnextheadfile) { + if (lphf->lpfilecontent != NULL && lphf->lpfilecontent->lpfilename != NULL) + if (_stricmp(lpname, lphf->lpfilecontent->lpfilename) == 0) { + return lphf->lpfilecontent; + } + } + return NULL; +} + + +//-------------------------------------------------- +// Walkthrough lpheadfile chain and collect it's first dirname to lpDir +//-------------------------------------------------- +VOID FindDirChain(LPHEADFILE lpHF, LPSTR lpDir, size_t nMaxLen) +{ + size_t nLen; + LPHEADFILE lphf; + *lpDir = 0x00; + nLen = 0; + + for (lphf = lpHF; lphf != NULL; lphf = lphf->lpnextheadfile) { + if (lphf->lpfilecontent != NULL && nLen < nMaxLen) { + nLen += strlen(lphf->lpfilecontent->lpfilename) + 1; + strcat(lpDir, lphf->lpfilecontent->lpfilename); + strcat(lpDir, ";"); + } + } +} + + +//-------------------------------------------------- +// if two dir chains are the same +//-------------------------------------------------- +BOOL DirChainMatch(LPHEADFILE lphf1, LPHEADFILE lphf2) +{ + char lpDir1[EXTDIRLEN + 4]; + char lpDir2[EXTDIRLEN + 4]; + ZeroMemory(lpDir1, sizeof(lpDir1)); + ZeroMemory(lpDir2, sizeof(lpDir2)); + FindDirChain(lphf1, lpDir1, EXTDIRLEN); + FindDirChain(lphf2, lpDir2, EXTDIRLEN); + + if (_stricmp(lpDir1, lpDir2) != 0) { + return FALSE; + } else { + return TRUE; + } +} diff --git a/RegShot/src/global.h b/RegShot/src/global.h new file mode 100644 index 0000000..041bec0 --- /dev/null +++ b/RegShot/src/global.h @@ -0,0 +1,415 @@ +/* + Copyright 1999-2003,2007,2011 TiANWEi + Copyright 2004 tulipfan + + This file is part of Regshot. + + Regshot is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + Regshot is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Regshot; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef REGSHOT_GLOBAL_H +#define REGSHOT_GLOBAL_H + + +#ifdef __GNUC__ +#include +#endif +#include +#include +#include +#include "resource.h" + +#if defined(_MSC_VER) && (_MSC_VER < 1300) // before VS 2002 .NET (e.g. VS 6) +#define SetClassLongPtr SetClassLong +#ifndef GCLP_HICON +#define GCLP_HICON GCL_HICON +#endif +#if !defined(LONG_PTR) +typedef long LONG_PTR; +#endif +#endif // _MSC_VER + +// added in 1.8.2 to gain a slightly faster speed but it is danger! +#define USEHEAPALLOC_DANGER +//#define DEBUGLOG + +#ifdef USEHEAPALLOC_DANGER + +// MSDN doc say use HEAP_NO_SERIALIZE is not good for process heap :( so change fromm 1 to 0 20111216 ,slower than using 1 +#define MYALLOC(x) HeapAlloc(hHeap,0,x) +#define MYALLOC0(x) HeapAlloc(hHeap,8,x) // (HEAP_NO_SERIALIZE|) HEAP_ZERO_MEMORY ,1|8 +#define MYFREE(x) HeapFree(hHeap,0,x) + +#else + +#define MYALLOC(x) GlobalAlloc(GMEM_FIXED,x) +#define MYALLOC0(x) GlobalAlloc(GPTR,x) +#define MYFREE(x) GlobalFree(x) + +#endif + + +// Some definations +#define SIZEOF_REG_DWORD 4 // In current windows, reg_dword's size=4 +#define NOTMATCH 0 // Define modification type in comparison results +#define ISMATCH 1 +#define ISDEL 2 +#define ISADD 3 +#define ISMODI 4 + +#define KEYADD 1 +#define KEYDEL 2 +#define VALADD 3 +#define VALDEL 4 +#define VALMODI 5 +#define FILEADD 6 +#define FILEDEL 7 +#define FILEMODI 8 +#define DIRADD 9 +#define DIRDEL 10 +#define DIRMODI 11 + +#define ESTIMATE_VALUEDATA_LENGTH 1024*1024 //Define estimated value data in scan +#define REFRESHINTERVAL 110 // Define progress refresh rate +#define MAXPBPOSITION 100 // Define progress bar length +#define COMMENTLENGTH 50 // Define commentfield length on the MainForm +#define HTMLWRAPLENGTH 1000 // Define html out put wrap length +#define MAXAMOUNTOFFILE 10000 // Define out put file counts +#define EXTDIRLEN MAX_PATH * 4 // Define searching directory field length +#define COMPUTERNAMELEN 64 // Define COMPUTER name length,do not change +#define HIVEBEGINOFFSET 512 // Hive file out put header computerlen*2+sizeof(systemtime)+32 must 1) { + bRet = TRUE; + for (lp = lpSectionNames; *lp != 0; lp = lp + strlen(lp) + 1) { + if (_stricmp(lp, str_SectionCurrent) != 0) { + SendDlgItemMessage(hDlg, IDC_COMBOLANGUAGE, CB_ADDSTRING, (WPARAM)0, (LPARAM)lp); + } + } + GetPrivateProfileString(str_SectionCurrent, str_SectionCurrent, + str_DefaultLanguage, lpCurrentLanguage, 16, lpLanguageIni); + + nReturn = SendDlgItemMessage(hDlg, IDC_COMBOLANGUAGE, CB_FINDSTRINGEXACT, (WPARAM)0, (LPARAM)lpCurrentLanguage); + if (nReturn != CB_ERR) { + bRet = TRUE; + SendDlgItemMessage(hDlg, IDC_COMBOLANGUAGE, CB_SETCURSEL, (WPARAM)nReturn, (LPARAM)0); + } else { + bRet = FALSE; + } + + } else { + bRet = FALSE; + } + + MYFREE(lpSectionNames); + //MYFREE(lpCurrentLanguage); + return bRet; + +} + + +//-------------------------------------------------- +// Routines that show multi language +//-------------------------------------------------- +VOID GetDefaultStrings(VOID) +{ + //_asm int 3 + lan_key = lan_default[0]; + lan_value = lan_default[1]; + lan_dir = lan_default[2]; + lan_file = lan_default[3]; + lan_time = lan_default[4]; + lan_keyadd = lan_default[5]; + lan_keydel = lan_default[6]; + lan_valadd = lan_default[7]; + lan_valdel = lan_default[8]; + lan_valmodi = lan_default[9]; + lan_fileadd = lan_default[10]; + lan_filedel = lan_default[11]; + lan_filemodi = lan_default[12]; + lan_diradd = lan_default[13]; + lan_dirdel = lan_default[14]; + lan_dirmodi = lan_default[15]; + lan_total = lan_default[16]; + lan_comments = lan_default[17]; + lan_datetime = lan_default[18]; + lan_computer = lan_default[19]; + lan_username = lan_default[20]; + lan_about = lan_default[21]; + lan_error = lan_default[22]; + lan_errorexecviewer = lan_default[23]; + lan_errorcreatefile = lan_default[24]; + lan_erroropenfile = lan_default[25]; + lan_errormovefp = lan_default[26]; + lan_menushot = lan_default[40]; + lan_menushotsave = lan_default[41]; + lan_menuload = lan_default[42]; + lan_menuclearallshots = lan_default[43]; + lan_menuclearshot1 = lan_default[44]; + lan_menuclearshot2 = lan_default[45]; + +} + + +//-------------------------------------------------- +// Routines that show multi language +//-------------------------------------------------- +VOID PointToNewStrings(VOID) +{ + //LPDWORD lp = ldwTempStrings; + LPBYTE *lp = (LPBYTE *)lplpLangStrings; + + lan_key = *lp; + lp++; + lan_value = *lp; + lp++; + lan_dir = *lp; + lp++; + lan_file = *lp; + lp++; + lan_time = *lp; + lp++; + lan_keyadd = *lp; + lp++; + lan_keydel = *lp; + lp++; + lan_valadd = *lp; + lp++; + lan_valdel = *lp; + lp++; + lan_valmodi = *lp; + lp++; + lan_fileadd = *lp; + lp++; + lan_filedel = *lp; + lp++; + lan_filemodi = *lp; + lp++; + lan_diradd = *lp; + lp++; + lan_dirdel = *lp; + lp++; + lan_dirmodi = *lp; + lp++; + lan_total = *lp; + lp++; + lan_comments = *lp; + lp++; + lan_datetime = *lp; + lp++; + lan_computer = *lp; + lp++; + lan_username = *lp; + lp++; + lan_about = *lp; + lp++; + lan_error = *lp; + lp++; + lan_errorexecviewer = *lp; + lp++; + lan_errorcreatefile = *lp; + lp++; + lan_erroropenfile = *lp; + lp++; + lan_errormovefp = *lp; + lp += 14; + lan_menushot = *lp; + lp++; + lan_menushotsave = *lp; + lp++; + lan_menuload = *lp; + lp++; + lan_menuclearallshots = *lp; + lp++; + lan_menuclearshot1 = *lp; + lp++; + lan_menuclearshot2 = *lp; +} + + +//-------------------------------------------------- +// Routines that show multi language +//-------------------------------------------------- +BOOL GetLanguageStrings(HWND hDlg) +{ + LRESULT nIndex; + DWORD i; + BOOL bRet; + LPBYTE lpReturn; + //LPDWORD lp; + LPBYTE *lp; + char lpIniKey[16]; // 1.8.2 LPSTR lpIniKey = MYALLOC0(8); + + nIndex = SendDlgItemMessage(hDlg, IDC_COMBOLANGUAGE, CB_GETCURSEL, (WPARAM)0, (LPARAM)0); + if (nIndex != CB_ERR) { + + SendDlgItemMessage(hDlg, IDC_COMBOLANGUAGE, CB_GETLBTEXT, (WPARAM)nIndex, (LPARAM)lpCurrentLanguage); + WritePrivateProfileString(str_SectionCurrent, str_SectionCurrent, lpCurrentLanguage, lpLanguageIni); + ZeroMemory(lpLangStrings, SIZEOF_LANGSTRINGS); + GetPrivateProfileSection(lpCurrentLanguage, lpLangStrings, SIZEOF_LANGSTRINGS, lpLanguageIni); + for (i = 1, lp = (LPBYTE *)lplpLangStrings; i < 47; i++) { + + sprintf(lpIniKey, "%d%s", i, "="); + // pointer returned was pointed to char just after "=" + if ((lpReturn = AtPos((LPBYTE)lpLangStrings, (LPBYTE)lpIniKey, SIZEOF_LANGSTRINGS, strlen(lpIniKey))) != NULL) { + //_asm int 3; + //*(lp + i - 1) = (DWORD)lpReturn; + *(lp + i - 1) = lpReturn; + } else { + *(lp + i - 1) = lan_default[i - 1]; + } + + if (i >= 28 && i < 41 && i != 34) { + SetDlgItemText(hDlg, ID_BASE + 3 + i - 28, (LPSTR)(*(lp + i - 1))); + } + + } + + lpReturn = AtPos((LPBYTE)lpLangStrings, (LPBYTE)str_ItemTranslator, SIZEOF_LANGSTRINGS, strlen(str_ItemTranslator)); + lpCurrentTranslator = (lpReturn != NULL) ? ((LPSTR)lpReturn + 1) : str_Original; + PointToNewStrings(); + bRet = TRUE; + } else { + bRet = FALSE; + } + //MYFREE(lpCurrentLanguage); + //MYFREE(lpIniKey); + return bRet; +} diff --git a/RegShot/src/misc.c b/RegShot/src/misc.c new file mode 100644 index 0000000..e48696a --- /dev/null +++ b/RegShot/src/misc.c @@ -0,0 +1,143 @@ +/* + Copyright 1999-2003,2007 TiANWEi + + This file is part of Regshot. + + Regshot is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + Regshot is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Regshot; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "global.h" + +extern LPBYTE lan_error; + + +//------------------------------------------------------------- +// Show error message +//------------------------------------------------------------- +VOID ErrMsg(LPCSTR note) +{ + MessageBox(hWnd, note, (LPCSTR)lan_error, MB_ICONHAND); +} + + +//------------------------------------------------------------- +// Routine to debug +//------------------------------------------------------------- +#ifdef DEBUGLOG +extern char *str_CR; +extern u_char *lan_errorcreatefile; +extern u_char *lan_errormovefp; + +VOID DebugLog(LPSTR filename, LPSTR lpstr, HWND hDlg, BOOL bisCR) +{ + DWORD length; + DWORD nPos; + + hFile = CreateFile(filename, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); + if (hFile == INVALID_HANDLE_VALUE) { + ErrMsg((LPCSTR)lan_errorcreatefile); + } else { + nPos = SetFilePointer(hFile, 0, NULL, FILE_END); + if (nPos == 0xFFFFFFFF) { + ErrMsg((LPCSTR)lan_errormovefp); + } else { + + length = strlen(lpstr); + WriteFile(hFile, lpstr, length, &NBW, NULL); + if (NBW != length) { + //ErrMsg(lan_errorwritefile); + } + if (bisCR == TRUE) { + WriteFile(hFile, str_CR, sizeof(str_CR) - 1, &NBW, NULL); + } + } + } + CloseHandle(hFile); +} +#endif + + +//------------------------------------------------------------ +// Routine to replace invalid chars in comment fields +//------------------------------------------------------------ +BOOL ReplaceInValidFileName(LPSTR lpf) +{ + char lpInvalid[] = "\\/:*?\"<>|"; // 1.8.2 + DWORD i, j; + size_t nLen; + BOOL bLegal = FALSE; + nLen = strlen(lpf); + + for (i = 0; i < nLen; i++) { + for (j = 0; j < sizeof(lpInvalid) - 1; j++) { // changed at 1.8.2 from 9 to sizeof()-1 + if (*(lpf + i) == *(lpInvalid + j)) { + *(lpf + i) = '-'; // 0x2D; check for invalid chars and replace it (return FALSE;) + } else if (*(lpf + i) != 0x20 && *(lpf + i) != 0x09) { // At least one non-space, non-tab char needed! + bLegal = TRUE; + } + + } + } + return bLegal; +} + + +//-------------------------------------------------- +// Find lp's position in lpMaster (like At(), but not limit to str) +// add sizep :the size of lp, not using strlen +//-------------------------------------------------- +LPBYTE AtPos(LPBYTE lpMaster, LPBYTE lp, size_t size, size_t sizep) +{ + DWORD i, j; + //size_t nsizelp; + //nsizelp = strlen(lp); + + if (size <= sizep || sizep < 1) { + return NULL; + } + + for (i = 0; i < size - sizep; i++) { + for (j = 0; j < sizep; j++) { + if (*(lp + j) != *(lpMaster + i + j)) { + break; + } + } + //_asm int 3; + if (j == sizep) { + return lpMaster + i + sizep; + } + } + return NULL; + +} + + +//------------------------------------------------------------- +// Once, I thought about using own memory allocation method +//------------------------------------------------------------- +/*LPVOID MyHeapAlloc(DWORD type, DWORD size) +{ + if ((bTurboMode == FALSE) && ((lpMyHeap + size) < (lpMyHeap + MYHEAPSIZE))) + { + lpMyHeap = lpMyHeap + size; + if (type == LPTR) + ZeroMemory(lpMyHeap,size); + } + else + { + lpMyHeap = GlobalAlloc(type,size); + } + return lpMyHeap; +}*/ diff --git a/RegShot/src/output.c b/RegShot/src/output.c new file mode 100644 index 0000000..a72caaf --- /dev/null +++ b/RegShot/src/output.c @@ -0,0 +1,179 @@ +/* + Copyright 1999-2003,2007,2011 TiANWEi + Copyright 2007 Belogorokhov Youri + + This file is part of Regshot. + + Regshot is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + Regshot is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Regshot; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "global.h" + + +// Some strings used to write to HTML or TEXT file, need [] to use with sizeof() +char str_CR[] = "\r\n"; // {0x0d,0x0a,0x00}; +char txt_line[] = "\r\n----------------------------------\r\n"; +char htm_BR[] = "
"; +char htm_HTMLbegin[] = "\r\n"; +char htm_HTMLover[] = ""; +char htm_HEADbegin[] = "\r\n"; +char htm_HEADover[] = "\r\n"; +char htm_Td1Begin[] = ""; +char htm_Td2Begin[] = ""; +char htm_Td1Over[] = "\r\n"; +char htm_Td2Over[] = "\r\n"; +// color idea got from HANDLE(Youri) at wgapatcher.ru :) 1.8 +char htm_style[] = "\r\n"; // 1.8.2 from e0e0e0 to e0f0e0 by Charles +char htm_BodyBegin[] = "\r\n"; +char htm_BodyOver[] = "\r\n"; +char htm_TableBegin[] = "\r\n"; +char htm_TableOver[] = "
\r\n"; +char htm_s1[] = ""; +char htm_s2[] = ""; +char htm_s3[] = "\r\n"; +//char htm_website[] = "Bug reports to:
http://sourceforge.net/projects/regshot/"; + + +//------------------------------------------------------------ +// Several routines to write to output file +//------------------------------------------------------------ +VOID WriteHead(u_char *lpstr, DWORD count, BOOL isHTML) +{ + char lpcount[8]; + sprintf(lpcount, "%d", count); + + if (isHTML == TRUE) { + WriteFile(hFile, htm_BR, sizeof(htm_BR) - 1, &NBW, NULL); + WriteFile(hFile, htm_TableBegin, sizeof(htm_TableBegin) - 1, &NBW, NULL); + WriteFile(hFile, htm_Td1Begin, sizeof(htm_Td1Begin) - 1, &NBW, NULL); + } else { + WriteFile(hFile, txt_line, sizeof(txt_line) - 1, &NBW, NULL); + } + WriteFile(hFile, lpstr, (DWORD)strlen((LPSTR)lpstr), &NBW, NULL); + WriteFile(hFile, lpcount, (DWORD)strlen(lpcount), &NBW, NULL); + + if (isHTML == TRUE) { + WriteFile(hFile, htm_Td1Over, sizeof(htm_Td1Over) - 1, &NBW, NULL); + WriteFile(hFile, htm_TableOver, sizeof(htm_TableOver) - 1, &NBW, NULL); + } else { + WriteFile(hFile, txt_line, sizeof(txt_line) - 1, &NBW, NULL); + } +} + + +//------------------------------------------------------------ +VOID WritePart(LPCOMRESULT lpcomhead, BOOL isHTML, BOOL usecolor) +{ + DWORD i; + size_t n; + size_t nLen; + LPSTR lpstr; + LPCOMRESULT lp; + + if (isHTML) { + WriteFile(hFile, htm_TableBegin, sizeof(htm_TableBegin) - 1, &NBW, NULL); + WriteFile(hFile, htm_Td2Begin, sizeof(htm_Td2Begin) - 1, &NBW, NULL); + } + + for (i = 0, lp = lpcomhead; lp != NULL; i++, lp = lp->lpnextresult) { + nLen = strlen(lp->lpresult); + lpstr = lp->lpresult; + if (isHTML) { + // 1.8.0 + if (usecolor && i % 2 == 0) { + WriteFile(hFile, htm_s1, sizeof(htm_s1) - 1, &NBW, NULL); + } else { + WriteFile(hFile, htm_s2, sizeof(htm_s2) - 1, &NBW, NULL); + } + } + + for (n = 0; nLen > 0;) { + nLen < HTMLWRAPLENGTH ? (n = nLen) : (n = HTMLWRAPLENGTH); + + WriteFile(hFile, lpstr, (DWORD)n, &NBW, NULL); + lpstr = lpstr + n; + nLen = nLen - n; + //WriteFile(hFile,lp->lpresult,strlen(lp->lpresult),&NBW,NULL); + if (isHTML) { + WriteFile(hFile, htm_BR, sizeof(htm_BR) - 1, &NBW, NULL); + } + //else + // WriteFile(hFile,str_CR,sizeof(str_CR) - 1,&NBW,NULL); + // for some reason, txt doesn't wrap anymore since 1.50e, check below! + } + + if (isHTML) { + if (usecolor) { + WriteFile(hFile, htm_s3, sizeof(htm_s3) - 1, &NBW, NULL); + } + } else { + WriteFile(hFile, str_CR, sizeof(str_CR) - 1, &NBW, NULL); // this! + } + + + } + + if (isHTML) { + WriteFile(hFile, htm_Td2Over, sizeof(htm_Td2Over) - 1, &NBW, NULL); + WriteFile(hFile, htm_TableOver, sizeof(htm_TableOver) - 1, &NBW, NULL); + } + +} + + +//------------------------------------------------------------ +VOID WriteTitle(LPSTR lph, LPSTR lpb, BOOL isHTML) +{ + if (isHTML) { + WriteFile(hFile, htm_TableBegin, sizeof(htm_TableBegin) - 1, &NBW, NULL); + WriteFile(hFile, htm_Td1Begin, sizeof(htm_Td1Begin) - 1, &NBW, NULL); + } + WriteFile(hFile, lph, (DWORD)strlen(lph), &NBW, NULL); + WriteFile(hFile, lpb, (DWORD)strlen(lpb), &NBW, NULL); + + if (isHTML) { + WriteFile(hFile, htm_Td1Over, sizeof(htm_Td1Over) - 1, &NBW, NULL); + WriteFile(hFile, htm_TableOver, sizeof(htm_TableOver) - 1, &NBW, NULL); + } else { + WriteFile(hFile, str_CR, sizeof(str_CR) - 1, &NBW, NULL); + } +} + + +// 1.8.0 +VOID WriteHtmlbegin(void) +{ + WriteFile(hFile, htm_HTMLbegin, sizeof(htm_HTMLbegin) - 1, &NBW, NULL); + WriteFile(hFile, htm_HEADbegin, sizeof(htm_HEADbegin) - 1, &NBW, NULL); + WriteFile(hFile, htm_style, sizeof(htm_style) - 1, &NBW, NULL); + WriteFile(hFile, htm_HEADover, sizeof(htm_HEADover) - 1, &NBW, NULL); + WriteFile(hFile, htm_BodyBegin, sizeof(htm_BodyBegin) - 1, &NBW, NULL); +} + + +VOID WriteHtmlover(void) +{ + //WriteFile(hFile,htm_website,sizeof(htm_website) - 1,&NBW,NULL); // omit at 1.8 + WriteFile(hFile, htm_BodyOver, sizeof(htm_BodyOver) - 1, &NBW, NULL); + WriteFile(hFile, htm_HTMLover, sizeof(htm_HTMLover) - 1, &NBW, NULL); +} + + +VOID WriteHtmlbr(void) +{ + WriteFile(hFile, htm_BR, sizeof(htm_BR) - 1, &NBW, NULL); +} diff --git a/RegShot/src/regshot.c b/RegShot/src/regshot.c new file mode 100644 index 0000000..d43754b --- /dev/null +++ b/RegShot/src/regshot.c @@ -0,0 +1,1725 @@ +/* + Copyright 1999-2003,2007,2011 TiANWEi + Copyright 2004 tulipfan + Copyright 2011 maddes + + This file is part of Regshot. + + Regshot is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + Regshot is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Regshot; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "global.h" +#include "version.h" + +char str_DefResPre[] = REGSHOT_RESULT_FILE; +char str_filter[] = {"Regshot hive files [*.hiv]\0*.hiv\0All files\0*.*\0\0"}; +char str_RegshotHiveSignature[] = REGSHOT_HIVE_SIGNATURE; // Need [] to use with sizeof() must <12 +char str_ValueDataIsNULL[] = ": (NULL!)"; +SAVEKEYCONTENT sKC; +SAVEVALUECONTENT sVC; + + +extern LPBYTE lan_errorcreatefile; +extern LPBYTE lan_comments; +extern LPBYTE lan_datetime; +extern LPBYTE lan_computer; +extern LPBYTE lan_username; +extern LPBYTE lan_keydel; +extern LPBYTE lan_keyadd; +extern LPBYTE lan_valdel; +extern LPBYTE lan_valadd; +extern LPBYTE lan_valmodi; +extern LPBYTE lan_filedel; +extern LPBYTE lan_fileadd; +extern LPBYTE lan_filemodi; +extern LPBYTE lan_diradd; +extern LPBYTE lan_dirdel; +extern LPBYTE lan_dirmodi; +extern LPBYTE lan_total; +extern LPBYTE lan_key; +extern LPBYTE lan_value; +extern LPBYTE lan_dir; +extern LPBYTE lan_file; +extern LPBYTE lan_errorexecviewer; +extern LPBYTE lan_erroropenfile; + +extern char *str_prgname; // be careful of extern ref! Must be the same when declaring them, otherwise pointer would mis-point! +extern char str_CR[]; + + +//------------------------------------------------------------- +// Routine to get whole key name from KEYCONTENT +//------------------------------------------------------------- +LPSTR GetWholeKeyName(LPKEYCONTENT lpKeyContent) +{ + LPKEYCONTENT lpf; + LPSTR lpName; + LPSTR lptail; + size_t nLen = 0; + + for (lpf = lpKeyContent; lpf != NULL; lpf = lpf->lpfatherkey) { + nLen += strlen(lpf->lpkeyname) + 1; + } + if (nLen == 0) { + nLen++; + } + lpName = MYALLOC(nLen); + + lptail = lpName + nLen - 1; + *lptail = 0x00; + + for (lpf = lpKeyContent; lpf != NULL; lpf = lpf->lpfatherkey) { + nLen = strlen(lpf->lpkeyname); + memcpy(lptail -= nLen, lpf->lpkeyname, nLen); + if (lptail > lpName) { + *--lptail = '\\'; // 0x5c = '\\' + } + } + return lpName; +} + + +//------------------------------------------------------------- +// Routine to get whole value name from VALUECONTENT +//------------------------------------------------------------- +LPSTR GetWholeValueName(LPVALUECONTENT lpValueContent) +{ + LPKEYCONTENT lpf; + size_t nWholeLen; + size_t nLen; + LPSTR lpName; + LPSTR lptail; + + nLen = strlen(lpValueContent->lpvaluename); + nWholeLen = nLen + 1; + for (lpf = lpValueContent->lpfatherkey; lpf != NULL; lpf = lpf->lpfatherkey) { + nWholeLen += strlen(lpf->lpkeyname) + 1; + } + + lpName = MYALLOC(nWholeLen); + lptail = lpName + nWholeLen - 1; + + strcpy(lptail -= nLen, lpValueContent->lpvaluename); + *--lptail = '\\'; // 0x5c = '\\' + + for (lpf = lpValueContent->lpfatherkey; lpf != NULL; lpf = lpf->lpfatherkey) { + nLen = strlen(lpf->lpkeyname); + memcpy(lptail -= nLen, lpf->lpkeyname, nLen); + if (lptail > lpName) { + *--lptail = '\\'; // 0x5c = '\\' + } + } + return lpName; +} + + +//------------------------------------------------------------- +// Routine Trans VALUECONTENT.data[which in binary] into strings +// Called by GetWholeValueData() +//------------------------------------------------------------- +LPSTR TransData(LPVALUECONTENT lpValueContent, DWORD type) +{ + LPSTR lpvaluedata = NULL; + DWORD c; + DWORD size = lpValueContent->datasize; + + switch (type) { + + case REG_SZ: + // case REG_EXPAND_SZ: Not used any more, they all included in [default], + // because some non-regular value would corrupt this. + lpvaluedata = MYALLOC0(size + 5); // 5 is enough + strcpy(lpvaluedata, ": \""); + //if (lpValueContent->lpvaluedata != NULL) { + strcat(lpvaluedata, (const char *)lpValueContent->lpvaluedata); + //} + strcat(lpvaluedata, "\""); + // wsprintf has a bug that can not print string too long one time!); + //wsprintf(lpvaluedata,"%s%s%s",": \"",lpValueContent->lpvaluedata,"\""); + break; + case REG_MULTI_SZ: + // Be sure to add below line outside of following "if", + // for that GlobalFree(lp) must had lp already located! + lpvaluedata = MYALLOC0(size + 5); // 5 is enough + for (c = 0; c < size; c++) { + if (*((LPBYTE)(lpValueContent->lpvaluedata + c)) == 0) { + if (*((LPBYTE)(lpValueContent->lpvaluedata + c + 1)) != 0) { + *((LPBYTE)(lpValueContent->lpvaluedata + c)) = 0x20; // ??????? + } else { + break; + } + } + } + //*((LPBYTE)(lpValueContent->lpvaluedata + size)) = 0x00; // for some illegal multisz + strcpy(lpvaluedata, ": '"); + strcat(lpvaluedata, (const char *)lpValueContent->lpvaluedata); + strcat(lpvaluedata, "'"); + //wsprintf(lpvaluedata,"%s%s%s",": \"",lpValueContent->lpvaluedata,"\""); + break; + case REG_DWORD: + // case REG_DWORD_BIG_ENDIAN: Not used any more, they all included in [default] + lpvaluedata = MYALLOC0(SIZEOF_REG_DWORD * 2 + 5); // 13 is enough + sprintf(lpvaluedata, "%s%08X", ": 0x", *(LPDWORD)(lpValueContent->lpvaluedata)); + break; + default : + lpvaluedata = MYALLOC0(3 * (size + 1)); // 3*(size + 1) is enough + *lpvaluedata = 0x3a; + // for the resttype lengthofvaluedata doesn't contains the 0! + for (c = 0; c < size; c++) { + sprintf(lpvaluedata + 3 * c + 1, " %02X", *(lpValueContent->lpvaluedata + c)); + } + } + return lpvaluedata; +} + + +//------------------------------------------------------------- +// Routine to get whole value data from VALUECONTENT +//------------------------------------------------------------- +LPSTR GetWholeValueData(LPVALUECONTENT lpValueContent) +{ + LPSTR lpvaluedata = NULL; + DWORD c; + DWORD size = lpValueContent->datasize; + + if (lpValueContent->lpvaluedata != NULL) { //fix a bug at 20111228 + + switch (lpValueContent->typecode) { + case REG_SZ: + case REG_EXPAND_SZ: + //if (lpValueContent->lpvaluedata != NULL) { + if (size == (DWORD)strlen((const char *)(lpValueContent->lpvaluedata)) + 1) { + lpvaluedata = TransData(lpValueContent, REG_SZ); + } else { + lpvaluedata = TransData(lpValueContent, REG_BINARY); + } + //} else { + // lpvaluedata = TransData(lpValueContent, REG_SZ); + //} + break; + case REG_MULTI_SZ: + if (*((LPBYTE)(lpValueContent->lpvaluedata)) != 0x00) { + for (c = 0;; c++) { + if (*((LPWORD)(lpValueContent->lpvaluedata + c)) == 0) { + break; + } + } + if (size == c + 2) { + lpvaluedata = TransData(lpValueContent, REG_MULTI_SZ); + } else { + lpvaluedata = TransData(lpValueContent, REG_BINARY); + } + } else { + lpvaluedata = TransData(lpValueContent, REG_BINARY); + } + break; + case REG_DWORD: + case REG_DWORD_BIG_ENDIAN: + if (size == SIZEOF_REG_DWORD) { + lpvaluedata = TransData(lpValueContent, REG_DWORD); + } else { + lpvaluedata = TransData(lpValueContent, REG_BINARY); + } + break; + default : + lpvaluedata = TransData(lpValueContent, REG_BINARY); + } + } else { + lpvaluedata = MYALLOC0(sizeof(str_ValueDataIsNULL)); + strcpy(lpvaluedata, str_ValueDataIsNULL); + } + return lpvaluedata; +} + + +//------------------------------------------------------------- +// Routine to create new comparison result, distribute to different lp???MODI +//------------------------------------------------------------- +VOID CreateNewResult(DWORD actiontype, LPDWORD lpcount, LPSTR lpresult) +{ + LPCOMRESULT lpnew; + lpnew = (LPCOMRESULT)MYALLOC0(sizeof(COMRESULT)); + lpnew->lpresult = lpresult; + + switch (actiontype) { + case KEYADD: + *lpcount == 0 ? (lpKEYADDHEAD = lpnew) : (lpKEYADD->lpnextresult = lpnew); + lpKEYADD = lpnew; + break; + case KEYDEL: + *lpcount == 0 ? (lpKEYDELHEAD = lpnew) : (lpKEYDEL->lpnextresult = lpnew); + lpKEYDEL = lpnew; + break; + case VALADD: + *lpcount == 0 ? (lpVALADDHEAD = lpnew) : (lpVALADD->lpnextresult = lpnew); + lpVALADD = lpnew; + break; + case VALDEL: + *lpcount == 0 ? (lpVALDELHEAD = lpnew) : (lpVALDEL->lpnextresult = lpnew); + lpVALDEL = lpnew; + break; + case VALMODI: + *lpcount == 0 ? (lpVALMODIHEAD = lpnew) : (lpVALMODI->lpnextresult = lpnew); + lpVALMODI = lpnew; + break; + case FILEADD: + *lpcount == 0 ? (lpFILEADDHEAD = lpnew) : (lpFILEADD->lpnextresult = lpnew); + lpFILEADD = lpnew; + break; + case FILEDEL: + *lpcount == 0 ? (lpFILEDELHEAD = lpnew) : (lpFILEDEL->lpnextresult = lpnew); + lpFILEDEL = lpnew; + break; + case FILEMODI: + *lpcount == 0 ? (lpFILEMODIHEAD = lpnew) : (lpFILEMODI->lpnextresult = lpnew); + lpFILEMODI = lpnew; + break; + case DIRADD: + *lpcount == 0 ? (lpDIRADDHEAD = lpnew) : (lpDIRADD->lpnextresult = lpnew); + lpDIRADD = lpnew; + break; + case DIRDEL: + *lpcount == 0 ? (lpDIRDELHEAD = lpnew) : (lpDIRDEL->lpnextresult = lpnew); + lpDIRDEL = lpnew; + break; + case DIRMODI: + *lpcount == 0 ? (lpDIRMODIHEAD = lpnew) : (lpDIRMODI->lpnextresult = lpnew); + lpDIRMODI = lpnew; + break; + + } + (*lpcount)++; +} + + +//------------------------------------------------------------- +// Write comparison results into memory and call CreateNewResult() +//------------------------------------------------------------- +VOID LogToMem(DWORD actiontype, LPDWORD lpcount, LPVOID lp) +{ + LPSTR lpname; + LPSTR lpdata; + LPSTR lpall; + + if (actiontype == KEYADD || actiontype == KEYDEL) { + lpname = GetWholeKeyName(lp); + CreateNewResult(actiontype, lpcount, lpname); + } else { + if (actiontype == VALADD || actiontype == VALDEL || actiontype == VALMODI) { + + lpname = GetWholeValueName(lp); + lpdata = GetWholeValueData(lp); + lpall = MYALLOC(strlen(lpname) + strlen(lpdata) + 2); + // do not use:wsprintf(lpall,"%s%s",lpname,lpdata); !!! strlen limit! + strcpy(lpall, lpname); + strcat(lpall, lpdata); + MYFREE(lpname); + MYFREE(lpdata); + CreateNewResult(actiontype, lpcount, lpall); + } else { + lpname = GetWholeFileName(lp); + CreateNewResult(actiontype, lpcount, lpname); + } + + } +} + + +//------------------------------------------------------------- +// Routine to walk through sub keytree of current Key +//------------------------------------------------------------- +VOID GetAllSubName( + BOOL needbrother, + DWORD typekey, + DWORD typevalue, + LPDWORD lpcountkey, + LPDWORD lpcountvalue, + LPKEYCONTENT lpKeyContent +) +{ + + LPVALUECONTENT lpv; + LogToMem(typekey, lpcountkey, lpKeyContent); + + if (lpKeyContent->lpfirstsubkey != NULL) { + GetAllSubName(TRUE, typekey, typevalue, lpcountkey, lpcountvalue, lpKeyContent->lpfirstsubkey); + } + + if (needbrother == TRUE) + if (lpKeyContent->lpbrotherkey != NULL) { + GetAllSubName(TRUE, typekey, typevalue, lpcountkey, lpcountvalue, lpKeyContent->lpbrotherkey); + } + + for (lpv = lpKeyContent->lpfirstvalue; lpv != NULL; lpv = lpv->lpnextvalue) { + LogToMem(typevalue, lpcountvalue, lpv); + } +} + + +//------------------------------------------------------------- +// Routine to walk through all values of current key +//------------------------------------------------------------- +VOID GetAllValue(DWORD typevalue, LPDWORD lpcountvalue, LPKEYCONTENT lpKeyContent) +{ + LPVALUECONTENT lpv; + for (lpv = lpKeyContent->lpfirstvalue; lpv != NULL; lpv = lpv->lpnextvalue) { + LogToMem(typevalue, lpcountvalue, lpv); + } +} + + +//------------------------------------------------------------- +// Routine to free all comparison results (release memory) +//------------------------------------------------------------- +VOID FreeAllCom(LPCOMRESULT lpComResult) +{ + LPCOMRESULT lp; + LPCOMRESULT lpold; + + for (lp = lpComResult; lp != NULL;) { + if (lp->lpresult != NULL) { + MYFREE(lp->lpresult); + } + lpold = lp; + lp = lp->lpnextresult; + MYFREE(lpold); + } + +} + + +//------------------------------------------------------------- +// Routine to free all keys and values +//------------------------------------------------------------- +VOID FreeAllKey(LPKEYCONTENT lpKey) +{ + LPVALUECONTENT lpv; + LPVALUECONTENT lpvold; + + if (lpKey != NULL) { + FreeAllKey(lpKey->lpfirstsubkey); + FreeAllKey(lpKey->lpbrotherkey); + for (lpv = lpKey->lpfirstvalue; lpv != NULL;) { + MYFREE(lpv->lpvaluename); + if (lpv->lpvaluedata != NULL) { + MYFREE(lpv->lpvaluedata); + } + lpvold = lpv; + lpv = lpv->lpnextvalue; + MYFREE(lpvold); + } + MYFREE(lpKey->lpkeyname); + MYFREE(lpKey); + } + +} + +#ifdef _WIN64 +//------------------------------------------------------------- +//only for rebuild from hive,the name things remain in lptemphive +//------------------------------------------------------------- +VOID FreeAllKeyExceptNameValue(LPKEYCONTENT lpKey) +{ + LPVALUECONTENT lpv; + LPVALUECONTENT lpvold; + + if (lpKey != NULL) { + FreeAllKeyExceptNameValue(lpKey->lpfirstsubkey); + FreeAllKeyExceptNameValue(lpKey->lpbrotherkey); + for (lpv = lpKey->lpfirstvalue; lpv != NULL;) { + lpvold = lpv; + lpv = lpv->lpnextvalue; + MYFREE(lpvold); + } + MYFREE(lpKey); + } + +} + +#endif +//------------------------------------------------------------- +// Clear RegFlag previous made by comparison routine for the next comparison +//------------------------------------------------------------- +VOID ClearKeyMatchTag(LPKEYCONTENT lpKey) +{ + LPVALUECONTENT lpv; + + if (lpKey != NULL) { + lpKey->bkeymatch = 0; + for (lpv = lpKey->lpfirstvalue; lpv != NULL; lpv = lpv->lpnextvalue) { + lpv->bvaluematch = 0; + } + + //if (lpKey->lpfirstsubkey != NULL) // not used in 1.8 + { + ClearKeyMatchTag(lpKey->lpfirstsubkey); + } + + //if (lpKey->lpbrotherkey != NULL) // not used in 1.8 + { + ClearKeyMatchTag(lpKey->lpbrotherkey); + } + } +} + + +//------------------------------------------------------------- +// Clear Filematch Flag (core) +//------------------------------------------------------------- +VOID ClearFileContentMatchTag(LPFILECONTENT lpFC) +{ + if (lpFC != NULL) { + lpFC->bfilematch = 0; + //if (lpFC->lpfirstsubfile != NULL) + ClearFileContentMatchTag(lpFC->lpfirstsubfile); + //if (lpFC->lpbrotherfile != NULL) + ClearFileContentMatchTag(lpFC->lpbrotherfile); + } +} + + +//------------------------------------------------------------- +// Clear Filematch Flag previous made by comparison routine for the next comparison +//------------------------------------------------------------- +VOID ClearHeadFileMatchTag(LPHEADFILE lpHF) +{ + LPHEADFILE lphf; + + for (lphf = lpHF; lphf != NULL; lphf = lphf->lpnextheadfile) { + ClearFileContentMatchTag(lphf->lpfilecontent); + } +} + + +////////////////////////////////////// +VOID FreeAllKeyContent1(void) +{ + if (is1LoadFromHive) { +#ifdef _WIN64 + FreeAllKeyExceptNameValue(lpHeadLocalMachine1); + FreeAllKeyExceptNameValue(lpHeadUsers1); +#endif + MYFREE(lpTempHive1); // Note, together we free the filecontent! + lpTempHive1 = NULL; + lpHeadFile1 = NULL; // We add here + } else { + FreeAllKey(lpHeadLocalMachine1); + FreeAllKey(lpHeadUsers1); + } + lpHeadLocalMachine1 = NULL; + lpHeadUsers1 = NULL; + *lpComputerName1 = 0; + *lpUserName1 = 0; + +} + + +VOID FreeAllKeyContent2(void) +{ + if (is2LoadFromHive) { +#ifdef _WIN64 + FreeAllKeyExceptNameValue(lpHeadLocalMachine2); + FreeAllKeyExceptNameValue(lpHeadUsers2); +#endif + MYFREE(lpTempHive2); // Note, together we free the filecontent! + lpTempHive2 = NULL; + lpHeadFile2 = NULL; // We add here! + } else { + FreeAllKey(lpHeadLocalMachine2); + FreeAllKey(lpHeadUsers2); + } + lpHeadLocalMachine2 = NULL; + lpHeadUsers2 = NULL; + *lpComputerName2 = 0; + *lpUserName2 = 0; + +} + + +VOID FreeAllCompareResults(void) +{ + FreeAllCom(lpKEYADDHEAD); + FreeAllCom(lpKEYDELHEAD); + FreeAllCom(lpVALADDHEAD); + FreeAllCom(lpVALDELHEAD); + FreeAllCom(lpVALMODIHEAD); + FreeAllCom(lpFILEADDHEAD); + FreeAllCom(lpFILEDELHEAD); + FreeAllCom(lpFILEMODIHEAD); + FreeAllCom(lpDIRADDHEAD); + FreeAllCom(lpDIRDELHEAD); + FreeAllCom(lpDIRMODIHEAD); + + + nKEYADD = 0; + nKEYDEL = 0; + nVALADD = 0; + nVALDEL = 0; + nVALMODI = 0; + nFILEADD = 0; + nFILEDEL = 0; + nFILEMODI = 0; + nDIRADD = 0; + nDIRDEL = 0; + nDIRMODI = 0; + lpKEYADDHEAD = NULL; + lpKEYDELHEAD = NULL; + lpVALADDHEAD = NULL; + lpVALDELHEAD = NULL; + lpVALMODIHEAD = NULL; + lpFILEADDHEAD = NULL; + lpFILEDELHEAD = NULL; + lpFILEMODIHEAD = NULL; + lpDIRADDHEAD = NULL; + lpDIRDELHEAD = NULL; + lpDIRMODIHEAD = NULL; +} + + +//------------------------------------------------------------- +// Registry comparison engine +//------------------------------------------------------------- +VOID *CompareFirstSubKey(LPKEYCONTENT lpHead1, LPKEYCONTENT lpHead2) +{ + LPKEYCONTENT lp1; + LPKEYCONTENT lp2; + LPVALUECONTENT lpvalue1; + LPVALUECONTENT lpvalue2; + //DWORD i; + + for (lp1 = lpHead1; lp1 != NULL; lp1 = lp1->lpbrotherkey) { + for (lp2 = lpHead2; lp2 != NULL; lp2 = lp2->lpbrotherkey) { + if ((lp2->bkeymatch == NOTMATCH) && strcmp(lp1->lpkeyname, lp2->lpkeyname) == 0) { // 1.8.2 from lstrcmp to strcmp + // Same key found! We compare their values and their subkeys! + + lp2->bkeymatch = ISMATCH; + if (lp1->lpfirstvalue == NULL && lp2->lpfirstvalue != NULL) { + // Key1 has no values, so lpvalue2 is added! We find all values that belong to lp2! + GetAllValue(VALADD, &nVALADD, lp2); + } else { + if (lp1->lpfirstvalue != NULL && lp2->lpfirstvalue == NULL) { + // Key2 has no values, so lpvalue1 is deleted! We find all values that belong to lp1! + GetAllValue(VALDEL, &nVALDEL, lp1); + } else { + // Two keys all has values, so we loop them + + for (lpvalue1 = lp1->lpfirstvalue; lpvalue1 != NULL; lpvalue1 = lpvalue1->lpnextvalue) { + for (lpvalue2 = lp2->lpfirstvalue; lpvalue2 != NULL; lpvalue2 = lpvalue2->lpnextvalue) { + // Loop lp2 to find a value matchs lp1's + if ((lpvalue2->bvaluematch == NOTMATCH) && (lpvalue1->typecode == lpvalue2->typecode)) { + // Same valuedata type + if (strcmp(lpvalue1->lpvaluename, lpvalue2->lpvaluename) == 0) { // 1.8.2 from lstrcmp to strcmp + // Same valuename + if (lpvalue1->datasize == lpvalue2->datasize) { + // Same size of valuedata + /*for (i = 0; i < lpvalue1->datasize;i++) + { + if (*((lpvalue1->lpvaluedata) + i) != *((lpvalue2->lpvaluedata)+i)) + break; + } + if (i == lpvalue1->datasize)*/ + if (memcmp(lpvalue1->lpvaluedata, lpvalue2->lpvaluedata, lpvalue1->datasize) == 0) { // 1.8.2 + // Same valuedata, keys are the same! + + lpvalue2->bvaluematch = ISMATCH; + break; // Be sure not to do lp2 == NULL + } else { + // Valuedata not match due to data mismatch, we found a modified valuedata!***** + lpvalue2->bvaluematch = ISMODI; + LogToMem(VALMODI, &nVALMODI, lpvalue1); + LogToMem(VALMODI, &nVALMODI, lpvalue2); + nVALMODI--; + break; + } + } else { + // Valuedata does not match due to size, we found a modified valuedata!****** + lpvalue2->bvaluematch = ISMODI; + LogToMem(VALMODI, &nVALMODI, lpvalue1); + LogToMem(VALMODI, &nVALMODI, lpvalue2); + nVALMODI--; + break; + } + } + } + } + if (lpvalue2 == NULL) { + // We found a value in lp1 but not in lp2, we found a deleted value***** + LogToMem(VALDEL, &nVALDEL, lpvalue1); + } + } + // After we loop to end, we do extra loop use flag we previously made to get added values + for (lpvalue2 = lp2->lpfirstvalue; lpvalue2 != NULL; lpvalue2 = lpvalue2->lpnextvalue) { + if (lpvalue2->bvaluematch != ISMATCH && lpvalue2->bvaluematch != ISMODI) { + // We found a value in lp2's but not in lp1's ,we found a added value**** + LogToMem(VALADD, &nVALADD, lpvalue2); + + } + } + } + } + + ////////////////////////////////////////////////////////////// + // After we walk through the values above, we now try to loop the sub keys of current key + if (lp1->lpfirstsubkey == NULL && lp2->lpfirstsubkey != NULL) { + // lp2's firstsubkey added! + GetAllSubName(TRUE, KEYADD, VALADD, &nKEYADD, &nVALADD, lp2->lpfirstsubkey); + } + if (lp1->lpfirstsubkey != NULL && lp2->lpfirstsubkey == NULL) { + // lp1's firstsubkey deleted! + GetAllSubName(TRUE, KEYDEL, VALDEL, &nKEYDEL, &nVALDEL, lp1->lpfirstsubkey); + } + if (lp1->lpfirstsubkey != NULL && lp2->lpfirstsubkey != NULL) { + CompareFirstSubKey(lp1->lpfirstsubkey, lp2->lpfirstsubkey); + } + break; + } + } + if (lp2 == NULL) { + // We did not find a lp2 matches a lp1, so lp1 is deleted! + GetAllSubName(FALSE, KEYDEL, VALDEL, &nKEYDEL, &nVALDEL, lp1); + } + + } + + // After we loop to end, we do extra loop use flag we previously made to get added keys + for (lp2 = lpHead2; lp2 != NULL; lp2 = lp2->lpbrotherkey) { // ->lpbrotherkey + nComparing++; + if (lp2->bkeymatch == NOTMATCH) { + // We did not find a lp1 matches a lp2,so lp2 is added! + GetAllSubName(FALSE, KEYADD, VALADD, &nKEYADD, &nVALADD, lp2); + } + } + + // Progress bar update + if (nGettingKey != 0) + if (nComparing % nGettingKey > nRegStep) { + nComparing = 0; + SendDlgItemMessage(hWnd, IDC_PBCOMPARE, PBM_STEPIT, (WPARAM)0, (LPARAM)0); + } + + return NULL; +} + + +//------------------------------------------------------------ +// Routine to call registry/file comparison engine +//------------------------------------------------------------ +BOOL CompareShots(void) +{ + BOOL isHTML; + BOOL bshot2isnewer; + //BOOL bSaveWithCommentName; + LPSTR lpstrcomp; + LPSTR lpExt; + LPSTR lpDestFileName; + DWORD buffersize = 2048; + DWORD nTotal; + size_t nLengthofStr; + LPHEADFILE lphf1; + LPHEADFILE lphf2; + LPFILECONTENT lpfc1; + LPFILECONTENT lpfc2; + FILETIME ftime1; + FILETIME ftime2; + + + if (!DirChainMatch(lpHeadFile1, lpHeadFile2)) { + MessageBox(hWnd, "Found two shots with different DIR chain! (or with different order)\r\nYou can continue, but file comparison result would be abnormal!", "Warning", MB_ICONWARNING); + } + + InitProgressBar(); + + SystemTimeToFileTime(lpSystemtime1, &ftime1); + SystemTimeToFileTime(lpSystemtime2, &ftime2); + + bshot2isnewer = (CompareFileTime(&ftime1, &ftime2) <= 0) ? TRUE : FALSE; + if (bshot2isnewer) { + CompareFirstSubKey(lpHeadLocalMachine1, lpHeadLocalMachine2); + CompareFirstSubKey(lpHeadUsers1, lpHeadUsers2); + } else { + CompareFirstSubKey(lpHeadLocalMachine2, lpHeadLocalMachine1); + CompareFirstSubKey(lpHeadUsers2, lpHeadUsers1); + } + + SendDlgItemMessage(hWnd, IDC_PBCOMPARE, PBM_SETPOS, (WPARAM)0, (LPARAM)0); + + // Dir comparison v1.8.1 + // determine newer + if (bshot2isnewer) { + lphf1 = lpHeadFile1; + lphf2 = lpHeadFile2; + } else { + lphf1 = lpHeadFile2; + lphf2 = lpHeadFile1; + } + // first loop + for (; lphf1 != NULL; lphf1 = lphf1->lpnextheadfile) { + if (lphf1->lpfilecontent != NULL) { + lpfc1 = lphf1->lpfilecontent; + } else { + lpfc1 = NULL; + } + + if (lpfc1 != NULL) { + if ((lpfc2 = SearchDirChain(lpfc1->lpfilename, lphf2)) != NULL) { // note lphf2 should not changed here! + CompareFirstSubFile(lpfc1, lpfc2); // if found, we do compare + } else { // cannot find matched lpfc1 in lphf2 chain. + GetAllSubFile(FALSE, DIRDEL, FILEDEL, &nDIRDEL, &nFILEDEL, lpfc1); + } + } + } + // reset pointers + if (bshot2isnewer) { + lphf1 = lpHeadFile1; + lphf2 = lpHeadFile2; + } else { + lphf1 = lpHeadFile2; + lphf2 = lpHeadFile1; + } + // second loop + for (; lphf2 != NULL; lphf2 = lphf2->lpnextheadfile) { + if (lphf2->lpfilecontent != NULL) { + lpfc2 = lphf2->lpfilecontent; + } else { + lpfc2 = NULL; + } + if (lpfc2 != NULL) { + if ((lpfc1 = SearchDirChain(lpfc2->lpfilename, lphf1)) == NULL) { // in the second loop we only find those do not match + GetAllSubFile(FALSE, DIRADD, FILEADD, &nDIRADD, &nFILEADD, lpfc2); + } + } + } + /* silly one used in 1.8.0 + for (lphf1 = lpHeadFile1,lphf2 = lpHeadFile2;;) + { + // Normally, two lphf should run parallel, otherwise something abnormal should happen :( + if (lphf1 != NULL && lphf1->lpfilecontent != NULL) + lpfc1 = lphf1->lpfilecontent; + else + lpfc1 = NULL; + if (lphf2 != NULL && lphf2->lpfilecontent != NULL) + lpfc2 = lphf2->lpfilecontent; + else + lpfc2 = NULL; + if (lpfc1 == NULL && lpfc2 == NULL) + break; + if (bshot2isnewer) + CompareFirstSubFile(lpfc1,lpfc2); + else + CompareFirstSubFile(lpfc2,lpfc1); + + if (lphf1 != NULL) + lphf1 = lphf1->lpnextheadfile; + if (lphf2 != NULL) + lphf2 = lphf2->lpnextheadfile; + + } + */ + SendDlgItemMessage(hWnd, IDC_PBCOMPARE, PBM_SETPOS, (WPARAM)MAXPBPOSITION, (LPARAM)0); + + if (SendMessage(GetDlgItem(hWnd, IDC_RADIO1), BM_GETCHECK, (WPARAM)0, (LPARAM)0) == 1) { + isHTML = FALSE; + lpExt = ".txt"; + } else { + isHTML = TRUE; + lpExt = ".htm"; + } + + lpDestFileName = MYALLOC0(MAX_PATH * 4 + 4); + lpstrcomp = MYALLOC0(buffersize); // buffersize must> commentlength+10 .txt 0000 + GetDlgItemText(hWnd, IDC_EDITCOMMENT, lpstrcomp, COMMENTLENGTH); + GetDlgItemText(hWnd, IDC_EDITPATH, lpOutputpath, MAX_PATH); + + nLengthofStr = strlen(lpOutputpath); + + if (nLengthofStr > 0 && *(lpOutputpath + nLengthofStr - 1) != '\\') { + *(lpOutputpath + nLengthofStr) = '\\'; + *(lpOutputpath + nLengthofStr + 1) = 0x00; // bug found by "itschy" 1.61d->1.61e + nLengthofStr++; + } + strcpy(lpDestFileName, lpOutputpath); + + //bSaveWithCommentName = TRUE; + if (ReplaceInValidFileName(lpstrcomp)) { + strcat(lpDestFileName, lpstrcomp); + } else { + strcat(lpDestFileName, str_DefResPre); + } + + nLengthofStr = strlen(lpDestFileName); + strcat(lpDestFileName, lpExt); + hFile = CreateFile(lpDestFileName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL); + if (hFile == INVALID_HANDLE_VALUE) { + DWORD filetail = 0; + + for (filetail = 0; filetail < MAXAMOUNTOFFILE; filetail++) { + sprintf(lpDestFileName + nLengthofStr, "_%04d", filetail); + //*(lpDestFileName+nLengthofStr + 5) = 0x00; + strcpy(lpDestFileName + nLengthofStr + 5, lpExt); + + hFile = CreateFile(lpDestFileName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL); + if (hFile == INVALID_HANDLE_VALUE) { + if (GetLastError() == ERROR_FILE_EXISTS) { // My God! I use stupid ERROR_ALREADY_EXISTS first!! + continue; + } else { + ErrMsg((LPCSTR)lan_errorcreatefile); + return FALSE; + } + } else { + break; + } + } + if (filetail >= MAXAMOUNTOFFILE) { + ErrMsg((LPCSTR)lan_errorcreatefile); + return FALSE; + } + + } + + if (isHTML == TRUE) { + WriteHtmlbegin(); + } + + WriteFile(hFile, str_prgname, (DWORD)strlen(str_prgname), &NBW, NULL); + WriteFile(hFile, str_CR, (DWORD)strlen(str_CR), &NBW, NULL); + + //_asm int 3; + GetDlgItemText(hWnd, IDC_EDITCOMMENT, lpstrcomp, COMMENTLENGTH); + WriteTitle((LPSTR)lan_comments, lpstrcomp, isHTML); + + + sprintf(lpstrcomp, "%d%s%d%s%d %02d%s%02d%s%02d %s %d%s%d%s%d %02d%s%02d%s%02d", + lpSystemtime1->wYear, "/", + lpSystemtime1->wMonth, "/", + lpSystemtime1->wDay, + lpSystemtime1->wHour, ":", + lpSystemtime1->wMinute, ":", + lpSystemtime1->wSecond, " , ", + lpSystemtime2->wYear, "/", + lpSystemtime2->wMonth, "/", + lpSystemtime2->wDay, + lpSystemtime2->wHour, ":", + lpSystemtime2->wMinute, ":", + lpSystemtime2->wSecond + + ); + + WriteTitle((LPSTR)lan_datetime, lpstrcomp, isHTML); + + + *lpstrcomp = 0x00; //ZeroMemory(lpstrcomp,buffersize); + //GetComputerName(lpstrcomp,&buffersize); + strcpy(lpstrcomp, lpComputerName1); + strcat(lpstrcomp, " , "); + strcat(lpstrcomp, lpComputerName2); + WriteTitle((LPSTR)lan_computer, lpstrcomp, isHTML); + + *lpstrcomp = 0x00; //ZeroMemory(lpstrcomp,buffersize); + //GetUserName(lpstrcomp,&buffersize); + strcpy(lpstrcomp, lpUserName1); + strcat(lpstrcomp, " , "); + strcat(lpstrcomp, lpUserName2); + + WriteTitle((LPSTR)lan_username, lpstrcomp, isHTML); + + MYFREE(lpstrcomp); + + // Write keydel part + if (nKEYDEL != 0) { + WriteHead(lan_keydel, nKEYDEL, isHTML); + WritePart(lpKEYDELHEAD, isHTML, FALSE); + } + // Write keyadd part + if (nKEYADD != 0) { + WriteHead(lan_keyadd, nKEYADD, isHTML); + WritePart(lpKEYADDHEAD, isHTML, FALSE); + } + // Write valdel part + if (nVALDEL != 0) { + WriteHead(lan_valdel, nVALDEL, isHTML); + WritePart(lpVALDELHEAD, isHTML, FALSE); + } + // Write valadd part + if (nVALADD != 0) { + WriteHead(lan_valadd, nVALADD, isHTML); + WritePart(lpVALADDHEAD, isHTML, FALSE); + } + // Write valmodi part + if (nVALMODI != 0) { + WriteHead(lan_valmodi, nVALMODI, isHTML); + WritePart(lpVALMODIHEAD, isHTML, TRUE); + } + // Write file add part + if (nFILEADD != 0) { + WriteHead(lan_fileadd, nFILEADD, isHTML); + WritePart(lpFILEADDHEAD, isHTML, FALSE); + } + // Write file del part + if (nFILEDEL != 0) { + WriteHead(lan_filedel, nFILEDEL, isHTML); + WritePart(lpFILEDELHEAD, isHTML, FALSE); + } + // Write file modi part + if (nFILEMODI != 0) { + WriteHead(lan_filemodi, nFILEMODI, isHTML); + WritePart(lpFILEMODIHEAD, isHTML, FALSE); + } + // Write directory add part + if (nDIRADD != 0) { + WriteHead(lan_diradd, nDIRADD, isHTML); + WritePart(lpDIRADDHEAD, isHTML, FALSE); + } + // Write directory del part + if (nDIRDEL != 0) { + WriteHead(lan_dirdel, nDIRDEL, isHTML); + WritePart(lpDIRDELHEAD, isHTML, FALSE); + } + // Write directory modi part + if (nDIRMODI != 0) { + WriteHead(lan_dirmodi, nDIRMODI, isHTML); + WritePart(lpDIRMODIHEAD, isHTML, FALSE); + } + + nTotal = nKEYADD + nKEYDEL + nVALADD + nVALDEL + nVALMODI + nFILEADD + nFILEDEL + nFILEMODI + nDIRADD + nDIRDEL + nDIRMODI; + if (isHTML == TRUE) { + WriteHtmlbr(); + } + WriteHead(lan_total, nTotal, isHTML); + if (isHTML == TRUE) { + WriteHtmlover(); + } + + + CloseHandle(hFile); + + if ((size_t)ShellExecute(hWnd, "open", lpDestFileName, NULL, NULL, SW_SHOW) <= 32) { + ErrMsg((LPCSTR)lan_errorexecviewer); + } + MYFREE(lpDestFileName); + + + return TRUE; +} + + +//------------------------------------------------------------ +// Registry shot engine +//------------------------------------------------------------ +VOID GetRegistrySnap(HKEY hkey, LPKEYCONTENT lpFatherKeyContent) +{ + + HKEY Subhkey; + DWORD i; + DWORD NTr; + DWORD TypeCode; + DWORD LengthOfKeyName; + DWORD LengthOfValueName; + DWORD LengthOfValueData; + DWORD LengthOfLongestValueName; + DWORD LengthOfLongestValueData; + DWORD LengthOfLongestSubkeyName; + //LPSTR lpValueName; + //LPBYTE lpValueData; + LPKEYCONTENT lpKeyContent; + LPVALUECONTENT lpValueContent; + LPKEYCONTENT lpKeyContentLast; + LPVALUECONTENT lpValueContentLast; + + lpKeyContentLast = NULL; + lpValueContentLast = NULL; + + // To detemine MAX length + if (RegQueryInfoKey( + hkey, + NULL, // lpClassName_nouse, + NULL, // &nClassName_nouse_length, + NULL, + NULL, // &NumberOfSubkeys, + &LengthOfLongestSubkeyName, // chars + NULL, // &nClassName_nouse_longestlength, + NULL, // &NumberOfValue, + &LengthOfLongestValueName, // chars + &LengthOfLongestValueData, // bytes + NULL, // &nSecurity_length_nouse, + NULL // &ftLastWrite + ) != ERROR_SUCCESS) { + return ; + } + //Comment out in beta1V5 20120102, v4 modified these to *4 +4 ,which is not right + //But not so sure to use global and pass chars, because once several years ago,in win2000,I encounter some problem. + //LengthOfLongestSubkeyName = LengthOfLongestSubkeyName * 2 + 3; // msdn says it is in unicode characters,right now maybe not large than that.old version use *2+3 + //LengthOfLongestValueName = LengthOfLongestValueName * 2 + 3; + LengthOfLongestSubkeyName = LengthOfLongestSubkeyName + 1; + LengthOfLongestValueName = LengthOfLongestValueName + 1; + LengthOfLongestValueData = LengthOfLongestValueData + 1; //use +1 maybe too careful. but since the real memory allocate is based on return of another call,it is just be here. + if (LengthOfLongestValueData >= ESTIMATE_VALUEDATA_LENGTH) { + lpValueDataS= lpValueData; + lpValueData = MYALLOC(LengthOfLongestValueData); + } + //lpValueName = MYALLOC(LengthOfLongestValueName); + + + // Get Values + for (i = 0;; i++) { + + *(LPBYTE)lpValueName = (BYTE)0x00; // That's the bug in 2000! thanks zhangl@digiark.com! + *(LPBYTE)lpValueData = (BYTE)0x00; + //DebugBreak(); + LengthOfValueName = LengthOfLongestValueName; + LengthOfValueData = LengthOfLongestValueData; + NTr = RegEnumValue(hkey, i, lpValueName, &LengthOfValueName, NULL, &TypeCode, lpValueData, &LengthOfValueData); + if (NTr == ERROR_NO_MORE_ITEMS) { + break; + } else { + if (NTr != ERROR_SUCCESS) { + continue; + } + } + +#ifdef DEBUGLOG + DebugLog("debug_trytogetvalue.log", "trying:", hWnd, FALSE); + DebugLog("debug_trytogetvalue.log", lpValueName, hWnd, TRUE); +#endif + + lpValueContent = MYALLOC0(sizeof(VALUECONTENT)); + // I had done if (i == 0) in 1.50b- ! thanks fisttk@21cn.com and non-standard + //if (lpFatherKeyContent->lpfirstvalue == NULL) { + if (lpValueContentLast == NULL) { + lpFatherKeyContent->lpfirstvalue = lpValueContent; + } else { + lpValueContentLast->lpnextvalue = lpValueContent; + } + lpValueContentLast = lpValueContent; + lpValueContent->typecode = TypeCode; + lpValueContent->datasize = LengthOfValueData; + lpValueContent->lpfatherkey = lpFatherKeyContent; + lpValueContent->lpvaluename = MYALLOC(strlen(lpValueName) + 1); + strcpy(lpValueContent->lpvaluename, lpValueName); + + if (LengthOfValueData != 0) { + lpValueContent->lpvaluedata = MYALLOC(LengthOfValueData); + CopyMemory(lpValueContent->lpvaluedata, lpValueData, LengthOfValueData); + //*(lpValueContent->lpvaluedata + LengthOfValueData) = 0x00; + } + nGettingValue++; + +#ifdef DEBUGLOG + lstrdb1 = MYALLOC0(100); + sprintf(lstrdb1, "LGVN:%08d LGVD:%08d VN:%08d VD:%08d", LengthOfLongestValueName, LengthOfLongestValueData, LengthOfValueName, LengthOfValueData); + DebugLog("debug_valuenamedata.log", lstrdb1, hWnd, TRUE); + DebugLog("debug_valuenamedata.log", GetWholeValueName(lpValueContent), hWnd, FALSE); + DebugLog("debug_valuenamedata.log", GetWholeValueData(lpValueContent), hWnd, TRUE); + //DebugLog("debug_valuenamedata.log",":",hWnd,FALSE); + //DebugLog("debug_valuenamedata.log",lpValueData,hWnd,TRUE); + MYFREE(lstrdb1); + +#endif + } + + //MYFREE(lpValueName); + if (LengthOfLongestValueData >= ESTIMATE_VALUEDATA_LENGTH) { + MYFREE(lpValueData); + lpValueData= lpValueDataS; + } + + + for (i = 0;; i++) { + LengthOfKeyName = LengthOfLongestSubkeyName; + *(LPBYTE)lpKeyName = (BYTE)0x00; + NTr = RegEnumKeyEx(hkey, i, lpKeyName, &LengthOfKeyName, NULL, NULL, NULL, &ftLastWrite); + if (NTr == ERROR_NO_MORE_ITEMS) { + break; + } else { + if (NTr != ERROR_SUCCESS) { + continue; + } + } + lpKeyContent = MYALLOC0(sizeof(KEYCONTENT)); + //if (lpFatherKeyContent->lpfirstsubkey == NULL) { + if (lpKeyContentLast == NULL) { + lpFatherKeyContent->lpfirstsubkey = lpKeyContent; + } else { + lpKeyContentLast->lpbrotherkey = lpKeyContent; + } + lpKeyContentLast = lpKeyContent; + lpKeyContent->lpkeyname = MYALLOC(strlen(lpKeyName) + 1); + strcpy(lpKeyContent->lpkeyname, lpKeyName); + lpKeyContent->lpfatherkey = lpFatherKeyContent; + //DebugLog("debug_getkey.log",lpKeyName,hWnd,TRUE); + +#ifdef DEBUGLOG + lstrdb1 = MYALLOC0(100); + sprintf(lstrdb1, "LGKN:%08d KN:%08d", LengthOfLongestSubkeyName, LengthOfKeyName); + DebugLog("debug_key.log", lstrdb1, hWnd, TRUE); + DebugLog("debug_key.log", GetWholeKeyName(lpKeyContent), hWnd, TRUE); + MYFREE(lstrdb1); + +#endif + + nGettingKey++; + + if (RegOpenKeyEx(hkey, lpKeyName, 0, KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS, &Subhkey) != ERROR_SUCCESS) { + continue; + } + if (IsInSkipList(lpKeyName, lplpRegSkipStrings)) { + // tfx + RegCloseKey(Subhkey); // 1.8.2 seperate + continue; + } + + GetRegistrySnap(Subhkey, lpKeyContent); + RegCloseKey(Subhkey); + } + + nGettingTime = GetTickCount(); + if ((nGettingTime - nBASETIME1) > REFRESHINTERVAL) { + UpdateCounters(lan_key, lan_value, nGettingKey, nGettingValue); + } + + + return ; +} + + +//-------------------------------------------------- +// Registry save engine +//-------------------------------------------------- +VOID SaveRegKey(LPKEYCONTENT lpKeyContent, DWORD nFPCurrentFatherKey, DWORD nFPCaller) +{ + DWORD nFPTemp4Write; + DWORD nFPHeader; + DWORD nFPCurrent; + DWORD nLenPlus1; + INT nPad; + INT nPad1; + LPVALUECONTENT lpv; + + // Note use (DWORD) to disable warning of lost of data to convert size_t to dword, in current windows,it is safe that registry's xxxxname is stay in DWORD long + nLenPlus1 = (DWORD)strlen(lpKeyContent->lpkeyname) + 1; // Get len+1 + nPad = (nLenPlus1 % sizeof(DWORD) == 0) ? 0 : (sizeof(DWORD) - nLenPlus1 % sizeof(DWORD)); + nFPHeader = SetFilePointer(hFileWholeReg, 0, NULL, FILE_CURRENT); // Save head fp + + // using struct ,idea from maddes + sKC.fpos_keyname = nFPHeader + sizeof(SAVEKEYCONTENT); + sKC.fpos_firstvalue = (lpKeyContent->lpfirstvalue != NULL) ? (nFPHeader + sizeof(SAVEKEYCONTENT) + nLenPlus1 + nPad) : 0; + sKC.fpos_firstsubkey = 0; // it is filled later. + sKC.fpos_brotherkey = 0; // it is filled later + sKC.fpos_fatherkey = nFPCurrentFatherKey; + sKC.bkeymatch = 0; + WriteFile(hFileWholeReg, &sKC, sizeof(sKC), &NBW, NULL); + +/* + nFPTemp4Write = nFPHeader + sizeof(KEYCONTENT); + WriteFile(hFileWholeReg, &nFPTemp4Write, sizeof(nFPTemp4Write), &NBW, NULL); // Save the location of lpkeyname + + nPad = (nLenPlus1 % sizeof(int) == 0) ? 0 : ( sizeof(int) - nLenPlus1 % sizeof(int) ); + nFPTemp4Write = (lpKeyContent->lpfirstvalue != NULL) ? (nFPHeader + sizeof(KEYCONTENT) + nLenPlus1 + nPad) : 0; + WriteFile(hFileWholeReg, &nFPTemp4Write, sizeof(nFPTemp4Write), &NBW, NULL); // Save the location of lpfirstvalue + + WriteFile(hFileWholeReg, (LPBYTE)lpKeyContent + sizeof(LPSTR)+sizeof(LPVALUECONTENT), sizeof(LPKEYCONTENT)*2, &NBW, NULL); // Save lpfirstsubkey and lpbrotherkey + WriteFile(hFileWholeReg, &nFPCurrentFatherKey, sizeof(nFPCurrentFatherKey), &NBW, NULL); // Save nFPCurrentFatherKey passed by caller + + lpKeyContent->bkeymatch=0; + WriteFile(hFileWholeReg, &(lpKeyContent->bkeymatch), sizeof(lpKeyContent->bkeymatch), &NBW, NULL); // Clear and save bkeymatch +*/ + WriteFile(hFileWholeReg, lpKeyContent->lpkeyname, nLenPlus1, &NBW, NULL); // Save the current keyname + + nFPTemp4Write = 0; + if (nPad > 0) { + WriteFile(hFileWholeReg, &nFPTemp4Write, nPad, &NBW, NULL); + } + + + + // Save the sub-value of current KeyContent + for (lpv = lpKeyContent->lpfirstvalue; lpv != NULL; lpv = lpv->lpnextvalue) { + + nLenPlus1 = (DWORD)strlen(lpv->lpvaluename) + 1; + nPad = (nLenPlus1 % sizeof(DWORD) == 0) ? 0 : (sizeof(DWORD) - nLenPlus1 % sizeof(DWORD)); + nPad1 = (lpv->datasize % sizeof(DWORD) == 0) ? 0 : (sizeof(DWORD) - lpv->datasize % sizeof(DWORD)); + + nFPCurrent = SetFilePointer(hFileWholeReg, 0, NULL, FILE_CURRENT); // Save fp + sVC.typecode = lpv->typecode; + sVC.datasize = lpv->datasize; + sVC.fpos_valuename = nFPCurrent + sizeof(SAVEVALUECONTENT); + sVC.fpos_valuedata = (lpv->datasize > 0) ? (nFPCurrent + sizeof(SAVEVALUECONTENT) + nLenPlus1 + nPad) : 0; // if no lpvaluedata, we write 0 + sVC.fpos_nextvalue = (lpv->lpnextvalue != NULL) ? (nFPCurrent + sizeof(SAVEVALUECONTENT) + nLenPlus1 + nPad + lpv->datasize + nPad1) : 0; // if no nextvalue we write 0 + sVC.fpos_fatherkey = nFPHeader; + sVC.bvaluematch = 0; + WriteFile(hFileWholeReg, &sVC, sizeof(sVC), &NBW, NULL); + +/* + WriteFile(hFileWholeReg, (LPBYTE)lpv, sizeof(DWORD)*2, &NBW, NULL); + + nFPTemp4Write = nFPCurrent + sizeof(VALUECONTENT); + WriteFile(hFileWholeReg, &nFPTemp4Write, sizeof(nFPTemp4Write), &NBW, NULL); // Save location of lpvaluename + + nPad = (nLenPlus1 % sizeof(int) == 0) ? 0 : (sizeof(int) - nLenPlus1 % sizeof(int)); // determine if pad to 4bytes is needed + nFPTemp4Write = (lpv->datasize > 0) ? (nFPCurrent + sizeof(VALUECONTENT) + nLenPlus1 + nPad) : 0; // if no lpvaluedata, we write 0 + WriteFile(hFileWholeReg, &nFPTemp4Write, sizeof(nFPTemp4Write), &NBW, NULL); // Save location of lpvaluedata + + nPad1 = (lpv->datasize % sizeof(int) == 0) ? 0 : (sizeof(int) - lpv->datasize % sizeof(int)); + nFPTemp4Write = (lpv->lpnextvalue != NULL) ? (nFPCurrent + sizeof(VALUECONTENT) + nLenPlus1 + nPad + lpv->datasize + nPad1) : 0; // if no nextvalue we write 0 + WriteFile(hFileWholeReg, &nFPTemp4Write, sizeof(nFPTemp4Write), &NBW, NULL); // Save location of next subvalue + + nFPTemp4Write = nFPHeader; + WriteFile(hFileWholeReg, &nFPTemp4Write, sizeof(nFPTemp4Write), &NBW, NULL); // Save location of current key + + lpv->bvaluematch=0; + WriteFile(hFileWholeReg, &(lpv->bvaluematch), sizeof(lpv->bvaluematch), &NBW, NULL); // Clear and save bvaluematch +*/ + WriteFile(hFileWholeReg, lpv->lpvaluename, nLenPlus1, &NBW, NULL); // Save lpvaluename + + nFPTemp4Write = 0; + if (nPad > 0) { + WriteFile(hFileWholeReg, &nFPTemp4Write, nPad, &NBW, NULL); + } + + if (lpv->datasize > 0) { + WriteFile(hFileWholeReg, lpv->lpvaluedata, lpv->datasize, &NBW, NULL); // Save lpvaluedata + + if (nPad1 > 0) { + WriteFile(hFileWholeReg, &nFPTemp4Write, nPad1, &NBW, NULL); + } + } + + + } + + if (lpKeyContent->lpfirstsubkey != NULL) { + // pass this keycontent's position as subkey's fatherkey's position and pass the "lpfirstsubkey field" + SaveRegKey(lpKeyContent->lpfirstsubkey, nFPHeader, nFPHeader + 2 * sizeof(DWORD)); + } + + if (lpKeyContent->lpbrotherkey != NULL) { + // pass this key's fatherkey's position as brother's father and pass "lpbrotherkey field" + SaveRegKey(lpKeyContent->lpbrotherkey, nFPCurrentFatherKey, nFPHeader + 3 * sizeof(DWORD)); + } + + if (nFPCaller > 0) { // save position of current key in current father key + nFPCurrent = SetFilePointer(hFileWholeReg, 0, NULL, FILE_CURRENT); + SetFilePointer(hFileWholeReg, nFPCaller, NULL, FILE_BEGIN); + WriteFile(hFileWholeReg, &nFPHeader, sizeof(nFPHeader), &NBW, NULL); + SetFilePointer(hFileWholeReg, nFPCurrent, NULL, FILE_BEGIN); + } + + nSavingKey++; + if (nGettingKey != 0) + if (nSavingKey % nGettingKey > nRegStep) { + nSavingKey = 0; + SendDlgItemMessage(hWnd, IDC_PBCOMPARE, PBM_STEPIT, (WPARAM)0, (LPARAM)0); + UpdateWindow(hWnd); + PeekMessage(&msg, hWnd, WM_ACTIVATE, WM_ACTIVATE, PM_REMOVE); + } + +} + + +//-------------------------------------------------- +// Routine to call registry save engine and file save engine +//-------------------------------------------------- +VOID SaveHive(LPKEYCONTENT lpKeyHLM, LPKEYCONTENT lpKeyUSER, + LPHEADFILE lpHF, LPSTR computer, LPSTR user, LPVOID time) +{ + DWORD nFPcurrent; + DWORD nFPcurrent1; + LPHEADFILE lphf; + HIVEHEADER hiveheader; + SAVEHEADFILE sh; + + if (lpKeyHLM != NULL || lpKeyUSER != NULL) { + + opfn.lStructSize = sizeof(opfn); + opfn.hwndOwner = hWnd; + opfn.lpstrFilter = str_filter; + opfn.lpstrFile = MYALLOC0(MAX_PATH *2 + 2); + opfn.nMaxFile = MAX_PATH; + opfn.lpstrInitialDir = lpLastSaveDir; + opfn.lpstrDefExt = "hiv"; + opfn.Flags = OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY; + if (GetSaveFileName(&opfn)) { + hFileWholeReg = CreateFile(opfn.lpstrFile, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); + if (hFileWholeReg != INVALID_HANDLE_VALUE) { + + UI_BeforeClear(); + InitProgressBar(); + + //WriteFile(hFileWholeReg, str_RegshotHiveSignature, sizeof(str_RegshotHiveSignature) - 1, &NBW, NULL); // save lpvaluedata + + // 0 signature( <= 12) last 4 bytes may be used in furture + // 16 startoflpkeyhlm (512) + // 20 startoflpkeyuser(???) + // 24 fileheadchain begin (new) ->(file -> nextfilehead(4) next4bytes is filecontent) added in 1.8 + // 28 future use! + // 32 computer name + // 96 username + // 160 systemtime + + ZeroMemory(&hiveheader, sizeof(hiveheader)); + // Save the position of H_L_M + hiveheader.offsetkeyhklm = HIVEBEGINOFFSET; + + SetFilePointer(hFileWholeReg, HIVEBEGINOFFSET, NULL, FILE_BEGIN); + if (lpKeyHLM != NULL) { //always + SaveRegKey(lpKeyHLM, 0, 0); + } + + // Save the position of hkeyUsr + nFPcurrent = SetFilePointer(hFileWholeReg, 0, NULL, FILE_CURRENT); + hiveheader.offsetkeyuser = nFPcurrent; + + if (lpKeyUSER != NULL) { //always + SaveRegKey(lpKeyUSER, 0, 0); + } + + if (lpHF != NULL) { + // Write start position of file chain + nFPcurrent = SetFilePointer(hFileWholeReg, 0, NULL, FILE_CURRENT); + hiveheader.offsetheadfile = nFPcurrent; + + + for (lphf = lpHF; lphf != NULL;) { + + nFPcurrent = SetFilePointer(hFileWholeReg, 0, NULL, FILE_CURRENT); // save place for next filehead in chain + sh.fpos_filecontent = nFPcurrent + sizeof(sh.fpos_nextheadfile) + sizeof(sh.fpos_filecontent); + + SetFilePointer(hFileWholeReg, sizeof(sh), NULL, FILE_CURRENT); + + SaveFileContent(lphf->lpfilecontent, 0, 0); + + nFPcurrent1 = SetFilePointer(hFileWholeReg, 0, NULL, FILE_CURRENT); + lphf = lphf->lpnextheadfile; + sh.fpos_nextheadfile = (lphf != NULL) ? nFPcurrent1 : 0; + SetFilePointer(hFileWholeReg, nFPcurrent , NULL, FILE_BEGIN); + WriteFile(hFileWholeReg, &sh, sizeof(sh), &NBW, NULL); + if (lphf == NULL) { + break; + } + + SetFilePointer(hFileWholeReg, nFPcurrent1, NULL, FILE_BEGIN); + } + } + + + + + CopyMemory(hiveheader.signature, str_RegshotHiveSignature, sizeof(str_RegshotHiveSignature) - 1); + CopyMemory(hiveheader.computername, computer, strlen(computer)); + CopyMemory(hiveheader.username, user, strlen(user)); + CopyMemory(&hiveheader.systemtime, time, sizeof(SYSTEMTIME)); + + SetFilePointer(hFileWholeReg, 0 , NULL, FILE_BEGIN); + + WriteFile(hFileWholeReg, &hiveheader, sizeof(hiveheader), &NBW, NULL); + + ShowWindow(GetDlgItem(hWnd, IDC_PBCOMPARE), SW_HIDE); + + SetCursor(hSaveCursor); + MessageBeep(0xffffffff); + CloseHandle(hFileWholeReg); + } else { + ErrMsg((LPCSTR)lan_errorcreatefile); + } + + } + *(opfn.lpstrFile + opfn.nFileOffset) = 0x00; + strcpy(lpLastSaveDir, opfn.lpstrFile); + MYFREE(opfn.lpstrFile); + } +} +#ifdef _WIN64 +//------------------------------------------------------------- +//Rebuild registry snap from file buffer +//------------------------------------------------------------- +VOID RebuildFromHive_reg(LPSAVEKEYCONTENT lpFile, LPKEYCONTENT lpFatherkey, LPKEYCONTENT lpKey, LPBYTE lpHiveFileBase) +{ + LPVALUECONTENT lpValue; + LPVALUECONTENT lpValueLast; + LPSAVEVALUECONTENT lpv; + LPKEYCONTENT lpsubkey; + + lpValueLast = NULL; + + if (lpFile->fpos_keyname != 0) { + lpKey->lpkeyname = (LPSTR)(lpHiveFileBase + lpFile->fpos_keyname); + } + lpKey->lpfatherkey = lpFatherkey; + + nGettingKey++; + + for (lpv = (LPSAVEVALUECONTENT)(lpHiveFileBase + lpFile->fpos_firstvalue); lpHiveFileBase != (LPBYTE)lpv ; lpv = (LPSAVEVALUECONTENT)(lpHiveFileBase + lpv->fpos_nextvalue)) { + lpValue = MYALLOC0(sizeof(VALUECONTENT)); + if (lpValueLast != NULL) { + lpValueLast->lpnextvalue = lpValue; + } else { + lpKey->lpfirstvalue = lpValue; + } + + lpValue->typecode = lpv->typecode; + lpValue->datasize = lpv->datasize; + if (lpv->fpos_valuename != 0) { + lpValue->lpvaluename = (LPSTR)(lpHiveFileBase + lpv->fpos_valuename); + } + if (lpv->fpos_valuedata != 0) { + lpValue->lpvaluedata = lpHiveFileBase + lpv->fpos_valuedata; + } + + lpValue->lpfatherkey = lpKey; + lpValueLast = lpValue; + + nGettingValue++; + } + + + if (lpFile->fpos_firstsubkey != 0) { + lpsubkey = MYALLOC0(sizeof(KEYCONTENT)); + lpKey->lpfirstsubkey = lpsubkey; + RebuildFromHive_reg((LPSAVEKEYCONTENT)(lpHiveFileBase + lpFile->fpos_firstsubkey), lpKey, lpsubkey, lpHiveFileBase); + } + + if (lpFile->fpos_brotherkey != 0) { + lpsubkey = MYALLOC0(sizeof(KEYCONTENT)); + lpKey->lpbrotherkey = lpsubkey; + RebuildFromHive_reg((LPSAVEKEYCONTENT)(lpHiveFileBase + lpFile->fpos_brotherkey), lpKey, lpsubkey, lpHiveFileBase); + } + nGettingTime = GetTickCount(); + if ((nGettingTime - nBASETIME1) > REFRESHINTERVAL) { + UpdateCounters(lan_key, lan_value, nGettingKey, nGettingValue); + } + +} + +#else + + +//-------------------------------------------------- +// Realign key & value content after loading from hive file +//-------------------------------------------------- +VOID ReAlignReg(LPKEYCONTENT lpKey, size_t nBase) +{ + LPVALUECONTENT lpv; + + if (lpKey->lpkeyname != NULL) { + lpKey->lpkeyname += nBase; + } + if (lpKey->lpfirstvalue != NULL) { + lpKey->lpfirstvalue = (LPVALUECONTENT)((LPBYTE)lpKey->lpfirstvalue + nBase); + } + if (lpKey->lpfirstsubkey != NULL) { + lpKey->lpfirstsubkey = (LPKEYCONTENT)((LPBYTE)lpKey->lpfirstsubkey + nBase); + } + if (lpKey->lpbrotherkey != NULL) { + lpKey->lpbrotherkey = (LPKEYCONTENT)((LPBYTE)lpKey->lpbrotherkey + nBase); + } + if (lpKey->lpfatherkey != NULL) { + lpKey->lpfatherkey = (LPKEYCONTENT)((LPBYTE)lpKey->lpfatherkey + nBase); + } + + nGettingKey++; + + for (lpv = lpKey->lpfirstvalue; lpv != NULL; lpv = lpv->lpnextvalue) { + + if (lpv->lpvaluename != NULL) { + lpv->lpvaluename += nBase; + } + if (lpv->lpvaluedata != NULL) { + lpv->lpvaluedata += nBase; + } + if (lpv->lpnextvalue != NULL) { + lpv->lpnextvalue = (LPVALUECONTENT)((LPBYTE)lpv->lpnextvalue + nBase); + } + if (lpv->lpfatherkey != NULL) { + lpv->lpfatherkey = (LPKEYCONTENT)((LPBYTE)lpv->lpfatherkey + nBase); + } + + } + + if (lpKey->lpfirstsubkey != NULL) { + ReAlignReg(lpKey->lpfirstsubkey, nBase); + } + + if (lpKey->lpbrotherkey != NULL) { + ReAlignReg(lpKey->lpbrotherkey, nBase); + } +} +#endif + + +//--------------------------------------------------------------------------------- +// Load registry from HIVE file (After this, we should realign the data in memory) +//--------------------------------------------------------------------------------- +BOOL LoadHive(LPKEYCONTENT FAR *lplpKeyHLM, LPKEYCONTENT FAR *lplpKeyUSER, + LPHEADFILE FAR *lplpHeadFile, LPBYTE FAR *lpHive) +{ + DWORD nFileSize; + size_t nBase; + DWORD i, j; + DWORD nRemain; + DWORD nReadSize; + HIVEHEADER hiveheader; + char sname[MAX_PATH*2 + 2]; + + ZeroMemory(sname, sizeof(sname)); + + opfn.lStructSize = sizeof(opfn); + opfn.hwndOwner = hWnd; + opfn.lpstrFilter = str_filter; + opfn.lpstrFile = sname; + opfn.nMaxFile = MAX_PATH; + opfn.lpstrInitialDir = lpLastOpenDir; + opfn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY; + opfn.lpstrDefExt = "hiv"; + if (!GetOpenFileName(&opfn)) { + return FALSE; + } + hFileWholeReg = CreateFile(opfn.lpstrFile, GENERIC_READ , FILE_SHARE_READ , NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + if (hFileWholeReg == INVALID_HANDLE_VALUE) { + ErrMsg((LPCSTR)lan_erroropenfile); + return FALSE; + } + nFileSize = GetFileSize(hFileWholeReg, NULL); + if (nFileSize < sizeof(HIVEHEADER)) { + CloseHandle(hFileWholeReg); + ErrMsg((LPCSTR)"wrong filesize"); + return FALSE; + } + + ZeroMemory(&hiveheader, sizeof(HIVEHEADER)); + ReadFile(hFileWholeReg, &hiveheader, sizeof(HIVEHEADER), &NBW, NULL); + + + if (strcmp(str_RegshotHiveSignature, (const char *)(hiveheader.signature)) != 0) { + CloseHandle(hFileWholeReg); + ErrMsg((LPCSTR)"It is not a compatible hive to current version or it is not a valid Regshot hive file!"); + return FALSE; + } + //May add some check here + + + nGettingKey = 0; + nGettingFile = 0; + if (is1) { + UI_BeforeShot(IDC_1STSHOT); + } else { + UI_BeforeShot(IDC_2NDSHOT); + } + + *lpHive = MYALLOC(nFileSize); + + SetFilePointer(hFileWholeReg, 0, NULL, FILE_BEGIN); + + InitProgressBar(); +#define READ_BATCH_SIZE 8192 + nFileStep = nFileSize / READ_BATCH_SIZE / MAXPBPOSITION; + + for (i = 0, j = 0, nRemain = nFileSize;; i += READ_BATCH_SIZE, j++) { + if (nRemain >= READ_BATCH_SIZE) { + nReadSize = READ_BATCH_SIZE; + } else { + nReadSize = nRemain; + } + // Crash bug made in 1.8.0 tianwei, fixed in 1.8.1 tianwei + ReadFile(hFileWholeReg, (*lpHive) + i, nReadSize, &NBW, NULL); // read the whole file now + if (NBW != nReadSize) { + CloseHandle(hFileWholeReg); + ErrMsg((LPCSTR)"Reading ERROR!"); + return FALSE; + } + nRemain -= nReadSize; + if (nRemain == 0) { + break; + } + if (j % (nFileSize / READ_BATCH_SIZE) > nFileStep) { + j = 0; + SendDlgItemMessage(hWnd, IDC_PBCOMPARE, PBM_STEPIT, (WPARAM)0, (LPARAM)0); + UpdateWindow(hWnd); + PeekMessage(&msg, hWnd, WM_ACTIVATE, WM_ACTIVATE, PM_REMOVE); + } + } +#undef READ_BATCH_SIZE + ShowWindow(GetDlgItem(hWnd, IDC_PBCOMPARE), SW_HIDE); + + nBase = (size_t) * lpHive; + *lplpKeyHLM = (LPKEYCONTENT)(nBase + hiveheader.offsetkeyhklm); + *lplpKeyUSER = (LPKEYCONTENT)(nBase + hiveheader.offsetkeyuser); + *lplpHeadFile = (hiveheader.offsetheadfile == 0) ? NULL : (LPHEADFILE)(nBase + hiveheader.offsetheadfile); + +#ifdef _WIN64 + nGettingKey = 2; + nGettingValue = 0; + nGettingTime = 0; + nGettingFile = 0; + nGettingDir = 0; + nBASETIME = GetTickCount(); + nBASETIME1 = nBASETIME; + if (is1) { + UI_BeforeShot(IDC_1STSHOT); + } else { + UI_BeforeShot(IDC_2NDSHOT); + } + + *lplpKeyHLM = MYALLOC0(sizeof(KEYCONTENT)); + *lplpKeyUSER = MYALLOC0(sizeof(KEYCONTENT)); + RebuildFromHive_reg((LPSAVEKEYCONTENT)(nBase + hiveheader.offsetkeyhklm), NULL, *lplpKeyHLM , *lpHive); + RebuildFromHive_reg((LPSAVEKEYCONTENT)(nBase + hiveheader.offsetkeyuser), NULL, *lplpKeyUSER , *lpHive); + nGettingTime = GetTickCount(); + UpdateCounters(lan_key, lan_value, nGettingKey, nGettingValue); + +#else + ReAlignReg(*lplpKeyHLM, nBase); + ReAlignReg(*lplpKeyUSER, nBase); +#endif + + + if (*lplpHeadFile != NULL) { + SendMessage(GetDlgItem(hWnd, IDC_CHECKDIR), BM_SETCHECK, (WPARAM)BST_CHECKED, (LPARAM)0); + SendMessage(hWnd, WM_COMMAND, (WPARAM)IDC_CHECKDIR, (LPARAM)0); +#ifdef _WIN64 + *lplpHeadFile = MYALLOC0(sizeof(HEADFILE)); + RebuildFromHive_filehead((LPSAVEHEADFILE)(nBase + hiveheader.offsetheadfile), *lplpHeadFile, *lpHive); + nGettingTime = GetTickCount(); + UpdateCounters(lan_dir, lan_file, nGettingDir, nGettingFile); +#else + ReAlignFile(*lplpHeadFile, nBase); +#endif + FindDirChain(*lplpHeadFile, lpExtDir, EXTDIRLEN); // Get new chains, must do this after ReAlignFile! + SetDlgItemText(hWnd, IDC_EDITDIR, lpExtDir); + } else { + SetDlgItemText(hWnd, IDC_EDITDIR, ""); + } + + + if (is1) { + // Use copymemory in 1.8, old version direct point to, which is wrong + CopyMemory(lpComputerName1, hiveheader.computername, COMPUTERNAMELEN); + CopyMemory(lpUserName1, hiveheader.username, COMPUTERNAMELEN); + CopyMemory(lpSystemtime1, &hiveheader.systemtime, sizeof(SYSTEMTIME)); + } else { + CopyMemory(lpComputerName2, hiveheader.computername, COMPUTERNAMELEN); + CopyMemory(lpUserName2, hiveheader.username, COMPUTERNAMELEN); + CopyMemory(lpSystemtime2, &hiveheader.systemtime, sizeof(SYSTEMTIME)); + } + + UI_AfterShot(); + + CloseHandle(hFileWholeReg); + + *(opfn.lpstrFile + opfn.nFileOffset) = 0x00; + strcpy(lpLastOpenDir, opfn.lpstrFile); + + + return TRUE; + +} diff --git a/RegShot/src/regshot.rc b/RegShot/src/regshot.rc new file mode 100644 index 0000000..3fbad61 --- /dev/null +++ b/RegShot/src/regshot.rc @@ -0,0 +1,177 @@ +// Microsoft Visual C++ generated resource script. +// +#include "resource.h" +#include "version.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (United States) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_DIALOG1 DIALOGEX 0, 0, 194, 166 +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU +EXSTYLE WS_EX_APPWINDOW +CAPTION REGSHOT_TITLE +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + DEFPUSHBUTTON "&1st shot",IDC_1STSHOT,137,10,49,13 + PUSHBUTTON "&2nd shot",IDC_2NDSHOT,137,27,49,13,WS_DISABLED + PUSHBUTTON "C&ompare",IDC_COMPARE,137,45,49,13,WS_DISABLED + PUSHBUTTON "&Clear",IDC_CLEAR1,137,63,49,13,WS_DISABLED + PUSHBUTTON "&Quit",IDC_CANCEL1,137,81,49,13 + PUSHBUTTON "&About",IDC_ABOUT,137,99,49,13 + COMBOBOX IDC_COMBOLANGUAGE,137,134,50,55,CBS_DROPDOWNLIST | CBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP + CONTROL "Plain &TXT",IDC_RADIO1,"Button",BS_AUTORADIOBUTTON,11,19,46,10 + CONTROL "&HTML document",IDC_RADIO2,"Button",BS_AUTORADIOBUTTON,60,19,71,10 + CONTROL "&Scan dir1[;dir2;dir3;...;dir nn]:",IDC_CHECKDIR,"Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,11,45,120,10 + EDITTEXT IDC_EDITDIR,11,58,94,14,ES_AUTOHSCROLL + PUSHBUTTON "...",IDC_BROWSE1,108,58,18,13 + EDITTEXT IDC_EDITPATH,12,94,94,14,ES_AUTOHSCROLL + PUSHBUTTON "...",IDC_BROWSE2,108,95,18,13 + EDITTEXT IDC_EDITCOMMENT,11,128,114,14,ES_AUTOHSCROLL + LTEXT "",IDC_TEXTCOUNT1,8,153,54,8,NOT WS_VISIBLE + LTEXT "",IDC_TEXTCOUNT2,69,153,59,8,NOT WS_VISIBLE + LTEXT "",IDC_TEXTCOUNT3,134,153,55,8,NOT WS_VISIBLE + GROUPBOX "Compare logs save as:",IDC_STATICSAVEFORMAT,6,7,125,27 + GROUPBOX "",IDC_STATIC,6,37,125,40 + GROUPBOX "Output path:",IDC_STATICOUTPUTPATH,6,82,125,31 + GROUPBOX "Add comment into the log:",IDC_STATICADDCOMMENT,6,117,125,31 + CONTROL "Progress1",IDC_PBCOMPARE,"msctls_progress32",NOT WS_VISIBLE | WS_BORDER,7,153,180,9 +END + + +///////////////////////////////////////////////////////////////////////////// +// +// DESIGNINFO +// + +#ifdef APSTUDIO_INVOKED +GUIDELINES DESIGNINFO +BEGIN + IDD_DIALOG1, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 187 + VERTGUIDE, 11 + VERTGUIDE, 131 + VERTGUIDE, 137 + VERTGUIDE, 186 + TOPMARGIN, 7 + BOTTOMMARGIN, 163 + END +END +#endif // APSTUDIO_INVOKED + + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""afxres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +IDI_MAINICON ICON "res\\regshot.ico" + +///////////////////////////////////////////////////////////////////////////// +// +// RT_MANIFEST +// + +1 RT_MANIFEST "res\\Regshot.exe.manifest" + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION REGSHOT_VERSION_NUM + PRODUCTVERSION REGSHOT_VERSION_NUM + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x1L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "CompanyName", "Regshot Team" + VALUE "FileDescription", REGSHOT_TITLE + VALUE "FileVersion", REGSHOT_VERSION + VALUE "InternalName", "Regshot" + VALUE "LegalCopyright", REGSHOT_VERSION_COPYRIGHT + VALUE "OriginalFilename", "Regshot.exe" + VALUE "ProductName", "Regshot" + VALUE "ProductVersion", REGSHOT_VERSION + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END + +#endif // English (United States) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/RegShot/src/res/Regshot.exe.manifest b/RegShot/src/res/Regshot.exe.manifest new file mode 100644 index 0000000..b187013 --- /dev/null +++ b/RegShot/src/res/Regshot.exe.manifest @@ -0,0 +1,40 @@ + + + + Regshot + + + + + + + + + + + + + + + + + + + + + true + + + \ No newline at end of file diff --git a/RegShot/src/res/regshot.ico b/RegShot/src/res/regshot.ico new file mode 100644 index 0000000000000000000000000000000000000000..270fc168a3e9307dcd2224fa0050d94f4c57c8aa GIT binary patch literal 22486 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 literal 0 HcmV?d00001 diff --git a/RegShot/src/resource.h b/RegShot/src/resource.h new file mode 100644 index 0000000..9c478d6 --- /dev/null +++ b/RegShot/src/resource.h @@ -0,0 +1,77 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Developer Studio generated include file. +// Used by regshot.rc +// +#ifndef IDC_STATIC +#define IDC_STATIC -1 +#endif + +#define IDD_DIALOG1 100 +#define IDD_DIALOG2 101 +#define IDI_MAINICON 111 +#define ID_BASE 1000 + +#define IDC_1STSHOT 1003 +#define IDC_2NDSHOT 1004 +#define IDC_COMPARE 1005 +#define IDC_CLEAR1 1006 +#define IDC_CANCEL1 1007 +#define IDC_ABOUT 1008 +#define IDC_MONITOR 1009 +#define IDC_STATICSAVEFORMAT 1010 +#define IDC_STATICOUTPUTPATH 1011 +#define IDC_STATICADDCOMMENT 1012 +#define IDC_RADIO1 1013 +#define IDC_RADIO2 1014 +#define IDC_CHECKDIR 1015 + +#define IDC_STATICSERVICE 1016 +#define IDC_STATICRING3 1017 +#define IDC_SETMASK 1018 +#define IDC_CHECKONTOP 1019 +#define IDC_CHECKPAUSE 1020 +#define IDC_CLEAR2 1021 +#define IDC_SAVE 1022 +#define IDC_CANCEL2 1023 +#define IDC_PBCOMPARE 1024 +#define IDC_EDITCOMMENT 1025 +#define IDC_EDITPATH 1026 +#define IDC_EDITDIR 1027 +#define IDC_TEXTCOUNT1 1028 +#define IDC_TEXTCOUNT2 1029 +#define IDC_TEXTCOUNT3 1030 +#define IDC_BROWSE1 1031 +#define IDC_BROWSE2 1032 +#define IDC_COMBOLANGUAGE 1033 +#define IDC_RegOpenKey 1034 +#define IDC_RegCloseKey 1035 +#define IDC_RegCreateKey 1036 +#define IDC_RegDeleteKey 1037 +#define IDC_RegSetValue 1038 +#define IDC_RegSetValueEx 1039 +#define IDC_RegQueryValue 1040 +#define IDC_RegQueryValueEx 1041 +#define IDC_RegDeleteValue 1042 +#define IDC_RegEnumKey 1043 +#define IDC_RegEnumValue 1044 +#define IDC_RegFlushKey 1045 +#define IDC_EDITRING3 1046 +#define IDC_LIST1 1047 +#define IDM_SHOTONLY 1048 +#define IDM_SHOTSAVE 1049 +#define IDM_LOAD 1050 +#define IDM_BREAK 1051 +#define IDM_CLEARALLSHOTS 1052 +#define IDM_CLEARSHOT1 1053 +#define IDM_CLEARSHOT2 1054 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 120 +#define _APS_NEXT_COMMAND_VALUE 40007 +#define _APS_NEXT_CONTROL_VALUE 1055 +#define _APS_NEXT_SYMED_VALUE 102 +#endif +#endif diff --git a/RegShot/src/setup.c b/RegShot/src/setup.c new file mode 100644 index 0000000..ecb1668 --- /dev/null +++ b/RegShot/src/setup.c @@ -0,0 +1,172 @@ +/* + Copyright 2004 tulipfan + + This file is part of Regshot. + + Regshot is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + Regshot is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Regshot; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +/* This file orignal coded by tulipfan + * Change function/variable name to more proper ones and fix for x64 by tianwei +*/ + +#include "global.h" +// 1.8.2 move defination from global.h to this place +#define SIZEOF_INI_SKIPBLOCK 65535 +#define MAX_INI_SKIPITEMS 100 + +// setup based on regshot.ini by tulipfan (tfx) +LPSTR INI_SETUP = "Setup"; +LPSTR INI_FLAG = "Flag"; +LPSTR INI_EXTDIR = "ExtDir"; +LPSTR INI_OUTDIR = "OutDir"; +LPSTR INI_SKIPREGKEY = "SkipRegKey"; +LPSTR INI_SKIPDIR = "SkipDir"; +LPSTR INI_USELONGREGHEAD = "UseLongRegHead"; // 1.8.1 tianwei for compatible to undoreg 1.46 again + + +BOOL LoadSettingsFromIni(HWND hDlg) // tfx get ini info (translate from chinese comment) +{ + int i; + LPBYTE lpReturn; + BYTE nFlag; + + char lpIniKey[16]; + + lplpRegSkipStrings = MYALLOC0(sizeof(LPSTR) * MAX_INI_SKIPITEMS); + lpRegSkipStrings = MYALLOC0(SIZEOF_INI_SKIPBLOCK); + if (GetPrivateProfileSection(INI_SKIPREGKEY, (LPSTR)lpRegSkipStrings, SIZEOF_INI_SKIPBLOCK, lpRegshotIni) > 0) { + for (i = 0; i < MAX_INI_SKIPITEMS - 1; i++) { + sprintf(lpIniKey, "%d%s", i, "="); + if ((lpReturn = AtPos(lpRegSkipStrings, (LPBYTE)lpIniKey, SIZEOF_INI_SKIPBLOCK, strlen(lpIniKey))) != NULL) { + *(lplpRegSkipStrings + i) = lpReturn; + //dwSnapFiles++; + } else { + break; + } + } + } + + lplpFileSkipStrings = MYALLOC0(sizeof(LPSTR) * MAX_INI_SKIPITEMS); + lpFileSkipStrings = MYALLOC0(SIZEOF_INI_SKIPBLOCK); + if (GetPrivateProfileSection(INI_SKIPDIR, (LPSTR)lpFileSkipStrings, SIZEOF_INI_SKIPBLOCK, lpRegshotIni)) { + for (i = 0; i < MAX_INI_SKIPITEMS - 1; i++) { + sprintf(lpIniKey, "%d%s", i, "="); + if ((lpReturn = AtPos(lpFileSkipStrings, (LPBYTE)lpIniKey, SIZEOF_INI_SKIPBLOCK, strlen(lpIniKey))) != NULL) { + *(lplpFileSkipStrings + i) = lpReturn; + //dwSnapFiles++; + } else { + break; + } + } + } + + nFlag = (BYTE)GetPrivateProfileInt(INI_SETUP, INI_FLAG, 1, lpRegshotIni); // default from 0 to 1 in 1.8.2 (TEXT) + //if (nFlag != 0) + { + SendMessage(GetDlgItem(hDlg, IDC_RADIO1), BM_SETCHECK, (WPARAM)(nFlag & 0x01), (LPARAM)0); + SendMessage(GetDlgItem(hDlg, IDC_RADIO2), BM_SETCHECK, (WPARAM)((nFlag & 0x01) ^ 0x01), (LPARAM)0); + //SendMessage(GetDlgItem(hDlg,IDC_CHECKDIR),BM_SETCHECK,(WPARAM)((nFlag&0x04)>>1),(LPARAM)0); // 1.7 + SendMessage(GetDlgItem(hDlg, IDC_CHECKDIR), BM_SETCHECK, (WPARAM)((nFlag & 0x02) >> 1), (LPARAM)0); + } + /*else delete in 1.8.1 + { + SendMessage(GetDlgItem(hDlg,IDC_RADIO1),BM_SETCHECK,(WPARAM)0x01,(LPARAM)0); + SendMessage(GetDlgItem(hDlg,IDC_RADIO2),BM_SETCHECK,(WPARAM)0x00,(LPARAM)0); + SendMessage(GetDlgItem(hDlg,IDC_CHECKDIR),BM_SETCHECK,(WPARAM)0x00,(LPARAM)0); + } + */ + // added in 1.8.1 for compatible with undoreg1.46 + bUseLongRegHead = GetPrivateProfileInt(INI_SETUP, INI_USELONGREGHEAD, 0, lpRegshotIni) != 0 ? TRUE : FALSE; + + if (GetPrivateProfileString(INI_SETUP, INI_EXTDIR, NULL, lpExtDir, MAX_PATH, lpRegshotIni) != 0) { + SetDlgItemText(hDlg, IDC_EDITDIR, lpExtDir); + } else { + SetDlgItemText(hDlg, IDC_EDITDIR, lpWindowsDirName); + } + + if (GetPrivateProfileString(INI_SETUP, INI_OUTDIR, NULL, lpOutputpath, MAX_PATH, lpRegshotIni) != 0) { + SetDlgItemText(hDlg, IDC_EDITPATH, lpOutputpath); + } else { + SetDlgItemText(hDlg, IDC_EDITPATH, lpTempPath); + } + + SendMessage(hDlg, WM_COMMAND, (WPARAM)IDC_CHECKDIR, (LPARAM)0); + + return TRUE; +} + + +BOOL SaveSettingsToIni(HWND hDlg) // tfx save settings to ini (translate from chinese) +{ + BYTE nFlag; + LPSTR lpString; + HANDLE hTest; + + // 1.8.2, someone might not want to create a regshot.ini when there isn't one. :O + hTest = CreateFile(lpRegshotIni, GENERIC_READ | GENERIC_WRITE, + FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + if (hTest == INVALID_HANDLE_VALUE) { + return FALSE; + } + CloseHandle(hTest); + + //nFlag = (BYTE)(SendMessage(GetDlgItem(hDlg,IDC_RADIO1),BM_GETCHECK,(WPARAM)0,(LPARAM)0) // 1.7 + // |SendMessage(GetDlgItem(hDlg,IDC_RADIO2),BM_GETCHECK,(WPARAM)0,(LPARAM)0)<<1 + // |SendMessage(GetDlgItem(hDlg,IDC_CHECKDIR),BM_GETCHECK,(WPARAM)0,(LPARAM)0)<<2); + nFlag = (BYTE)(SendMessage(GetDlgItem(hDlg, IDC_RADIO1), BM_GETCHECK, (WPARAM)0, (LPARAM)0) | + SendMessage(GetDlgItem(hDlg, IDC_CHECKDIR), BM_GETCHECK, (WPARAM)0, (LPARAM)0) << 1); + + lpString = MYALLOC0(EXTDIRLEN + 4); + //sprintf(lpString,"%s = %d",INI_FLAG,nFlag); // 1.7 solokey + //WritePrivateProfileSection(INI_SETUP,lpString,lpRegshotIni); // 1.7 solokey, can only have one key. + + // 1.8.1 + sprintf(lpString, "%d", nFlag); + WritePrivateProfileString(INI_SETUP, INI_FLAG, lpString, lpRegshotIni); + sprintf(lpString, "%d", bUseLongRegHead); + WritePrivateProfileString(INI_SETUP, INI_USELONGREGHEAD, lpString, lpRegshotIni); + + + if (GetDlgItemText(hDlg, IDC_EDITDIR, lpString, (EXTDIRLEN/2)) != 0) { + WritePrivateProfileString(INI_SETUP, INI_EXTDIR, lpString, lpRegshotIni); + } + + if (GetDlgItemText(hDlg, IDC_EDITPATH, lpString, MAX_PATH) != 0) { + WritePrivateProfileString(INI_SETUP, INI_OUTDIR, lpString, lpRegshotIni); + } + + MYFREE(lpString); + MYFREE(lpRegshotIni); + MYFREE(lpRegSkipStrings); + MYFREE(lpFileSkipStrings); + //MYFREE(lpSnapKey); + //MYFREE(lpSnapReturn); + + return TRUE; +} + + +BOOL IsInSkipList(LPSTR lpStr, LPBYTE *lpSkipList) // tfx skip the list (translate from chinese) +{ + int i; + // todo: it seems bypass null item. But the getsetting is get all. Is it safe without the null thing? tianwei + for (i = 0; (LPSTR)(*(lpSkipList + i)) != NULL && i <= MAX_INI_SKIPITEMS - 1; i++) { + if (_stricmp(lpStr, (LPSTR)(*(lpSkipList + i))) == 0) { + return TRUE; + } + } + return FALSE; +} diff --git a/RegShot/src/ui.c b/RegShot/src/ui.c new file mode 100644 index 0000000..8f549a1 --- /dev/null +++ b/RegShot/src/ui.c @@ -0,0 +1,371 @@ +/* + Copyright 1999-2003,2007 TiANWEi + Copyright 2004 tulipfan + + This file is part of Regshot. + + Regshot is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + Regshot is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Regshot; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "global.h" + +extern LPBYTE lan_time; +extern LPBYTE lan_key; +extern LPBYTE lan_value; +extern LPBYTE lan_dir; +extern LPBYTE lan_file; +extern LPBYTE lan_menushot; +extern LPBYTE lan_menushotsave; +extern LPBYTE lan_menuload; + + +char USERSSTRING_LONG[] = "HKEY_USERS"; // 1.6 using long name, so in 1.8.1 add an option +char USERSSTRING[] = "HKU"; // in regshot.ini, "UseLongRegHead" to control this +char LOCALMACHINESTRING[] = "HKLM"; +char LOCALMACHINESTRING_LONG[] = "HKEY_LOCAL_MACHINE"; + + +void ShowHideCounters(int nCmdShow) // 1.8.2 +{ + ShowWindow(GetDlgItem(hWnd, IDC_TEXTCOUNT1), nCmdShow); + ShowWindow(GetDlgItem(hWnd, IDC_TEXTCOUNT2), nCmdShow); + ShowWindow(GetDlgItem(hWnd, IDC_TEXTCOUNT3), nCmdShow); +} + + +////////////////////////////////////////////////////////////////// +VOID InitProgressBar(VOID) +{ + // The following are not so good, but they work + nSavingKey = 0; + nComparing = 0; + nRegStep = nGettingKey / MAXPBPOSITION; + nFileStep = nGettingFile / MAXPBPOSITION; + ShowHideCounters(SW_HIDE); // 1.8.2 + SendDlgItemMessage(hWnd, IDC_PBCOMPARE, PBM_SETRANGE, (WPARAM)0, MAKELPARAM(0, MAXPBPOSITION)); + SendDlgItemMessage(hWnd, IDC_PBCOMPARE, PBM_SETPOS, (WPARAM)0, (LPARAM)0); + SendDlgItemMessage(hWnd, IDC_PBCOMPARE, PBM_SETSTEP, (WPARAM)1, (LPARAM)0); + ShowWindow(GetDlgItem(hWnd, IDC_PBCOMPARE), SW_SHOW); +} + + +void UpdateCounters(LPBYTE title1, LPBYTE title2, DWORD count1, DWORD count2) +{ + //nGettingTime = GetTickCount(); + nBASETIME1 = nGettingTime; + sprintf(lpMESSAGE, "%s%d%s%d%s", lan_time, (nGettingTime - nBASETIME) / 1000, "s", (nGettingTime - nBASETIME) % 1000, "ms"); + SendDlgItemMessage(hWnd, IDC_TEXTCOUNT3, WM_SETTEXT, (WPARAM)0, (LPARAM)lpMESSAGE); + sprintf(lpMESSAGE, "%s%d", title1, count1); + SendDlgItemMessage(hWnd, IDC_TEXTCOUNT1, WM_SETTEXT, (WPARAM)0, (LPARAM)lpMESSAGE); + sprintf(lpMESSAGE, "%s%d", title2, count2); + SendDlgItemMessage(hWnd, IDC_TEXTCOUNT2, WM_SETTEXT, (WPARAM)0, (LPARAM)lpMESSAGE); + + UpdateWindow(hWnd); + PeekMessage(&msg, hWnd, WM_ACTIVATE, WM_ACTIVATE, PM_REMOVE); + //SetForegroundWindow(hWnd); +} + + +//-------------------------------------------------- +// Prepare the GUI for the shot about to be taken +//-------------------------------------------------- +VOID UI_BeforeShot(DWORD id) +{ + hHourGlass = LoadCursor(NULL, IDC_WAIT); + hSaveCursor = SetCursor(hHourGlass); + EnableWindow(GetDlgItem(hWnd, id), FALSE); + // Added in 1.8.2 + strcpy(lpMESSAGE, " "); // clear the counters + SendDlgItemMessage(hWnd, IDC_TEXTCOUNT1, WM_SETTEXT, (WPARAM)0, (LPARAM)lpMESSAGE); + SendDlgItemMessage(hWnd, IDC_TEXTCOUNT2, WM_SETTEXT, (WPARAM)0, (LPARAM)lpMESSAGE); + SendDlgItemMessage(hWnd, IDC_TEXTCOUNT3, WM_SETTEXT, (WPARAM)0, (LPARAM)lpMESSAGE); + ShowHideCounters(SW_SHOW); +} + + +//-------------------------------------------------- +// Reset the GUI after the shot has been taken +//-------------------------------------------------- +VOID UI_AfterShot(VOID) +{ + DWORD iddef; + + if (lpHeadLocalMachine1 == NULL) { + iddef = IDC_1STSHOT; + } else if (lpHeadLocalMachine2 == NULL) { + iddef = IDC_2NDSHOT; + } else { + iddef = IDC_COMPARE; + } + EnableWindow(GetDlgItem(hWnd, IDC_CLEAR1), TRUE); + EnableWindow(GetDlgItem(hWnd, iddef), TRUE); + SendMessage(hWnd, DM_SETDEFID, (WPARAM)iddef, (LPARAM)0); + SetFocus(GetDlgItem(hWnd, iddef)); + SetCursor(hSaveCursor); + MessageBeep(0xffffffff); +} + + +//-------------------------------------------------- +// Prepare the GUI for Clearing +//-------------------------------------------------- +VOID UI_BeforeClear(VOID) +{ + //EnableWindow(GetDlgItem(hWnd,IDC_CLEAR1),FALSE); + hHourGlass = LoadCursor(NULL, IDC_WAIT); + hSaveCursor = SetCursor(hHourGlass); + ShowHideCounters(SW_HIDE); + UpdateWindow(hWnd); +} + + +//-------------------------------------------------- +// Reset the GUI after the clearing +//-------------------------------------------------- +VOID UI_AfterClear(VOID) +{ + DWORD iddef = 0; + //BOOL bChk; // used for file scan disable + + if (lpHeadLocalMachine1 == NULL) { + iddef = IDC_1STSHOT; + } else if (lpHeadLocalMachine2 == NULL) { + iddef = IDC_2NDSHOT; + } + EnableWindow(GetDlgItem(hWnd, iddef), TRUE); + EnableWindow(GetDlgItem(hWnd, IDC_COMPARE), FALSE); + + if (lpHeadLocalMachine1 == NULL && lpHeadLocalMachine2 == NULL) { + EnableWindow(GetDlgItem(hWnd, IDC_2NDSHOT), FALSE); + EnableWindow(GetDlgItem(hWnd, IDC_CLEAR1), FALSE); + //bChk = TRUE; + } + //else // I forgot to comment out this, fixed at 1.8.2 + //bChk = FALSE; + + //EnableWindow(GetDlgItem(hWnd,IDC_CHECKDIR),bChk); // Not used 1.8; we only enable chk when clear all + //SendMessage(hWnd,WM_COMMAND,(WPARAM)IDC_CHECKDIR,(LPARAM)0); + + SetFocus(GetDlgItem(hWnd, iddef)); + SendMessage(hWnd, DM_SETDEFID, (WPARAM)iddef, (LPARAM)0); + SetCursor(hSaveCursor); + MessageBeep(0xffffffff); +} + + +// ----------------------------- +VOID Shot1(VOID) +{ + lpHeadLocalMachine1 = (LPKEYCONTENT)MYALLOC0(sizeof(KEYCONTENT)); + lpHeadUsers1 = (LPKEYCONTENT)MYALLOC0(sizeof(KEYCONTENT)); + + if (bUseLongRegHead) { // 1.8.1 + lpHeadLocalMachine1->lpkeyname = MYALLOC(sizeof(LOCALMACHINESTRING_LONG)); + lpHeadUsers1->lpkeyname = MYALLOC(sizeof(USERSSTRING_LONG)); + strcpy(lpHeadLocalMachine1->lpkeyname, LOCALMACHINESTRING_LONG); + strcpy(lpHeadUsers1->lpkeyname, USERSSTRING_LONG); + } else { + lpHeadLocalMachine1->lpkeyname = MYALLOC(sizeof(LOCALMACHINESTRING)); + lpHeadUsers1->lpkeyname = MYALLOC(sizeof(USERSSTRING)); + strcpy(lpHeadLocalMachine1->lpkeyname, LOCALMACHINESTRING); + strcpy(lpHeadUsers1->lpkeyname, USERSSTRING); + } + + + nGettingKey = 2; + nGettingValue = 0; + nGettingTime = 0; + nGettingFile = 0; + nGettingDir = 0; + nBASETIME = GetTickCount(); + nBASETIME1 = nBASETIME; + UI_BeforeShot(IDC_1STSHOT); + + GetRegistrySnap(HKEY_LOCAL_MACHINE, lpHeadLocalMachine1); + GetRegistrySnap(HKEY_USERS, lpHeadUsers1); + nGettingTime = GetTickCount(); + UpdateCounters(lan_key, lan_value, nGettingKey, nGettingValue); + + if (SendMessage(GetDlgItem(hWnd, IDC_CHECKDIR), BM_GETCHECK, (WPARAM)0, (LPARAM)0) == 1) { + size_t nLengthofStr; + DWORD i; + LPSTR lpSubExtDir; + LPHEADFILE lphf; + LPHEADFILE lphftemp; + + GetDlgItemText(hWnd, IDC_EDITDIR, lpExtDir, EXTDIRLEN/2); + nLengthofStr = strlen(lpExtDir); + + lphf = lphftemp = lpHeadFile1; // changed in 1.8 + lpSubExtDir = lpExtDir; + + if (nLengthofStr > 0) + for (i = 0; i <= nLengthofStr; i++) { + // This is the stupid filename detection routine, [seperate with ";"] + if (*(lpExtDir + i) == 0x3b || *(lpExtDir + i) == 0x00) { + *(lpExtDir + i) = 0x00; + + if (*(lpExtDir + i - 1) == '\\' && i > 0) { + *(lpExtDir + i - 1) = 0x00; + } + + if (*lpSubExtDir != 0x00) { + size_t nSubExtDirLen; + + lphf = (LPHEADFILE)MYALLOC0(sizeof(HEADFILE)); + if (lpHeadFile1 == NULL) { + lpHeadFile1 = lphf; + } else { + lphftemp->lpnextheadfile = lphf; + } + + lphftemp = lphf; + lphf->lpfilecontent = (LPFILECONTENT)MYALLOC0(sizeof(FILECONTENT)); + //lphf->lpfilecontent2 = (LPFILECONTENT)MYALLOC0(sizeof(FILECONTENT)); + + nSubExtDirLen = strlen(lpSubExtDir) + 1; + lphf->lpfilecontent->lpfilename = MYALLOC(nSubExtDirLen); + //lphf->lpfilecontent2->lpfilename = MYALLOC(nSubExtDirLen); + + strcpy(lphf->lpfilecontent->lpfilename, lpSubExtDir); + //strcpy(lphf->lpfilecontent2->lpfilename,lpSubExtDir); + + lphf->lpfilecontent->fileattr = FILE_ATTRIBUTE_DIRECTORY; + //lphf->lpfilecontent2->fileattr = FILE_ATTRIBUTE_DIRECTORY; + + GetFilesSnap(lphf->lpfilecontent); + nGettingTime = GetTickCount(); + UpdateCounters(lan_dir, lan_file, nGettingDir, nGettingFile); + } + lpSubExtDir = lpExtDir + i + 1; + } + } + } + + NBW = COMPUTERNAMELEN; + GetSystemTime(lpSystemtime1); + GetComputerName(lpComputerName1, &NBW); + GetUserName(lpUserName1, &NBW); + + UI_AfterShot(); + +} + + +// ----------------------------- +VOID Shot2(VOID) +{ + lpHeadLocalMachine2 = (LPKEYCONTENT)MYALLOC0(sizeof(KEYCONTENT)); + lpHeadUsers2 = (LPKEYCONTENT)MYALLOC0(sizeof(KEYCONTENT)); + + if (bUseLongRegHead) { // 1.8.1 + lpHeadLocalMachine2->lpkeyname = MYALLOC(sizeof(LOCALMACHINESTRING_LONG)); + lpHeadUsers2->lpkeyname = MYALLOC(sizeof(USERSSTRING_LONG)); + strcpy(lpHeadLocalMachine2->lpkeyname, LOCALMACHINESTRING_LONG); + strcpy(lpHeadUsers2->lpkeyname, USERSSTRING_LONG); + } else { + lpHeadLocalMachine2->lpkeyname = MYALLOC(sizeof(LOCALMACHINESTRING)); + lpHeadUsers2->lpkeyname = MYALLOC(sizeof(USERSSTRING)); + strcpy(lpHeadLocalMachine2->lpkeyname, LOCALMACHINESTRING); + strcpy(lpHeadUsers2->lpkeyname, USERSSTRING); + } + + + nGettingKey = 2; + nGettingValue = 0; + nGettingTime = 0; + nGettingFile = 0; + nGettingDir = 0; + nBASETIME = GetTickCount(); + nBASETIME1 = nBASETIME; + UI_BeforeShot(IDC_2NDSHOT); + + GetRegistrySnap(HKEY_LOCAL_MACHINE, lpHeadLocalMachine2); + GetRegistrySnap(HKEY_USERS, lpHeadUsers2); + nGettingTime = GetTickCount(); + UpdateCounters(lan_key, lan_value, nGettingKey, nGettingValue); + + if (SendMessage(GetDlgItem(hWnd, IDC_CHECKDIR), BM_GETCHECK, (WPARAM)0, (LPARAM)0) == 1) { + size_t nLengthofStr; + DWORD i; + LPSTR lpSubExtDir; + LPHEADFILE lphf; + LPHEADFILE lphftemp; + + GetDlgItemText(hWnd, IDC_EDITDIR, lpExtDir, EXTDIRLEN/2); + nLengthofStr = strlen(lpExtDir); + + lphf = lphftemp = lpHeadFile1; // changed in 1.8 + lpSubExtDir = lpExtDir; + + if (nLengthofStr > 0) + for (i = 0; i <= nLengthofStr; i++) { + // This is the stupid filename detection routine, [seperate with ";"] + if (*(lpExtDir + i) == 0x3b || *(lpExtDir + i) == 0x00) { + *(lpExtDir + i) = 0x00; + + if (*(lpExtDir + i - 1) == '\\' && i > 0) { + *(lpExtDir + i - 1) = 0x00; + } + + if (*lpSubExtDir != 0x00) { + size_t nSubExtDirLen; + + lphf = (LPHEADFILE)MYALLOC0(sizeof(HEADFILE)); + if (lpHeadFile2 == NULL) { + lpHeadFile2 = lphf; + } else { + lphftemp->lpnextheadfile = lphf; + } + + lphftemp = lphf; + lphf->lpfilecontent = (LPFILECONTENT)MYALLOC0(sizeof(FILECONTENT)); + + nSubExtDirLen = strlen(lpSubExtDir) + 1; + lphf->lpfilecontent->lpfilename = MYALLOC(nSubExtDirLen); + + strcpy(lphf->lpfilecontent->lpfilename, lpSubExtDir); + + lphf->lpfilecontent->fileattr = FILE_ATTRIBUTE_DIRECTORY; + + GetFilesSnap(lphf->lpfilecontent); + nGettingTime = GetTickCount(); + UpdateCounters(lan_dir, lan_file, nGettingDir, nGettingFile); + } + lpSubExtDir = lpExtDir + i + 1; + } + } + } + + NBW = COMPUTERNAMELEN; + GetSystemTime(lpSystemtime2); + GetComputerName(lpComputerName2, &NBW); + GetUserName(lpUserName2, &NBW); + UI_AfterShot(); +} + + +//-------------------------------------------------- +// Show popup shortcut menu +//-------------------------------------------------- +VOID CreateShotPopupMenu(VOID) +{ + hMenu = CreatePopupMenu(); + AppendMenu(hMenu, MF_STRING, IDM_SHOTONLY, (LPCSTR)lan_menushot); + AppendMenu(hMenu, MF_STRING, IDM_SHOTSAVE, (LPCSTR)lan_menushotsave); + AppendMenu(hMenu, MF_SEPARATOR, IDM_BREAK, NULL); + AppendMenu(hMenu, MF_STRING, IDM_LOAD, (LPCSTR)lan_menuload); + SetMenuDefaultItem(hMenu, IDM_SHOTONLY, FALSE); +} diff --git a/RegShot/src/version.h b/RegShot/src/version.h new file mode 100644 index 0000000..db26f64 --- /dev/null +++ b/RegShot/src/version.h @@ -0,0 +1,103 @@ +/* + Copyright 2011 XhmikosR + + This file is part of Regshot. + + Regshot is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + Regshot is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Regshot; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + + +#ifndef REGSHOT_VERSION_H +#define REGSHOT_VERSION_H + + +#define DO_STRINGIFY(x) #x +#define STRINGIFY(x) DO_STRINGIFY(x) + +#define REGSHOT_VERSION_MAJOR 1 +#define REGSHOT_VERSION_MINOR 8 +#define REGSHOT_VERSION_PATCH 3 +#define REGSHOT_VERSION_REV 0 + +#define REGSHOT_VERSION_COPYRIGHT "Copyright (C) 1999-2012, all contributors" +#define REGSHOT_VERSION_NUM REGSHOT_VERSION_MAJOR,REGSHOT_VERSION_MINOR,REGSHOT_VERSION_PATCH,REGSHOT_VERSION_REV +#define REGSHOT_VERSION STRINGIFY(REGSHOT_VERSION_MAJOR) ", " STRINGIFY(REGSHOT_VERSION_MINOR) ", " STRINGIFY(REGSHOT_VERSION_PATCH) ", " STRINGIFY(REGSHOT_VERSION_REV) +#define REGSHOT_VERSION_STRING STRINGIFY(REGSHOT_VERSION_MAJOR) "." STRINGIFY(REGSHOT_VERSION_MINOR) "." STRINGIFY(REGSHOT_VERSION_PATCH) "-beta1V5" + +#ifdef _WIN64 +#define REGSHOT_TITLE "Regshot x64" +#define REGSHOT_RESULT_FILE "~res-x64" +#define REGSHOT_VERSION_PLATFORM "x64" +#else +#define REGSHOT_TITLE "Regshot" +#define REGSHOT_RESULT_FILE "~res" +#define REGSHOT_VERSION_PLATFORM "win32" +#endif // _WIN64 + +#ifdef _DEBUG +#define REGSHOT_VERSION_BUILDTYPE "d" +#else +#define REGSHOT_VERSION_BUILDTYPE "r" +#endif + +#define DO_STRINGIFY(x) #x +#define STRINGIFY(x) DO_STRINGIFY(x) + +#if defined(__GNUC__) + #define REGSHOT_VERSION_COMPILER "GCC "STRINGIFY(__GNUC__)"."STRINGIFY(__GNUC_MINOR__)"."STRINGIFY(__GNUC_PATCHLEVEL__) +#elif defined(__INTEL_COMPILER) + #if __INTEL_COMPILER >= 1200 + #define REGSHOT_VERSION_COMPILER "Intel Compiler 12" + #else + #define REGSHOT_VERSION_COMPILER "Intel Compiler (version unknown)" + #endif +#elif defined(WDK_BUILD) + #if _MSC_VER == 1600 + #if (_MSC_FULL_VER >= 160040219) + #define REGSHOT_VERSION_COMPILER "WDK (MSVC 2010 SP1)" + #else + #define REGSHOT_VERSION_COMPILER "WDK (MSVC 2010)" + #endif + #elif _MSC_VER == 1500 + #if (_MSC_FULL_VER == 150030729) + #define REGSHOT_VERSION_COMPILER "WDK" + #else + #define REGSHOT_VERSION_COMPILER "WDK (version unknown)" + #endif + #endif +#elif defined(_MSC_VER) + #if _MSC_VER == 1600 + #if (_MSC_FULL_VER >= 160040219) + #define REGSHOT_VERSION_COMPILER "MSVC 2010 SP1" + #else + #define REGSHOT_VERSION_COMPILER "MSVC 2010" + #endif + #elif _MSC_VER == 1500 + #if (_MSC_FULL_VER >= 150030729) + #define REGSHOT_VERSION_COMPILER "MSVC 2008 SP1" + #else + #define REGSHOT_VERSION_COMPILER "MSVC 2008" + #endif + #else + #define REGSHOT_VERSION_COMPILER "MSVC (version unknown)" + #endif +#else + #define REGSHOT_VERSION_COMPILER "(Unknown compiler)" +#endif + +#define REGSHOT_VERSION_DESCRIPTION REGSHOT_VERSION_STRING ", " REGSHOT_VERSION_PLATFORM ", " REGSHOT_VERSION_BUILDTYPE ", " REGSHOT_VERSION_COMPILER + + +#endif // REGSHOT_VERSION_H diff --git a/RegShot/src/winmain.c b/RegShot/src/winmain.c new file mode 100644 index 0000000..8dc4b63 --- /dev/null +++ b/RegShot/src/winmain.c @@ -0,0 +1,459 @@ +/* + Copyright 1999-2003,2007 TiANWEi + Copyright 2004 tulipfan + Copyright 2007 Belogorokhov Youri + + + This file is part of Regshot. + + Regshot is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + Regshot is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Regshot; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + + +#include "global.h" +#include "version.h" + +char *str_prgname = REGSHOT_TITLE " " REGSHOT_VERSION_STRING; // tfx add program titile +char *str_aboutme = "Regshot is a free and open source registry compare utility.\nversion: " REGSHOT_VERSION_DESCRIPTION "\n\nhttp://sourceforge.net/projects/regshot/\n\n" REGSHOT_VERSION_COPYRIGHT "\n\n"; + +LPSTR REGSHOTINI = "regshot.ini"; // tfx +LPSTR REGSHOTLANGUAGEFILE = "language.ini"; + +extern LPBYTE lan_menuclearallshots; // Be careful of extern ref! must be the same when declare them, +extern LPBYTE lan_menuclearshot1; // otherwise pointer would mis-point, and I can not use sizeof +extern LPBYTE lan_menuclearshot2; // to get real array size in extern ref +extern LPBYTE lan_about; +extern LPSTR str_DefaultLanguage; +extern LPSTR str_Original; + + +// this new function added by Youri in 1.8.2, for expanding path in browse dialog +int CALLBACK SelectBrowseFolder(HWND hWnd, UINT uMsg, LPARAM lParam, LPARAM lpData) +{ + UNREFERENCED_PARAMETER(lParam); + if (uMsg == BFFM_INITIALIZED) { + SendMessage(hWnd, BFFM_SETSELECTION, 1, lpData); + } + return 0; +} + + +//-------------------------------------------------- +// Main Dialog Proc +//-------------------------------------------------- +BOOL CALLBACK DialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) +{ + size_t nLengthofStr; + //BYTE nFlag; + + UNREFERENCED_PARAMETER(lParam); + + switch (message) { + case WM_INITDIALOG: + + SendDlgItemMessage(hDlg, IDC_EDITCOMMENT, EM_SETLIMITTEXT, (WPARAM)COMMENTLENGTH, (LPARAM)0); + SendDlgItemMessage(hDlg, IDC_EDITPATH, EM_SETLIMITTEXT, (WPARAM)MAX_PATH, (LPARAM)0); + SendDlgItemMessage(hDlg, IDC_EDITDIR, EM_SETLIMITTEXT, (WPARAM)(EXTDIRLEN/2), (LPARAM)0); + + //enlarge some buffer in 201201 + lpCurrentLanguage = MYALLOC0(SIZEOF_SINGLE_LANGUAGENAME); + lpExtDir = MYALLOC0(EXTDIRLEN + 4); //EXTDIRLEN is actually 4*max_path + lpLanguageIni = MYALLOC0(MAX_PATH*4 + 4); //for language.ini + lpRegshotIni = MYALLOC0(MAX_PATH*4 + 4); //for regshot.ini + lpKeyName = MYALLOC0(MAX_PATH*2 + 2); //For scan engine store keyname + lpValueName = MYALLOC0(1024*16*2); //For scan engine store valuename + lpValueData = MYALLOC0(ESTIMATE_VALUEDATA_LENGTH); //For scan engine store valuedata estimate + lpMESSAGE = MYALLOC0(256); //For status bar text message store + lpWindowsDirName = MYALLOC0(MAX_PATH*2 + 2); + lpTempPath = MYALLOC0(MAX_PATH*2 + 2); + lpStartDir = MYALLOC0(MAX_PATH*2 + 2); + lpOutputpath = MYALLOC0(MAX_PATH*2 + 2); //store last save/open hive file dir + lpComputerName1 = MYALLOC0(COMPUTERNAMELEN); + lpComputerName2 = MYALLOC0(COMPUTERNAMELEN); + lpUserName1 = MYALLOC0(COMPUTERNAMELEN); + lpUserName2 = MYALLOC0(COMPUTERNAMELEN); + lpSystemtime1 = MYALLOC0(sizeof(SYSTEMTIME)); + lpSystemtime2 = MYALLOC0(sizeof(SYSTEMTIME)); + lpLangStrings = MYALLOC0(SIZEOF_LANGSTRINGS); + lplpLangStrings = MYALLOC0(sizeof(LPSTR) * 60); // max is 60 strings + + lpCurrentTranslator = str_Original; + + GetWindowsDirectory(lpWindowsDirName, MAX_PATH); + nLengthofStr = strlen(lpWindowsDirName); + if (nLengthofStr > 0 && *(lpWindowsDirName + nLengthofStr - 1) == '\\') { + *(lpWindowsDirName + nLengthofStr - 1) = 0x00; + } + GetTempPath(MAX_PATH, lpTempPath); + + //_asm int 3; + GetCurrentDirectory(MAX_PATH + 1, lpStartDir); // fixed at 1.8.2 former version use getcommandline() + strcpy(lpLanguageIni, lpStartDir); + if (*(lpLanguageIni + strlen(lpLanguageIni) - 1) != '\\') { // 1.8.2 + strcat(lpLanguageIni, "\\"); + } + strcat(lpLanguageIni, REGSHOTLANGUAGEFILE); + + + if (GetLanguageType(hDlg)) { + GetLanguageStrings(hDlg); + } else { + GetDefaultStrings(); + } + + SendMessage(hDlg, WM_COMMAND, (WPARAM)IDC_CHECKDIR, (LPARAM)0); + + lpLastSaveDir = lpOutputpath; + lpLastOpenDir = lpOutputpath; + + strcpy(lpRegshotIni, lpStartDir); + if (*(lpRegshotIni + strlen(lpRegshotIni) - 1) != '\\') { + strcat(lpRegshotIni, "\\"); + } + strcat(lpRegshotIni, REGSHOTINI); + + LoadSettingsFromIni(hDlg); // tfx + + return TRUE; + + case WM_COMMAND: + switch (LOWORD(wParam)) { + case IDC_1STSHOT: + CreateShotPopupMenu(); + is1 = TRUE; + GetWindowRect(GetDlgItem(hDlg, IDC_1STSHOT), &rect); + TrackPopupMenu(hMenu, TPM_LEFTALIGN | TPM_LEFTBUTTON, rect.left + 10, rect.top + 10, 0, hDlg, NULL); + DestroyMenu(hMenu); + + return(TRUE); + + case IDC_2NDSHOT: + CreateShotPopupMenu(); + is1 = FALSE; + GetWindowRect(GetDlgItem(hDlg, IDC_2NDSHOT), &rect); + TrackPopupMenu(hMenu, TPM_LEFTALIGN | TPM_LEFTBUTTON, rect.left + 10, rect.top + 10, 0, hDlg, NULL); + DestroyMenu(hMenu); + return(TRUE); + + case IDM_SHOTONLY: + if (is1) { + is1LoadFromHive = FALSE; + Shot1(); + } else { + is2LoadFromHive = FALSE; + Shot2(); + } + + return(TRUE); + + case IDM_SHOTSAVE: + if (is1) { + is1LoadFromHive = FALSE; + Shot1(); + SaveHive(lpHeadLocalMachine1, lpHeadUsers1, lpHeadFile1, lpComputerName1, lpUserName1, lpSystemtime1); // I might use a struct in future! + } else { + is2LoadFromHive = FALSE; + Shot2(); + SaveHive(lpHeadLocalMachine2, lpHeadUsers2, lpHeadFile2, lpComputerName2, lpUserName2, lpSystemtime2); + } + + return(TRUE); + + case IDM_LOAD: + if (is1) { + is1LoadFromHive = LoadHive(&lpHeadLocalMachine1, &lpHeadUsers1, &lpHeadFile1, &lpTempHive1); + } else { + is2LoadFromHive = LoadHive(&lpHeadLocalMachine2, &lpHeadUsers2, &lpHeadFile2, &lpTempHive2); + } + + //if (is1LoadFromHive || is2LoadFromHive) + // SendMessage(GetDlgItem(hWnd,IDC_CHECKDIR),BM_SETCHECK,(WPARAM)0x00,(LPARAM)0); + + return(TRUE); + + /*case IDC_SAVEREG: + SaveRegistry(lpHeadLocalMachine1,lpHeadUsers1); + return(TRUE);*/ + + case IDC_COMPARE: + EnableWindow(GetDlgItem(hDlg, IDC_COMPARE), FALSE); + UI_BeforeClear(); + CompareShots(); + ShowWindow(GetDlgItem(hDlg, IDC_PBCOMPARE), SW_HIDE); + EnableWindow(GetDlgItem(hDlg, IDC_CLEAR1), TRUE); + SetFocus(GetDlgItem(hDlg, IDC_CLEAR1)); + SendMessage(hDlg, DM_SETDEFID, (WPARAM)IDC_CLEAR1, (LPARAM)0); + SetCursor(hSaveCursor); + MessageBeep(0xffffffff); + return(TRUE); + + case IDC_CLEAR1: + hMenuClear = CreatePopupMenu(); + AppendMenu(hMenuClear, MF_STRING, IDM_CLEARALLSHOTS, (LPCSTR)lan_menuclearallshots); + AppendMenu(hMenuClear, MF_MENUBARBREAK, IDM_BREAK, NULL); + AppendMenu(hMenuClear, MF_STRING, IDM_CLEARSHOT1, (LPCSTR)lan_menuclearshot1); + AppendMenu(hMenuClear, MF_STRING, IDM_CLEARSHOT2, (LPCSTR)lan_menuclearshot2); + //AppendMenu(hMenuClear,MF_STRING,IDM_CLEARRESULT,"Clear comparison result"); + SetMenuDefaultItem(hMenuClear, IDM_CLEARALLSHOTS, FALSE); + + //if (lpHeadFile != NULL) + //{ + // EnableMenuItem(hMenuClear,IDM_CLEARSHOT1,MF_BYCOMMAND|MF_GRAYED); + // EnableMenuItem(hMenuClear,IDM_CLEARSHOT2,MF_BYCOMMAND|MF_GRAYED); + //} + //else + { + if (lpHeadLocalMachine1 != NULL) { + EnableMenuItem(hMenuClear, IDM_CLEARSHOT1, MF_BYCOMMAND | MF_ENABLED); + } else { + EnableMenuItem(hMenuClear, IDM_CLEARSHOT1, MF_BYCOMMAND | MF_GRAYED); + } + + if (lpHeadLocalMachine2 != NULL) { + EnableMenuItem(hMenuClear, IDM_CLEARSHOT2, MF_BYCOMMAND | MF_ENABLED); + } else { + EnableMenuItem(hMenuClear, IDM_CLEARSHOT2, MF_BYCOMMAND | MF_GRAYED); + } + } + GetWindowRect(GetDlgItem(hDlg, IDC_CLEAR1), &rect); + TrackPopupMenu(hMenuClear, TPM_LEFTALIGN | TPM_LEFTBUTTON, rect.left + 10, rect.top + 10, 0, hDlg, NULL); + DestroyMenu(hMenuClear); + return(TRUE); + + case IDM_CLEARALLSHOTS: + UI_BeforeClear(); + FreeAllKeyContent1(); // Note!! If loadfromhive and contains a file, we should let lpHeadFile to NULL + FreeAllKeyContent2(); + FreeAllCompareResults(); + + FreeAllFileHead(lpHeadFile1); + FreeAllFileHead(lpHeadFile2); + + lpHeadFile1 = NULL; + lpHeadFile2 = NULL; + UI_AfterClear(); + EnableWindow(GetDlgItem(hWnd, IDC_CLEAR1), FALSE); + return(TRUE); + + case IDM_CLEARSHOT1: + UI_BeforeClear(); + FreeAllKeyContent1(); + FreeAllCompareResults(); + FreeAllFileHead(lpHeadFile1); + lpHeadFile1 = NULL; + ClearKeyMatchTag(lpHeadLocalMachine2); // we clear shot2's tag + ClearKeyMatchTag(lpHeadUsers2); + ClearHeadFileMatchTag(lpHeadFile2); + UI_AfterClear(); + return(TRUE); + + case IDM_CLEARSHOT2: + UI_BeforeClear(); + FreeAllKeyContent2(); + FreeAllCompareResults(); + FreeAllFileHead(lpHeadFile2); + lpHeadFile2 = NULL; + ClearKeyMatchTag(lpHeadLocalMachine1); // we clear shot1's tag + ClearKeyMatchTag(lpHeadUsers1); + ClearHeadFileMatchTag(lpHeadFile1); + UI_AfterClear(); + return(TRUE); + + /*case IDM_CLEARRESULT: + UI_BeforeClear(); + FreeAllCompareResults(); + ClearKeyMatchTag(lpHeadLocalMachine1); + ClearKeyMatchTag(lpHeadLocalMachine2); + ClearKeyMatchTag(lpHeadUsers1); + ClearKeyMatchTag(lpHeadUsers2); + ClearHeadFileMatchTag(lpHeadFile1); + ClearHeadFileMatchTag(lpHeadFile2); + UI_AfterClear(); + return(TRUE);*/ + + case IDC_CHECKDIR: + if (SendMessage(GetDlgItem(hDlg, IDC_CHECKDIR), BM_GETCHECK, (WPARAM)0, (LPARAM)0) == 1) { + EnableWindow(GetDlgItem(hDlg, IDC_EDITDIR), TRUE); + EnableWindow(GetDlgItem(hDlg, IDC_BROWSE1), TRUE); + } else { + EnableWindow(GetDlgItem(hDlg, IDC_EDITDIR), FALSE); + EnableWindow(GetDlgItem(hDlg, IDC_BROWSE1), FALSE); + } + return(TRUE); + + case IDC_CANCEL1: + case IDCANCEL: + + SaveSettingsToIni(hDlg); // tfx + PostQuitMessage(0); + return(TRUE); + + case IDC_BROWSE1: { + + LPITEMIDLIST lpidlist; + BrowseInfo1.hwndOwner = hDlg; + BrowseInfo1.pszDisplayName = MYALLOC0(MAX_PATH*2 + 2); + //BrowseInfo1.lpszTitle = "Select:"; + BrowseInfo1.ulFlags = 0; // 3 lines added in 1.8.2 + BrowseInfo1.lpfn = NULL; + BrowseInfo1.lParam = 0; + + lpidlist = SHBrowseForFolder(&BrowseInfo1); + + if (lpidlist != NULL) { + size_t nWholeLen; + + SHGetPathFromIDList(lpidlist, BrowseInfo1.pszDisplayName); + nLengthofStr = GetDlgItemText(hDlg, IDC_EDITDIR, lpExtDir, EXTDIRLEN/2); + nWholeLen = nLengthofStr + strlen(BrowseInfo1.pszDisplayName); + + if (nWholeLen < EXTDIRLEN + 1) { + strcat(lpExtDir, ";"); + strcat(lpExtDir, BrowseInfo1.pszDisplayName); + + } else { + strcpy(lpExtDir, BrowseInfo1.pszDisplayName); + } + + SetDlgItemText(hDlg, IDC_EDITDIR, lpExtDir); + MYFREE(lpidlist); + } + + MYFREE(BrowseInfo1.pszDisplayName); + } + return(TRUE); + + case IDC_BROWSE2: { + + LPITEMIDLIST lpidlist; + BrowseInfo1.hwndOwner = hDlg; + BrowseInfo1.pszDisplayName = MYALLOC0(MAX_PATH*2 + 2); + //BrowseInfo1.lpszTitle = "Select:"; + + //----------------- + // Added by Youri in 1.8.2 ,Thanks! + // if you add this code, the browse dialog will be expand path and have button "Create Folder" + BrowseInfo1.ulFlags |= 0x0040; // BIF_NEWDIALOGSTYLE; // button "Create Folder" and resizable + BrowseInfo1.lpfn = SelectBrowseFolder; // function for expand path + BrowseInfo1.lParam = (LPARAM)BrowseInfo1.pszDisplayName; + // Initilize selection path + GetDlgItemText(hDlg, IDC_EDITPATH, BrowseInfo1.pszDisplayName, MAX_PATH); + //----------------- + + lpidlist = SHBrowseForFolder(&BrowseInfo1); + if (lpidlist != NULL) { + SHGetPathFromIDList(lpidlist, BrowseInfo1.pszDisplayName); + SetDlgItemText(hDlg, IDC_EDITPATH, BrowseInfo1.pszDisplayName); + MYFREE(lpidlist); + } + + MYFREE(BrowseInfo1.pszDisplayName); + } + return(TRUE); + + case IDC_COMBOLANGUAGE: + GetLanguageStrings(hDlg); + return(TRUE); + + case IDC_ABOUT: { + LPSTR lpAboutBox; + //_asm int 3; + lpAboutBox = MYALLOC0(SIZEOF_ABOUTBOX); + // it is silly that when wsprintf encounters a NULL string, it will write the whole string to NULL! + sprintf(lpAboutBox, "%s%s%s%s%s%s", str_aboutme, "[", (strlen(lpCurrentLanguage) == 0) ? str_DefaultLanguage : lpCurrentLanguage, "]", " by: ", lpCurrentTranslator); + MessageBox(hDlg, lpAboutBox, (LPCSTR)lan_about, MB_OK); + MYFREE(lpAboutBox); + return(TRUE); + } + } + + } + return(FALSE); +} + + +/*BOOL SetPrivilege(HANDLE hToken, LPCSTR pString, BOOL bEnablePrivilege) +{ + TOKEN_PRIVILEGES tp; + LUID luid; + TOKEN_PRIVILEGES tpPrevious; + DWORD cbSize = sizeof(TOKEN_PRIVILEGES); + + if (!LookupPrivilegeValue(NULL,pString,&luid)) + return FALSE; + tp.PrivilegeCount = 1; + tp.Privileges[0].Luid = luid; + tp.Privileges[0].Attributes = 0; + if (!AdjustTokenPrivileges(hToken,FALSE,&tp,sizeof(TOKEN_PRIVILEGES),&tpPrevious,&cbSize)) + return FALSE; + tpPrevious.PrivilegeCount = 1; + tpPrevious.Privileges[0].Luid = luid; + if (bEnablePrivilege) + tpPrevious.Privileges[0].Attributes| = (SE_PRIVILEGE_ENABLED); + else + tpPrevious.Privileges[0].Attributes^ = ((tpPrevious.Privileges[0].Attributes)&(SE_PRIVILEGE_ENABLED)); + if (!AdjustTokenPrivileges(hToken,FALSE,&tpPrevious,cbSize,NULL,NULL)) + return FALSE; + return TRUE; +}*/ + + +int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, + LPSTR lpszCmdLine, int nCmdShow) +{ + + /* + BOOL bWinNTDetected; + HANDLE hToken = 0; + OSVERSIONINFO winver; + winver.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + GetVersionEx(&winver); + bWinNTDetected = (winver.dwPlatformId == VER_PLATFORM_WIN32_NT) ? TRUE : FALSE; + //hWndMonitor be created first for the multilanguage interface. + + //FARPROC lpfnDlgProc; + //lpfnDlgProc = MakeProcInstance((FARPROC)DialogProc,hInstance); // old style of create dialogproc + */ + UNREFERENCED_PARAMETER(lpszCmdLine); + UNREFERENCED_PARAMETER(hPrevInstance); + + hHeap = GetProcessHeap(); // 1.8.2 + hWnd = CreateDialog(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, (DLGPROC)DialogProc); + + SetClassLongPtr(hWnd, GCLP_HICON, (LONG_PTR)LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MAINICON))); + + SetWindowText(hWnd, str_prgname); // tfx set program title to str_prgnameavoid edit resource file + ShowWindow(hWnd, nCmdShow); + UpdateWindow(hWnd); + //SetPriorityClass(hInstance,31); + /*if (bWinNTDetected) + { + if (OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&hToken) == TRUE) + { + if (SetPrivilege(hToken,"SeSystemProfilePrivilege",TRUE) == TRUE) + { + MessageBox(hWnd,"We are in system level,enjoy!","Info:",MB_OK); + } + CloseHandle(hToken); + } + }*/ + while (GetMessage(&msg, NULL, (WPARAM)NULL, (LPARAM)NULL)) { + if (!IsDialogMessage(hWnd, &msg)) { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + } + return(int)(msg.wParam); +} diff --git a/information.json b/information.json index c5dc3cb..d9f1194 100755 --- a/information.json +++ b/information.json @@ -1,5 +1,5 @@ { - "Version": "2.2.0-Alpha4", + "Version": "2.2.0", "Thank": [ "感谢 @a2035274 @虚幻的早晨 https://bbs.deepin.org/post/238301", "感谢 @zhangs https://bbs.deepin.org/post/227948", diff --git a/mainwindow.py b/mainwindow.py index 1b31fc1..1d67118 100755 --- a/mainwindow.py +++ b/mainwindow.py @@ -128,6 +128,7 @@ class QT: e1.setEditText(findExeHistory[-1]) def DisableButton(things): + button_r_6.setDisabled(things) button1.setDisabled(things) button2.setDisabled(things) button3.setDisabled(things) @@ -813,11 +814,11 @@ class UpdateWindow(): ok.setDisabled(True) else: if "deepin/UOS 应用商店版本<带签名>" == programVersionType: - url = "aHR0cHM6Ly8zMDQ2MjZwOTI3LmdvaG8uY28vc3BhcmstZGVlcGluLXdpbmUtcnVubmVyL3VwZGF0ZS11b3MuanNvbg==" + url = "aHR0cDovLzEyMC4yNS4xNTMuMTQ0L3NwYXJrLWRlZXBpbi13aW5lLXJ1bm5lci91cGRhdGUtdW9zLmpzb24=" elif "星火应用商店版本" == programVersionType: - url = "aHR0cHM6Ly8zMDQ2MjZwOTI3LmdvaG8uY28vc3BhcmstZGVlcGluLXdpbmUtcnVubmVyL3VwZGF0ZS1zcGFyay5qc29u" + url = "aHR0cDovLzEyMC4yNS4xNTMuMTQ0L3NwYXJrLWRlZXBpbi13aW5lLXJ1bm5lci91cGRhdGUtc3BhcmsuanNvbg==" else: - url = "aHR0cHM6Ly8zMDQ2MjZwOTI3LmdvaG8uY28vc3BhcmstZGVlcGluLXdpbmUtcnVubmVyL3VwZGF0ZS5qc29u" + url = "aHR0cDovLzEyMC4yNS4xNTMuMTQ0L3NwYXJrLWRlZXBpbi13aW5lLXJ1bm5lci91cGRhdGUuanNvbg==" try: UpdateWindow.data = json.loads(requests.get(base64.b64decode(url).decode("utf-8")).text) versionLabel = QtWidgets.QLabel(f"当前版本:{version}\n最新版本:{UpdateWindow.data['Version']}\n更新内容:") @@ -1155,8 +1156,8 @@ class ProgramRunStatusShow(): return try: sha = ProgramRunStatusUpload.GetSHA1(e2.currentText()) - lists = json.loads(requests.get(base64.b64decode("aHR0cHM6Ly8zMDQ2MjZwOTI3LmdvaG8uY28vc3BhcmstZGVlcGluLXdpbmUtcnVubmVyL2FwcC8=").decode("utf-8") + sha + base64.b64decode("L2FsbC5qc29u").decode("utf-8")).text) - r = requests.get(base64.b64decode("aHR0cHM6Ly8zMDQ2MjZwOTI3LmdvaG8uY28vc3BhcmstZGVlcGluLXdpbmUtcnVubmVyL2FwcC8=").decode("utf-8") + sha + base64.b64decode("L3RpdGxlLnR4dA==").decode("utf-8")) + lists = json.loads(requests.get(base64.b64decode("aHR0cDovLzEyMC4yNS4xNTMuMTQ0L3NwYXJrLWRlZXBpbi13aW5lLXJ1bm5lci9hcHAv").decode("utf-8") + sha + base64.b64decode("L2FsbC5qc29u").decode("utf-8")).text) + r = requests.get(base64.b64decode("aHR0cDovLzEyMC4yNS4xNTMuMTQ0L3NwYXJrLWRlZXBpbi13aW5lLXJ1bm5lci9hcHAv").decode("utf-8") + sha + base64.b64decode("L3RpdGxlLnR4dA==").decode("utf-8")) r.encoding = "utf-8" title = r.text except: @@ -1793,6 +1794,7 @@ updateThingsString = '''※1、Dll 提取工具支持 NT 6.X 及以上版本的 13、不再强制依赖深度终端,只做推荐安装 14、基于生态活动适配脚本的打包器在打包完成后会弹出对话框提示打包完成 15、优化打包器的 spark wine helper 依赖设置方式 +16、新增 RegShot(注册表比对工具) 以下更新内容旧版本也适用(只限 2.1.0 及以上版本) ※1、在“安装更多Wine”的Wine安装工具中上新 Wine ※2、云 Dll 工具上新 Dll @@ -1832,7 +1834,7 @@ Qt 版本:{QtCore.qVersion()} title = "Wine 运行器 {}".format(version) updateThings = "{} 更新内容:\n{}\n更新时间:{}".format(version, updateThingsString, updateTime, time.strftime("%Y")) try: - threading.Thread(target=requests.get, args=[parse.unquote(base64.b64decode("aHR0cHM6Ly8zMDQ2MjZwOTI3LmdvaG8uY28vc3BhcmstZGVlcGluLXdpbmUtcnVubmVyL29wZW4vSW5zdGFsbC5waHA=").decode("utf-8")) + "?Version=" + version]).start() + threading.Thread(target=requests.get, args=[parse.unquote(base64.b64decode("aHR0cDovLzEyMC4yNS4xNTMuMTQ0L3NwYXJrLWRlZXBpbi13aW5lLXJ1bm5lci9vcGVuL0luc3RhbGwucGhw").decode("utf-8")) + "?Version=" + version]).start() except: pass iconListUnBuild = [ @@ -1962,8 +1964,8 @@ programManager.addWidget(wineConfig, 3, 0, 1, 1) fontAppStore = QtWidgets.QPushButton(QtCore.QCoreApplication.translate("U", "字体商店")) fontAppStore.clicked.connect(FontAppStore) programManager.addWidget(fontAppStore, 3, 2, 1, 1) -button_r_6 = QtWidgets.QPushButton(QtCore.QCoreApplication.translate("U", "安装自定义字体")) -button_r_6.clicked.connect(OpenWineFontPath) +button_r_6 = QtWidgets.QPushButton(QtCore.QCoreApplication.translate("U", "RegShot")) +button_r_6.clicked.connect(lambda: RunWineProgram(f"{programPath}/RegShot/regshot.exe")) programManager.addWidget(button_r_6, 3, 4, 1, 1) sparkWineSetting = QtWidgets.QPushButton(QtCore.QCoreApplication.translate("U", "星火wine配置")) sparkWineSetting.clicked.connect(lambda: threading.Thread(target=os.system, args=["/opt/durapps/spark-dwine-helper/spark-dwine-helper-settings/settings.sh"]).start()) diff --git a/package-script/information.json b/package-script/information.json index ffc43c4..9823471 100755 --- a/package-script/information.json +++ b/package-script/information.json @@ -1,3 +1,3 @@ { - "Version": "2.2.0-Alpha4" + "Version": "2.2.0" } diff --git a/req/__init__.py b/req/__init__.py index 5c75f86..37115bd 100644 --- a/req/__init__.py +++ b/req/__init__.py @@ -1,5 +1,5 @@ # 此库用于实现 52 版不连接程序服务器 -import req as requests +import requests unConnect = False with open("/var/lib/dpkg/status", "r") as i: diff --git a/req/__pycache__/__init__.cpython-37.pyc b/req/__pycache__/__init__.cpython-37.pyc index abc3ed18132f5753446a879569120cb25b1ba391..68a4567818785be80eab1e0f5e267aa445ca220a 100644 GIT binary patch delta 205 zcmZ3Ku|3&4=S4&7(=_T);$g5J%n8Fmrl**jKoWjz~)GramlEMn(Enr>9kj)mw z6wZ*s7|0OB5W$ejROFD#mcrJ|$jFewp2CsBna&)=?#__HmBQV^kiy-}6vdIklfv7= z5XG6om%SV?1!YAur?7F~VlGN8oP2<}7ytu5F(m*1 diff --git a/wine/installwine b/wine/installwine index 9690184..2dae947 100755 --- a/wine/installwine +++ b/wine/installwine @@ -14,7 +14,7 @@ import shutil import sys import json import traceback -import req as requests +import requests from PyQt5 import QtCore, QtGui, QtWidgets # UI 布局(自动生成)

-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