From 5b07016e5307ea2386bef93271ca9fa885a495b7 Mon Sep 17 00:00:00 2001 From: ChengChengCC Date: Tue, 5 Jan 2016 09:07:14 +0800 Subject: [PATCH] =?UTF-8?q?=E5=86=85=E6=A0=B8=E5=B1=82=E6=B3=A8=E5=86=8C?= =?UTF-8?q?=E8=A1=A8=E7=BC=96=E8=BE=91=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Register/RegisterManager/RegisterManager.sln | 26 + Register/RegisterManager/RegisterManager.suo | Bin 0 -> 40448 bytes .../RegisterManager/KeyDlg.cpp | 72 + .../RegisterManager/RegisterManager/KeyDlg.h | 36 + .../RegisterManager/ReadMe.txt | 77 + .../RegisterManager/RegFindDlg.cpp | 721 ++++ .../RegisterManager/RegFindDlg.h | 53 + .../RegisterManager/RegHexEditDlg.cpp | 135 + .../RegisterManager/RegHexEditDlg.h | 33 + .../RegisterManager/RegModifyDlg.cpp | 42 + .../RegisterManager/RegModifyDlg.h | 28 + .../RegisterManager/RegisterManager.aps | Bin 0 -> 258348 bytes .../RegisterManager/RegisterManager.cpp | 94 + .../RegisterManager/RegisterManager.h | 32 + .../RegisterManager/RegisterManager.rc | Bin 0 -> 24078 bytes .../RegisterManager/RegisterManager.vcxproj | 229 ++ .../RegisterManager.vcxproj.filters | 115 + .../RegisterManager.vcxproj.user | 3 + .../RegisterManager/RegisterManagerDlg.cpp | 3399 +++++++++++++++++ .../RegisterManager/RegisterManagerDlg.h | 276 ++ .../RegisterManager/res/Bmp/Copy.bmp | Bin 0 -> 822 bytes .../RegisterManager/res/Bmp/Delete.bmp | Bin 0 -> 822 bytes .../RegisterManager/res/Bmp/Export.bmp | Bin 0 -> 822 bytes .../RegisterManager/res/Bmp/Lookfor.bmp | Bin 0 -> 1334 bytes .../RegisterManager/res/Bmp/Refresh.bmp | Bin 0 -> 822 bytes .../RegisterManager/res/Check.avi | Bin 0 -> 135168 bytes .../RegisterManager/res/Icon/CloseDir.ico | Bin 0 -> 1406 bytes .../RegisterManager/res/Icon/Computer.ico | Bin 0 -> 14846 bytes .../RegisterManager/res/Icon/OpenDir.ico | Bin 0 -> 1406 bytes .../RegisterManager/res/Icon/REG_DWORD.ico | Bin 0 -> 318 bytes .../RegisterManager/res/Icon/REG_SZ.ico | Bin 0 -> 318 bytes .../RegisterManager/res/RegisterManager.ico | Bin 0 -> 67777 bytes .../RegisterManager/res/RegisterManager.rc2 | Bin 0 -> 686 bytes .../RegisterManager/res/Search.avi | Bin 0 -> 21020 bytes .../RegisterManager/resource.h | Bin 0 -> 7458 bytes .../RegisterManager/stdafx.cpp | 8 + .../RegisterManager/RegisterManager/stdafx.h | 58 + .../RegisterManager/targetver.h | 8 + .../RegisterManagerDrv/RegisterManagerDrv.c | 1098 ++++++ .../RegisterManagerDrv/RegisterManagerDrv.h | 237 ++ .../RegisterManagerDrv/RegisterManagerDrv.sln | 16 + .../RegisterManagerDrv/RegisterManagerDrv.suo | Bin 0 -> 9216 bytes .../RegisterManagerDrv.vcxproj | 62 + .../RegisterManagerDrv.vcxproj.user | 3 + Register/RegisterManagerDrv/clean.bat | 28 + Register/RegisterManagerDrv/ddkbuild.cmd | 1122 ++++++ Register/RegisterManagerDrv/makefile | 6 + Register/RegisterManagerDrv/mybuild.bat | 3 + Register/RegisterManagerDrv/readme.txt | 157 + Register/RegisterManagerDrv/sources | 9 + 50 files changed, 8186 insertions(+) create mode 100644 Register/RegisterManager/RegisterManager.sln create mode 100644 Register/RegisterManager/RegisterManager.suo create mode 100644 Register/RegisterManager/RegisterManager/KeyDlg.cpp create mode 100644 Register/RegisterManager/RegisterManager/KeyDlg.h create mode 100644 Register/RegisterManager/RegisterManager/ReadMe.txt create mode 100644 Register/RegisterManager/RegisterManager/RegFindDlg.cpp create mode 100644 Register/RegisterManager/RegisterManager/RegFindDlg.h create mode 100644 Register/RegisterManager/RegisterManager/RegHexEditDlg.cpp create mode 100644 Register/RegisterManager/RegisterManager/RegHexEditDlg.h create mode 100644 Register/RegisterManager/RegisterManager/RegModifyDlg.cpp create mode 100644 Register/RegisterManager/RegisterManager/RegModifyDlg.h create mode 100644 Register/RegisterManager/RegisterManager/RegisterManager.aps create mode 100644 Register/RegisterManager/RegisterManager/RegisterManager.cpp create mode 100644 Register/RegisterManager/RegisterManager/RegisterManager.h create mode 100644 Register/RegisterManager/RegisterManager/RegisterManager.rc create mode 100644 Register/RegisterManager/RegisterManager/RegisterManager.vcxproj create mode 100644 Register/RegisterManager/RegisterManager/RegisterManager.vcxproj.filters create mode 100644 Register/RegisterManager/RegisterManager/RegisterManager.vcxproj.user create mode 100644 Register/RegisterManager/RegisterManager/RegisterManagerDlg.cpp create mode 100644 Register/RegisterManager/RegisterManager/RegisterManagerDlg.h create mode 100644 Register/RegisterManager/RegisterManager/res/Bmp/Copy.bmp create mode 100644 Register/RegisterManager/RegisterManager/res/Bmp/Delete.bmp create mode 100644 Register/RegisterManager/RegisterManager/res/Bmp/Export.bmp create mode 100644 Register/RegisterManager/RegisterManager/res/Bmp/Lookfor.bmp create mode 100644 Register/RegisterManager/RegisterManager/res/Bmp/Refresh.bmp create mode 100644 Register/RegisterManager/RegisterManager/res/Check.avi create mode 100644 Register/RegisterManager/RegisterManager/res/Icon/CloseDir.ico create mode 100644 Register/RegisterManager/RegisterManager/res/Icon/Computer.ico create mode 100644 Register/RegisterManager/RegisterManager/res/Icon/OpenDir.ico create mode 100644 Register/RegisterManager/RegisterManager/res/Icon/REG_DWORD.ico create mode 100644 Register/RegisterManager/RegisterManager/res/Icon/REG_SZ.ico create mode 100644 Register/RegisterManager/RegisterManager/res/RegisterManager.ico create mode 100644 Register/RegisterManager/RegisterManager/res/RegisterManager.rc2 create mode 100644 Register/RegisterManager/RegisterManager/res/Search.avi create mode 100644 Register/RegisterManager/RegisterManager/resource.h create mode 100644 Register/RegisterManager/RegisterManager/stdafx.cpp create mode 100644 Register/RegisterManager/RegisterManager/stdafx.h create mode 100644 Register/RegisterManager/RegisterManager/targetver.h create mode 100644 Register/RegisterManagerDrv/RegisterManagerDrv.c create mode 100644 Register/RegisterManagerDrv/RegisterManagerDrv.h create mode 100644 Register/RegisterManagerDrv/RegisterManagerDrv.sln create mode 100644 Register/RegisterManagerDrv/RegisterManagerDrv.suo create mode 100644 Register/RegisterManagerDrv/RegisterManagerDrv.vcxproj create mode 100644 Register/RegisterManagerDrv/RegisterManagerDrv.vcxproj.user create mode 100644 Register/RegisterManagerDrv/clean.bat create mode 100644 Register/RegisterManagerDrv/ddkbuild.cmd create mode 100644 Register/RegisterManagerDrv/makefile create mode 100644 Register/RegisterManagerDrv/mybuild.bat create mode 100644 Register/RegisterManagerDrv/readme.txt create mode 100644 Register/RegisterManagerDrv/sources diff --git a/Register/RegisterManager/RegisterManager.sln b/Register/RegisterManager/RegisterManager.sln new file mode 100644 index 0000000..74adbfc --- /dev/null +++ b/Register/RegisterManager/RegisterManager.sln @@ -0,0 +1,26 @@ + +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio 2010 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "RegisterManager", "RegisterManager\RegisterManager.vcxproj", "{118E09E5-83B5-4DC6-A3ED-70F0F1BFE66C}" +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 + {118E09E5-83B5-4DC6-A3ED-70F0F1BFE66C}.Debug|Win32.ActiveCfg = Debug|Win32 + {118E09E5-83B5-4DC6-A3ED-70F0F1BFE66C}.Debug|Win32.Build.0 = Debug|Win32 + {118E09E5-83B5-4DC6-A3ED-70F0F1BFE66C}.Debug|x64.ActiveCfg = Debug|x64 + {118E09E5-83B5-4DC6-A3ED-70F0F1BFE66C}.Debug|x64.Build.0 = Debug|x64 + {118E09E5-83B5-4DC6-A3ED-70F0F1BFE66C}.Release|Win32.ActiveCfg = Release|Win32 + {118E09E5-83B5-4DC6-A3ED-70F0F1BFE66C}.Release|Win32.Build.0 = Release|Win32 + {118E09E5-83B5-4DC6-A3ED-70F0F1BFE66C}.Release|x64.ActiveCfg = Release|x64 + {118E09E5-83B5-4DC6-A3ED-70F0F1BFE66C}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Register/RegisterManager/RegisterManager.suo b/Register/RegisterManager/RegisterManager.suo new file mode 100644 index 0000000000000000000000000000000000000000..b7a4f01a68c6c1c9dc1f0680166dc8c857e50842 GIT binary patch literal 40448 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 literal 0 HcmV?d00001 diff --git a/Register/RegisterManager/RegisterManager/KeyDlg.cpp b/Register/RegisterManager/RegisterManager/KeyDlg.cpp new file mode 100644 index 0000000..0ee46cf --- /dev/null +++ b/Register/RegisterManager/RegisterManager/KeyDlg.cpp @@ -0,0 +1,72 @@ +// KeyDlg.cpp : ʵļ +// + +#include "stdafx.h" +#include "RegisterManager.h" +#include "KeyDlg.h" +#include "afxdialogex.h" + + +// CKeyDlg Ի + +IMPLEMENT_DYNAMIC(CKeyDlg, CDialog) + +CKeyDlg::CKeyDlg(CWnd* pParent /*=NULL*/) + : CDialog(CKeyDlg::IDD, pParent) + , m_strKeyNameStatic(_T("")) + , m_strKeyNameEdit(_T("")) +{ + +} + +CKeyDlg::~CKeyDlg() +{ +} + +void CKeyDlg::DoDataExchange(CDataExchange* pDX) +{ + CDialog::DoDataExchange(pDX); + DDX_Text(pDX, IDC_KEY_NAME, m_strKeyNameStatic); + DDX_Text(pDX, IDC_EDIT, m_strKeyNameEdit); +} + + +BEGIN_MESSAGE_MAP(CKeyDlg, CDialog) +END_MESSAGE_MAP() + + +// CKeyDlg Ϣ + + +BOOL CKeyDlg::OnInitDialog() +{ + CDialog::OnInitDialog(); + + switch (m_nDlgType) + { + case enumRenameKey: + SetWindowText(L""); + m_strKeyNameStatic = L"¼"; + break; + + case enumRenameValue: + SetWindowText(L"ֵ"); + m_strKeyNameStatic = L"¼ֵ"; + break; + + case enumCreateKey: + SetWindowText(L"¼"); + m_strKeyNameStatic = L"¼"; + break; + + case enumSetValueKey: + SetWindowText(L"ֵ"); + m_strKeyNameStatic = L"¼ֵ"; + break; + } + + UpdateData(FALSE); + + return TRUE; // return TRUE unless you set the focus to a control + // 쳣: OCX ҳӦ FALSE +} diff --git a/Register/RegisterManager/RegisterManager/KeyDlg.h b/Register/RegisterManager/RegisterManager/KeyDlg.h new file mode 100644 index 0000000..389113d --- /dev/null +++ b/Register/RegisterManager/RegisterManager/KeyDlg.h @@ -0,0 +1,36 @@ +#pragma once + + +// CKeyDlg Ի + + +typedef enum DLG_TYPE +{ + enumRenameKey, + enumCreateKey, + enumSetValueKey, + enumRenameValue, +}; +class CKeyDlg : public CDialog +{ + DECLARE_DYNAMIC(CKeyDlg) + +public: + CKeyDlg(CWnd* pParent = NULL); // ׼캯 + virtual ~CKeyDlg(); + + DLG_TYPE m_nDlgType; + + +// Ի + enum { IDD = IDD_KEY_DIALOG }; + +protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV ֧ + + DECLARE_MESSAGE_MAP() +public: + CString m_strKeyNameStatic; + CString m_strKeyNameEdit; + virtual BOOL OnInitDialog(); +}; diff --git a/Register/RegisterManager/RegisterManager/ReadMe.txt b/Register/RegisterManager/RegisterManager/ReadMe.txt new file mode 100644 index 0000000..71228b8 --- /dev/null +++ b/Register/RegisterManager/RegisterManager/ReadMe.txt @@ -0,0 +1,77 @@ +================================================================================ +MICROSOFT : RegisterManager Ŀ +=============================================================================== + +ӦóΪ RegisterManager Ӧó򡣴Ӧó򲻽ʾ Microsoft Ļʹ÷ΪдӦó㡣 + +ļҪ RegisterManager Ӧóÿļݡ + +RegisterManager.vcxproj +ʹӦóɵ VC++ ĿĿļ +ɸļ Visual C++ İ汾ϢԼйʹӦóѡƽ̨úĿܵϢ + +RegisterManager.vcxproj.filters + ʹáӦó򵼡ɵ VC++ Ŀɸѡļ + йĿļɸѡ֮ĹϢ IDE УֹͨضڵԷʽʾչļ磬.cppļ롰Դļɸѡ + +RegisterManager.h +ӦóҪͷļĿضͷļ( Resource.h) CRegisterManagerApp Ӧóࡣ + +RegisterManager.cpp +ǰӦó CRegisterManagerApp ҪӦóԴļ + +RegisterManager.rc +dzʹõ Microsoft Windows Դб RES Ŀ¼д洢ͼꡢλͼ͹ꡣļֱ Microsoft Visual C++ нб༭ĿԴλ 2052 С + +res\RegisterManager.ico +ӦóͼͼļͼҪԴļ RegisterManager.rc С + +res\RegisterManager.rc2 +ļ Microsoft Visual C++ нб༭ԴӦýԴ༭༭ԴڴļС + + +///////////////////////////////////////////////////////////////////////////// + +Ӧó򵼴һԻ: + +RegisterManagerDlg.hRegisterManagerDlg.cpp - Ի +Щļ CRegisterManagerDlg ࡣඨӦóԻΪöԻģλ RegisterManager.rc Уļ Microsoft Visual C++ нб༭ + + +///////////////////////////////////////////////////////////////////////////// + +: + +ActiveX ؼ +Ӧóʹ ActiveX ؼ֧֡ + +ӡӡԤ֧ +Ӧóͨ MFC CView еijԱڴӡӡúʹӡԤĴ롣 + +///////////////////////////////////////////////////////////////////////////// + +׼ļ: + +StdAfx.hStdAfx.cpp +ЩļΪ RegisterManager.pch Ԥͷ (PCH) ļΪ StdAfx.obj Ԥļ + +Resource.h +DZ׼ͷļµԴ ID +Microsoft Visual C++ ȡ´ļ + +RegisterManager.manifest + Ӧó嵥ļ Windows XP Ӧó + ض汾г򼯵ԡسʹô + Ϣӳ򼯻ʵij򼯻 + Ӧó˽ϢӦó嵥Ϊ·ַΪ + Ӧóִļװͬļеⲿ .manifest ļ + ҲԴʽڸÿִļС +///////////////////////////////////////////////////////////////////////////// + +ע: + +ӦóʹáTODO:ָʾӦӻԶԴ벿֡ + +Ӧóڹ DLL ʹ MFCҪ·Щ MFC DLLӦóõϵͳĵǰòͬҪ·ӦıػԴ MFC100XXX.DLLйĸϢμ MSDN ĵй Redistributing Visual C++ applications (· Visual C++ Ӧó)½ڡ + +///////////////////////////////////////////////////////////////////////////// diff --git a/Register/RegisterManager/RegisterManager/RegFindDlg.cpp b/Register/RegisterManager/RegisterManager/RegFindDlg.cpp new file mode 100644 index 0000000..848881e --- /dev/null +++ b/Register/RegisterManager/RegisterManager/RegFindDlg.cpp @@ -0,0 +1,721 @@ +// RegFindDlg.cpp : ʵļ +// + +#include "stdafx.h" +#include "RegisterManager.h" +#include "RegFindDlg.h" +#include "afxdialogex.h" +#include "RegisterManagerDlg.h" + +// CRegFindDlg Ի + +IMPLEMENT_DYNAMIC(CRegFindDlg, CDialog) + +#define WM_SEARCH_FINISH WM_USER + 105 +#define WM_UPDATE_UI WM_USER + 106 + + +extern CWnd* g_Father; + +DWORD WINAPI SearchRegistryProc(PVOID lPParam) +{ + if (lPParam) + { + CRegFindDlg *Dlg = (CRegFindDlg*)lPParam; + Dlg->SearchRegistry(); + } + + return 0; +} + +CRegFindDlg::CRegFindDlg(CWnd* pParent /*=NULL*/) + : CDialog(CRegFindDlg::IDD, pParent) + , m_strSearchInKey(_T("")) + , m_nRadio(0) + , m_strFindWhat(_T("")) + , m_bKeys(TRUE) + , m_bMachCase(FALSE) + , m_bMachWholeString(FALSE) + , m_bData(TRUE) + , m_bValues(TRUE) + , m_strSearchResult(_T("")) +{ + m_strFindWhatUpper = L""; + m_nCnt = 0; + m_bStop = FALSE; + m_hThread = NULL; + +} + +CRegFindDlg::~CRegFindDlg() +{ +} + +void CRegFindDlg::DoDataExchange(CDataExchange* pDX) +{ + CDialog::DoDataExchange(pDX); + DDX_Control(pDX, IDC_LIST, m_List); + DDX_Text(pDX, IDC_EDIT, m_strSearchInKey); + DDX_Radio(pDX, IDC_RADIO_SEARCH_IN, m_nRadio); + DDX_Text(pDX, IDC_EDIT_FIND_WHAT, m_strFindWhat); + DDX_Check(pDX, IDC_CHECK_KEY, m_bKeys); + DDX_Check(pDX, IDC_CHECK_MACH_CASE, m_bMachCase); + DDX_Check(pDX, IDC_CHECK_MACH_WHOLE_STRING, m_bMachWholeString); + DDX_Check(pDX, IDC_CHECK_DATA, m_bData); + DDX_Check(pDX, IDC_CHECK_VALUES, m_bValues); + DDX_Text(pDX, IDC_STATIC_FIND_RESULT, m_strSearchResult); + DDX_Control(pDX, IDC_ANIMATE, m_ctlAnimate); +} + + +BEGIN_MESSAGE_MAP(CRegFindDlg, CDialog) + + ON_BN_CLICKED(IDC_BUTTON_START, &CRegFindDlg::OnBnClickedButtonStart) + ON_MESSAGE(WM_UPDATE_UI, &CRegFindDlg::UpdateUI) + ON_BN_CLICKED(IDC_BUTTON_STOP, &CRegFindDlg::OnBnClickedButtonStop) + ON_WM_CLOSE() + ON_NOTIFY(NM_DBLCLK, IDC_LIST, &CRegFindDlg::OnNMDblclkList) +END_MESSAGE_MAP() + + +// CRegFindDlg Ϣ +LRESULT CRegFindDlg::UpdateUI(WPARAM, LPARAM) +{ + UpdateData(FALSE); + return 0; +} + +BOOL CRegFindDlg::OnInitDialog() +{ + CDialog::OnInitDialog(); + m_ctlAnimate.Open(IDR_AVI);//AVIļ + m_List.SetExtendedStyle(LVS_EX_FULLROWSELECT); + m_List.InsertColumn(0,L"", LVCFMT_LEFT, 300); + m_List.InsertColumn(1,L"ֵ", LVCFMT_LEFT, 80); + m_List.InsertColumn(2,L"", LVCFMT_LEFT, 120); + + + m_strSearchInKey.IsEmpty() ? m_nRadio = 1 : m_nRadio = 0; //עؼ + GetDlgItem(IDC_EDIT)->EnableWindow(!m_nRadio); + return TRUE; // return TRUE unless you set the focus to a control + // 쳣: OCX ҳӦ FALSE +} + + + + + +void CRegFindDlg::OnBnClickedButtonStart() +{ + UpdateData(TRUE); + m_List.DeleteAllItems(); + + // жǷѾд + if (m_strFindWhat.IsEmpty()) + { + MessageBox(L"",L"Shine", MB_OK | MB_ICONWARNING); + return; + } + + // ijֵвѯ + if (m_nRadio == 0) + { + // жǷд + if (m_strSearchInKey.IsEmpty()) + { + MessageBox(L"ҷΧ", L"Shine", MB_OK | MB_ICONWARNING); + return; + } + + // жϸǷ + HKEY hKey = GetRootKey(m_strSearchInKey); + if (!hKey) + { + MessageBox(L"",L"Shine", MB_OK | MB_ICONERROR); + return; + } + + // жܷ򿪸ü + CString strSubKey; + if (m_strSearchInKey.Find('\\') != -1) + { + strSubKey = m_strSearchInKey.Right(m_strSearchInKey.GetLength() - m_strSearchInKey.Find('\\') - 1); + } + HKEY hKeyTemp = NULL; + LONG ulRet = RegOpenKeyEx(hKey, strSubKey, 0, KEY_READ, &hKeyTemp); + + if (ERROR_SUCCESS != ulRet) + { + MessageBox(L"ܴ򿪸üֵ", L"Shine", MB_OK | MB_ICONERROR); + return; + } + + RegCloseKey(hKeyTemp); + } + + // һݴдĸIJ,ҺԴСд,Ϳʹ + m_strFindWhatUpper = m_strFindWhat; + m_strFindWhatUpper.MakeUpper(); + + // ͨǰļ飬ʼ + InitControl(FALSE); //ؼ + + if (m_hThread) + { + CloseHandle(m_hThread); + m_hThread = NULL; + } + DWORD dwTid = 0; + m_hThread = CreateThread(NULL, 0, SearchRegistryProc, this, 0, &dwTid); +} + + + +HKEY CRegFindDlg::GetRootKey(CString strKey) +{ + HKEY hRet = NULL; + + if (strKey.IsEmpty()) + { + return hRet; + } + + CString strKeyRoot; + if (strKey.Find('\\') != -1) + { + strKeyRoot = strKey.Left(strKey.Find('\\')); + } + else + { + strKeyRoot = strKey; + } + + if (!strKeyRoot.CompareNoCase(L"HKEY_CLASSES_ROOT")) + { + hRet = HKEY_CLASSES_ROOT; + } + else if (!strKeyRoot.CompareNoCase(L"HKEY_CURRENT_USER")) + { + hRet = HKEY_CURRENT_USER; + } + else if (!strKeyRoot.CompareNoCase(L"HKEY_LOCAL_MACHINE")) + { + hRet = HKEY_LOCAL_MACHINE; + } + else if (!strKeyRoot.CompareNoCase(L"HKEY_USERS")) + { + hRet = HKEY_USERS; + } + else if (!strKeyRoot.CompareNoCase(L"HKEY_CURRENT_CONFIG")) + { + hRet = HKEY_CURRENT_CONFIG; + } + + return hRet; +} + + +VOID CRegFindDlg::SearchRegistry() +{ + m_bStop = FALSE; + m_nCnt = 0; + m_strSearchResult = L"ڲѯ"; + SendMessage(WM_UPDATE_UI); + + + + // ָ + if (m_nRadio == 0) + { + HKEY hKey = GetRootKey(m_strSearchInKey); + CString strSubKey; + if (m_strSearchInKey.Find('\\') != -1) + { + strSubKey = m_strSearchInKey.Right(m_strSearchInKey.GetLength() - m_strSearchInKey.Find('\\') - 1); + } + + EnumKeys(hKey, strSubKey); + } + + // ע + else + { + m_ctlAnimate.Play(0,-1,-1);//Ŷ + EnumKeys(HKEY_CLASSES_ROOT, NULL); + EnumKeys(HKEY_CURRENT_USER, NULL); + EnumKeys(HKEY_LOCAL_MACHINE, NULL); + EnumKeys(HKEY_USERS, NULL); + EnumKeys(HKEY_CURRENT_CONFIG, NULL); + m_ctlAnimate.Stop();//ֹͣ + + } + + InitControl(TRUE); + m_strSearchResult.Format(L"ѯ%dƥ", m_nCnt); + + SendMessage(WM_UPDATE_UI); + +// SendMessage(WM_SEARCH_FINISH); +} + + + +void CRegFindDlg::EnumKeys(HKEY hRoot, CString strSubKey) +{ + if (!hRoot) + { + return; + } + + strSubKey.TrimLeft('\\'); + HKEY hKeyTemp = NULL; + LONG nRet = RegOpenKeyEx(hRoot, strSubKey, 0, KEY_READ, &hKeyTemp); + if (nRet != ERROR_SUCCESS) + { + return; + } + + DWORD dwSubKeys = 0, dwSubValues = 0; + LONG ulRet = ::RegQueryInfoKey(hKeyTemp, NULL, NULL, NULL, &dwSubKeys, NULL, NULL, &dwSubValues, NULL, NULL, NULL, NULL); + if (ulRet != ERROR_SUCCESS) + { + RegCloseKey(hKeyTemp); + return; + } + + // CheckBox + if (m_bKeys) + { + for (DWORD dwIndex = 0; !m_bStop && dwIndex < dwSubKeys; dwIndex++) + { + DWORD dwLen = 1024; + TCHAR szSubName[1024]; + memset(szSubName, 0, 1024 * sizeof(TCHAR)); + + ulRet = RegEnumKey(hKeyTemp, dwIndex, szSubName, dwLen); + if (ulRet == ERROR_SUCCESS) + { + CString strSubName = CString(szSubName); + + // ִСд & ƥȫַ + if (m_bMachCase && m_bMachWholeString) + { + if (!strSubName.Compare(m_strFindWhat)) + { + InsertKeys(hRoot, strSubKey, strSubName); + } + } + + // ִСд,Dzȫƥ + else if (m_bMachCase && !m_bMachWholeString) + { + if (-1 != strSubName.Find(m_strFindWhat)) + { + InsertKeys(hRoot, strSubKey, strSubName); + } + } + + // ִСд & ȫƥ + else if (!m_bMachCase && m_bMachWholeString) + { + if (!strSubName.CompareNoCase(m_strFindWhat)) + { + InsertKeys(hRoot, strSubKey, strSubName); + } + } + + // ִСд & ȫƥ + else if (!m_bMachCase && !m_bMachWholeString) + { + CString szTemp = strSubName; + szTemp.MakeUpper(); + + if (szTemp.Find(m_strFindWhatUpper) != -1) + { + InsertKeys(hRoot, strSubKey, strSubName); + } + } + + // ݹö + EnumKeys(hRoot, strSubKey + L"\\" + szSubName); + } + } + } + + // ֵݶҪ,ôֱӷ + if (!m_bData && !m_bValues) + { + RegCloseKey(hKeyTemp); + return; + } + + // öֵ + for (DWORD dwIndex = 0; !m_bStop && dwIndex < dwSubValues; dwIndex++) + { + DWORD dwLen = 1024; + TCHAR szSubName[1024]; + memset(szSubName, 0, 1024 * sizeof(TCHAR)); + + DWORD dwType = 0, dwDataLen = 0x2000; + BYTE Data[0x2000] = {0}; + ulRet = RegEnumValue(hKeyTemp, dwIndex, szSubName, &dwLen, NULL, &dwType, Data, &dwDataLen); + if (ulRet == ERROR_SUCCESS) + { + // öֵѡ + if (m_bValues) + { + CString strSubName = CString(szSubName); + + // ִСд & ƥȫַ + if (m_bMachCase && m_bMachWholeString) + { + if (!strSubName.Compare(m_strFindWhat)) + { + InsertVlaues(hRoot, strSubKey, strSubName); + } + } + + // ִСд,Dzȫƥ + else if (m_bMachCase && !m_bMachWholeString) + { + if (-1 != strSubName.Find(m_strFindWhat)) + { + InsertVlaues(hRoot, strSubKey, strSubName); + } + } + + // ִСд & ȫƥ + else if (!m_bMachCase && m_bMachWholeString) + { + if (!strSubName.CompareNoCase(m_strFindWhat)) + { + InsertVlaues(hRoot, strSubKey, strSubName); + } + } + + // ִСд & ȫƥ + else if (!m_bMachCase && !m_bMachWholeString) + { + CString szTemp = strSubName; + szTemp.MakeUpper(); + + if (szTemp.Find(m_strFindWhatUpper) != -1) + { + InsertVlaues(hRoot, strSubKey, strSubName); + } + } + } + + // öݱѡ + if (m_bData) + { + InsertData(hRoot, strSubKey, szSubName, dwType, Data, dwDataLen); + } + } + } + + RegCloseKey(hKeyTemp); +} + + + +void CRegFindDlg::InsertKeys(HKEY hRoot, CString strSubKey, CString strSubSubKey) +{ + if (!hRoot) + { + return; + } + + CString strKeyPath = GetRootKeyString(hRoot); + strKeyPath += L"\\" + strSubKey + L"\\" + strSubSubKey; + int nItem = m_List.InsertItem(m_List.GetItemCount(), strKeyPath); + m_List.SetItemText(nItem, 1, L""); + m_List.SetItemText(nItem, 2, L""); + m_nCnt++; +} + + +void CRegFindDlg::InsertVlaues(HKEY hRoot, CString strSubKey, CString strValue) +{ + if (!hRoot || strValue.IsEmpty()) + { + return; + } + + CString strKeyPath = GetRootKeyString(hRoot); + strKeyPath += L"\\" + strSubKey; + int nItem = m_List.InsertItem(m_List.GetItemCount(), strKeyPath); + m_List.SetItemText(nItem, 1, strValue); + m_List.SetItemText(nItem, 2, L""); + m_nCnt++; +} + + + +void CRegFindDlg::InsertData(HKEY hRoot, CString strSubKey, CString strValue, DWORD dwType, PBYTE Data, DWORD dwDataLen) +{ + if (!hRoot || !Data || dwDataLen <= 0) + { + return; + } + + CString strRet, strCmp; + switch (dwType) + { + case REG_SZ: + case REG_EXPAND_SZ: + strCmp = strRet = (WCHAR*)Data; + break; + + case REG_DWORD: + { + strCmp.Format(L"%ld", *(PULONG)Data); + if (m_strFindWhat.GetLength() == strCmp.GetLength()) + { + BOOL bNumber = TRUE; + for (int i = 0; i < m_strFindWhat.GetLength(); i++) + { + WCHAR ch = m_strFindWhat.GetAt(i); + if (ch < '0' || ch > '9') + { + bNumber = FALSE; + break; + } + } + + if (bNumber && *(PULONG)Data == _wtoi(m_strFindWhat)) + { + strRet.Format(L"0x%08X (%d)", *(PULONG)Data, *(PULONG)Data); + } + else + { + return; + } + } + else + { + return; + } + } + break; + + case REG_DWORD_BIG_ENDIAN: + { + BYTE Value[4] = {0}; + Value[0] = *((PBYTE)Data + 3); + Value[1] = *((PBYTE)Data + 2); + Value[2] = *((PBYTE)Data + 1); + Value[3] = *((PBYTE)Data + 0); + strCmp.Format(L"%ld", *(PULONG)Value); + strRet.Format(L"0x%08X (%ld)", *(PULONG)Value, *(PULONG)Value); + } + break; + case REG_QWORD: + { + strCmp.Format(L"%ld", *(PQWORD)Data); + if (m_strFindWhat.GetLength() == strCmp.GetLength()) + { + BOOL bNumber = TRUE; + for (int i = 0; i < m_strFindWhat.GetLength(); i++) + { + WCHAR ch = m_strFindWhat.GetAt(i); + if (ch < '0' || ch > '9') + { + bNumber = FALSE; + break; + } + } + + if (bNumber && *(PQWORD)Data == _wtoi(m_strFindWhat)) + { + strRet.Format(L"0x%08X (%ld)", *(PQWORD)Data, *(PQWORD)Data); + } + else + { + return; + } + } + else + { + return; + } + } + break; + case REG_MULTI_SZ: + { + DWORD len = 0; + while (wcslen((WCHAR*)Data + len)) + { + strRet += ((WCHAR*)Data + len); + strRet += L" "; + len += wcslen((WCHAR*)Data + len) + 1; + } + + strCmp = strRet; + } + break; + + default: + return; + } + + if (strCmp.IsEmpty()) + { + return; + } + + CString strSubName = strCmp; + BOOL bInsert = FALSE; + + // ִСд & ƥȫַ + if (m_bMachCase && m_bMachWholeString) + { + if (!strSubName.Compare(m_strFindWhat)) + { + bInsert = TRUE; + } + } + + // ִСд,Dzȫƥ + else if (m_bMachCase && !m_bMachWholeString) + { + if (-1 != strSubName.Find(m_strFindWhat)) + { + bInsert = TRUE; + } + } + + // ִСд & ȫƥ + else if (!m_bMachCase && m_bMachWholeString) + { + if (!strSubName.CompareNoCase(m_strFindWhat)) + { + bInsert = TRUE; + } + } + + // ִСд & ȫƥ + else if (!m_bMachCase && !m_bMachWholeString) + { + CString strTemp = strSubName; + strTemp.MakeUpper(); + + if (strTemp.Find(m_strFindWhatUpper) != -1) + { + bInsert = TRUE; + } + } + + if (bInsert) + { + CString strKeyPath = GetRootKeyString(hRoot); + strKeyPath += L"\\" + strSubKey; + int nItem = m_List.InsertItem(m_List.GetItemCount(), strKeyPath); + m_List.SetItemText(nItem, 1, strValue); + m_List.SetItemText(nItem, 2, strRet); + m_nCnt++; + } +} + + + +CString CRegFindDlg::GetRootKeyString(HKEY hRoot) +{ + CString strRet; + if (!hRoot) + { + return strRet; + } + + if (hRoot == HKEY_CLASSES_ROOT) + { + strRet = L"HKEY_CLASSES_ROOT"; + } + else if (hRoot == HKEY_CURRENT_USER) + { + strRet = L"HKEY_CURRENT_USER"; + } + else if (hRoot == HKEY_LOCAL_MACHINE) + { + strRet = L"HKEY_LOCAL_MACHINE"; + } + else if (hRoot == HKEY_USERS) + { + strRet = L"HKEY_USERS"; + } + else if (hRoot == HKEY_CURRENT_CONFIG) + { + strRet = L"HKEY_CURRENT_CONFIG"; + } + + return strRet; +} + +void CRegFindDlg::OnBnClickedButtonStop() +{ + m_bStop = TRUE; + InitControl(TRUE); +} + + + +void CRegFindDlg::InitControl(BOOL bOk) +{ + GetDlgItem(IDC_CHECK_KEY)->EnableWindow(bOk); + GetDlgItem(IDC_CHECK_VALUES)->EnableWindow(bOk); + GetDlgItem(IDC_CHECK_DATA)->EnableWindow(bOk); + GetDlgItem(IDC_CHECK_MACH_CASE)->EnableWindow(bOk); + GetDlgItem(IDC_CHECK_MACH_WHOLE_STRING)->EnableWindow(bOk); + GetDlgItem(IDC_RADIO_SEARCH_IN)->EnableWindow(bOk); + GetDlgItem(IDC_RADIO_SEARCH_ALL)->EnableWindow(bOk); + GetDlgItem(IDC_BUTTON_START)->EnableWindow(bOk); + GetDlgItem(IDC_EDIT_FIND_WHAT)->EnableWindow(bOk); + GetDlgItem(IDC_EDIT)->EnableWindow(bOk); + GetDlgItem(IDC_EDIT_FIND_WHAT)->EnableWindow(bOk); + GetDlgItem(IDC_BUTTON_STOP)->EnableWindow(!bOk); +} + +void CRegFindDlg::OnClose() +{ + m_bStop = TRUE; + if (m_hThread) + { + if (WaitForSingleObject(m_hThread, 500) != WAIT_OBJECT_0) + { + TerminateThread(m_hThread, 0); + } + + CloseHandle(m_hThread); + m_hThread = NULL; + } + + + CDialog::OnClose(); + + delete this; +} + + + +void CRegFindDlg::OnNMDblclkList(NMHDR *pNMHDR, LRESULT *pResult) +{ + int nItem = m_List.GetSelectionMark(); + if (nItem != -1) + { + CString strKey = m_List.GetItemText(nItem, 0); + CString strValue = m_List.GetItemText(nItem, 1); + + JmpToRegistry(strKey, strValue); + } + *pResult = 0; +} + + +void CRegFindDlg::JmpToRegistry(CString strKey, CString strData) +{ + if (!strKey.IsEmpty() && g_Father) + { + + ((CRegisterManagerDlg*)g_Father)->JmpToReg(strKey, strData); + } +} \ No newline at end of file diff --git a/Register/RegisterManager/RegisterManager/RegFindDlg.h b/Register/RegisterManager/RegisterManager/RegFindDlg.h new file mode 100644 index 0000000..303ad38 --- /dev/null +++ b/Register/RegisterManager/RegisterManager/RegFindDlg.h @@ -0,0 +1,53 @@ +#pragma once +#include "afxcmn.h" + + +// CRegFindDlg Ի + +class CRegFindDlg : public CDialog +{ + DECLARE_DYNAMIC(CRegFindDlg) + +public: + CRegFindDlg(CWnd* pParent = NULL); // ׼캯 + virtual ~CRegFindDlg(); + HKEY CRegFindDlg::GetRootKey(CString strKey); + VOID CRegFindDlg::SearchRegistry(); + void CRegFindDlg::EnumKeys(HKEY hRoot, CString strSubKey); + void CRegFindDlg::InsertKeys(HKEY hRoot, CString strSubKey, CString strSubSubKey); + CString CRegFindDlg::GetRootKeyString(HKEY hRoot); + void CRegFindDlg::InsertVlaues(HKEY hRoot, CString strSubKey, CString strValue); + void CRegFindDlg::InsertData(HKEY hRoot, CString strSubKey, CString strValue, DWORD dwType, PBYTE Data, DWORD dwDataLen); + void CRegFindDlg::InitControl(BOOL bOk); + void CRegFindDlg::JmpToRegistry(CString strKey, CString strData); +// Ի + enum { IDD = IDD_FIND_REG_DIALOG }; + +protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV ֧ + + DECLARE_MESSAGE_MAP() +public: + CListCtrl m_List; + virtual BOOL OnInitDialog(); + CString m_strSearchInKey; + int m_nRadio; + afx_msg void OnBnClickedRadioSearchIn(); + afx_msg void OnBnClickedButtonStart(); + afx_msg LRESULT UpdateUI(WPARAM,LPARAM); + CString m_strFindWhat; + CString m_strFindWhatUpper; // д + BOOL m_bStop; + HANDLE m_hThread; + BOOL m_bKeys; + BOOL m_bMachCase; + BOOL m_bMachWholeString; + BOOL m_bData; + BOOL m_bValues; + ULONG m_nCnt; //¼ҵĸ + CString m_strSearchResult; + CAnimateCtrl m_ctlAnimate; + afx_msg void OnBnClickedButtonStop(); + afx_msg void OnClose(); + afx_msg void OnNMDblclkList(NMHDR *pNMHDR, LRESULT *pResult); +}; diff --git a/Register/RegisterManager/RegisterManager/RegHexEditDlg.cpp b/Register/RegisterManager/RegisterManager/RegHexEditDlg.cpp new file mode 100644 index 0000000..8155664 --- /dev/null +++ b/Register/RegisterManager/RegisterManager/RegHexEditDlg.cpp @@ -0,0 +1,135 @@ +// RegHexEditDlg.cpp : ʵļ +// + +#include "stdafx.h" +#include "RegisterManager.h" +#include "RegHexEditDlg.h" +#include "afxdialogex.h" + + +// CRegHexEditDlg Ի + +IMPLEMENT_DYNAMIC(CRegHexEditDlg, CDialog) + +CRegHexEditDlg::CRegHexEditDlg(CWnd* pParent /*=NULL*/) + : CDialog(CRegHexEditDlg::IDD, pParent) + , m_strValueNameEdit(_T("")) + , m_strHex(_T("")) +{ + +} + +CRegHexEditDlg::~CRegHexEditDlg() +{ +} + +void CRegHexEditDlg::DoDataExchange(CDataExchange* pDX) +{ + CDialog::DoDataExchange(pDX); + DDX_Control(pDX, IDC_HEXEDIT, m_HexEdit); + DDX_Text(pDX, IDC_EDIT_VALUE_NAME, m_strValueNameEdit); + DDX_Text(pDX, IDC_HEXEDIT, m_strHex); +} + + +BEGIN_MESSAGE_MAP(CRegHexEditDlg, CDialog) + ON_BN_CLICKED(IDOK, &CRegHexEditDlg::OnBnClickedOk) +END_MESSAGE_MAP() + + +// CRegHexEditDlg Ϣ + + +BOOL CRegHexEditDlg::OnInitDialog() +{ + CDialog::OnInitDialog(); + + + SetWindowText(L"Ʊ༭"); + + ULONG i = 0; + CString strShowData; + for (i=0;i0z zQW+y56rwg^ziU(1-PL{H*Y9~g@B4n9f1XwAT<2QrdmL+C$8c@{09X_$l$D5H{}zH# zP8daPI1H*NrBE*<(&zCh|IEvWCYc>TSitg^mi&f>|N#{(9f`8VEQpQ!GxpAa*0 zc5{@(QlBzde|cG~zwEB97Do1t&R*X3p1SC1(NWa#;KtxzWqQ_b){gd`|5IMV(-u~t zPV7R_1T?@5J#|1I)Ib*wfjTPrSAQkpU;Xv8_j32~w6<0&w^r>1hxG;CFfgt%7Xc$=< zX&4(EGE&npM!on0W1y??Pt_(yDryJ*nS-H`fuV+x$&ugLP)F;46D0MOQ^%>yV0;26oqWtn}}*hNkS#O@TInv>+C{b0@a4 z8LQ`P>*?<0?%<6zb@uYHcEzfRi({|%-@SUfvGeiETfeh%l|XG-{9Fc4Tf~AI5S#0t zI`4Ll-d#fApQ}clWG9AS=Y;mJGr-RNuRSG(Fp?-*p@;!G^aLQRB+KuAe-Kb5Dj^V7 z67)o`C=#H)z8+Oj4xA?jGHY0otg;XgMC?_Z6L>eKD3=`w= z#9`DQQYD2*BFf1Xc*&0tM^I@n5q~_`14u;FSZtt|mnh;Nj1P{BcWd!$L40CSA7X;M zyu9Rnk`4#s@qT{8BX}yFXoPW3>FB?b8hd8MSMX9gIjCnfnh1Uovm0FY2ctY3OYW`F``QUI3}hn540x`?DI zQmlVvR(g6$201fecTx%`wG@C%t|G>S2SodmGsp@7DJdJ+SIXB^kt(aINpp1x8Kji- zq_m{Om2zN;C5990zLO~aO3626mj$yEMn z3X(thpd`pY_dD62Oio9G*!?d&VwFH9XHdwQ(Fy@vfAL2It3oMXqbcNofPj?rzu`kE zq>Kb&dNr!~jXyBeQKDnhGtyCi{^~!qc_#np*l1!vbaZq;fCshUXJ8^#5lI;t8I@?7 z{>Hxwl~z?%`yqlq@T4llB|7Mjc1fr>)-NL~lNdnw#T=z*Qi)Xo(bdt>>3+ZSr%tM0 zRYpL7Usn3>c(iOmh)YIB){(#QL9B>=L5R_xrKln(JtO1yKBA)Kz~o2x`L>*(-ANf< z))gpAv@2=<@^wX70tlsES!4kIpD80s`%xaHOCZ0T_QR&-beS0{|38wh`PnY&KQ*lR znewBQfb!I||7VJNznowAnNp$DdP@KQ$0=%PnJ;Q+Ii&!GLT!gq&%ctsM>7vFg47W# z>H~#Bl|w7K$)9qFT8~5VmmGo>7%KTQ5LO0EAS{oY`b4k)yK?C75{T(`X zswan|%hoSVD>y1@I37sh;iO7AsU)u5jt=s)EpULj$9Q>l+PfN(2c-B9qbxXWl*R*xsEG3nTJraKSd#0;mEIi!W_D|q5~9u<-lPGS1$_%R6?OFg;FT}%IMgy zp)3I75)aV!(*ac>{ojeoR8|BO`%xsLh;EUU?f#!q0;=n$rBEi7DI-WX#!`uw&jGbb zfIrW{CR8Sg;;(anMKu385YVPaHE8oMC+LY@|F_P;ud57gWIH=Y#ETlD9Q+-Etq``S^JB1h5S1m7mKhh=O%*GWf_9ejs1!Eai|Q4~*VMu!39zRSu*xYnImrpR8OtZQPCg@v%AM#RyL^I4=rE#Y z(8{KxBTD&>BASb@RLFk|Xlm<`?3?^OqB68RP{Ot{M=R%vewo9c^GIEPD-N$a9s1LeE`L>LUfk0kUu#hOULR4XExH;?&KMvbtZ9z810VEQgKswb0WY2kmTtNVs5M4k$(--X0f z6w1Q(z>V;|aGRtISHo1H{In`m#Hc{k8CAFusROrT4xo2kxSON_cT@L6U4||yGlHu4 zLr@-m6l&8B!+DY`T#vGWyXn?&H_a95GTq^Nl0P(L9)JfqhoLFo3>vcRQECT|3a#PE zC3|QrIEm5|&~(uYS}%FRL)5p&R|4T>r9aTJg#!oIX<%5N4Xe0IfQ`2t*!jzWe_ttV z6sZDP<*OhfcMn8OlVPhyA;_zjgO+CzxSzTVyb=w-FL@uf$hN?CrFPhkdj|5_k74(r zCm^Bv0(NV^1_i@jP_pWSeWv|@Gk6SY2cLr0;Z8Vc*$DcmqK$f z5!!CW!|OZY&|Z}Y=}k8w{Ow&RXuJjGt+mkoAQE0Tro#KyI2e4E1Rp!nptG?6dY;~f zcQ2};|79HzGkW24)@LB(PD1pB0Z6;t4{0~w!|5wCK&to#Db?SgwB`fcuKftnJ@+B0 z>ptA;Y=blX58>?KW5^kK4i`VYgd3l`;MPHZ*8+#iP8_Vz^~^sWOsx;ml%Sv|aeejf&UyWo9)FWhe(g{F>Sc=2Ww8s7bY zo{z)ucxD(n#+P7pWEdvDe1X}i3HUTV12Z#Uf&BeDlEp|t{h!0pyZI+~|2u`|8an!o%SA>;`Z|cf;ZbYrBh-Sl z7`2tnn4i}v6_U4)gM*Epo_;;OI?7ohg8k-WQz*1<5f+l6w!+WP{S#lHhEq~hT+6}E z#>%#yjh+tS5rNgz+|*cIt&7AKVR_Uo>IkU#bD3&tswyhW1Z-?<8&D&3n;fl;j9TaB zU9@FnBqb!4@xp@qyqgg|hf1K9t%L|rk2p3^dqwN&YHz(b|Cl;SG7=IJ3e<563i7Yu z&*i+Ec&D;Lz_E{mjg_9x)z!6janVU{nLtuvFT!sTLJc7P=X1`TpPG87O6`#%$694H z3VQlRSJ#J2OD<;mI`Z16N4nIBr4mr_=g;R%&5f%r6RcHKUQ2BN;U6t6)!Ld{>F-6$ zpu4)7{c&sl|k-d*Vt- zQO-OHbBp!VS=FH8*_sf+BqBgz%-C?RnJ#MN7ye2~{vtJeD@0?)Det2aG$8`VFI4!K z6Q&0ZZ4Tdo^U#5Z*FCF(8l!OUMj(s z6@32E(nL{i&hok~<2hP>61Y0rJ3BktJKCC3TM!pR_^yTqDn7sF!Tl_>&{{YgYG4K5 z*m%#?)zQw{(#p=o%+z47j1+S<0oncFT(e9cNI)Ls4plf zDay^wMtDv?ui#)$&r=>@o~xO5$ZPBA>l+za>gnm5*&L$c5dj**m6Fnu{GyA2{=Rs8 zNU(P>6(8*B!6LFnfcex=cn<(F=%3!hy3q&=vu~?FD}L} zE+#B4JYSr~<7223OKspk;E_IARMLU)*Oopc&n$jhqTh=Y4FsIIQJ(%`Y5HnpSYiYrl)9Jx z8UOr7MpeZ`` zTer%}&ZecMq$DQBMlah8|B+;PWMuf`d(@*}@Z{vw^w^kR7XQD|kVggvP=_k0?5W(7 zsUa~j=HGyS6%3;R-2SUK$;9NyNaC5qzpDTJW%gyqGJb_UF_IdPvGWh%)k<&DP*;dV z;y+_o*px5#J~`$3KXCn9)w8s-ZGS8HJ%e+>XEW`5B z{AtHh>v1UlWyc~F>90Ulil`9<{60od-ys9s=CXg;up(AUV6LJFp~hmcRnP>Kb{_*y zz7XJZzyZIL>arax_|t~n;%A8LSR)X_9|n0ZW7r#b1h)D*fRwZUvh5nJxeDTR*^$k< z0g{bTJj4ZQ$Y#wv#s?Y41($8rY!?a0aZ!Xk=N0?35ZR{}+-2aR`(C){Ee)lhstMbWeJUDl2|MEKKsv?_b|TwUCiw*H&hmu4Ili## zVgSfp!h=SH9cV^7f%X|!*q`bJYMI`knHvZPvI4*+-Urk#27}>+P`E}=K=$iCsESiY zwk!_Wu-b4vLj5lr_Iji)+(I^Nb-V%GP1z3>afZmAJqWjA&7m^M2<{{s!=2Qla4*9d zrCv~*=>ymD?4c;n2}%o3!qv;3aQ#Lg+|Sa5`^c7U&OZe8*|zYg$PPMgxgopN8(NBx z4U2I13qs(@)gX9w-4~wU^g%HgI`0I-o4bL)w(&I3uRRB=xr>3F?<%rmD}h(02DV6E z1|hjB5I>X&)^^B#-BAzNoeju-ZH666&p}S331qcif`UmG>^t-xaQcrx?a))uKKv5& zY23*z%k_u_@|G8d)5^Aou351!mkino&^%yEFOiFg3mxKof*cPOp;ux!t!^)$kr*H57C zZ5z}*>4EtECP*J_h3t`bC>ZU4YGl)}HeLX$!{$)M%_w~Zd{V&Sa<)hxCoYSGY|K6K5n6ZM>y$f zZ8f}CC%TzO64|?({sqWhPqzW(oV0YGe);m{FfX4JKi}p}EB8|_PMTv4E4?DU8n|jd zn{7L+FN$naWY1C=WF_s9-6g$_V-4FrRyqcATk_|v;vym<0{X%Ne4CMmnwh*uK4;f1 z4vsZSY^!N49xT*}XlaUz2d#~v&;9yqXnySRvv2$cac zNYCx$?WRGQzjF#b?kc9#Ykh2UF}$g?LvHuR)Bs;kmYuo>tqxl09dvRu1LWf+uO?* zN=pxggUEX@@P44btLsvEL@2Tbg1x;wy-$04GBXKo)zZ>6I0-N~I55z4rRXXl6jcX? zKlefP-ku&bLe49TH~nd#uer4FDj`1fS}*bW7a#9%)QIP)zm|5o|J{|6i&u%?h#zO) zzL@n1jtKPj^7>aj8bayCg6p@)w|^{rd%l3`k*ezTcV+nEg&UO%9~a6NrWU+IB7y@^ z5B}o6@-kGp@M9`+YGKhkBnl0~+v|^ds9aop8`-|N7#tcE5*!%#Z_4n?#l`5GQBmQc z5hOIye^-`YwqL8ROiVlzc{>qJRq(&jf9ULdUG@5Pb#+3=?TFJMet)+AVR&TtO-;qk zgt)l4+mWa7f7X8;?d+sh$H&FS#@>#J__H2HI%}#b5)gT87z+PM`TRv57T57_)XN30 zZ^p+ZzW#gN|LN~rEl732qAsoIG1PA&|MYzeDLp9QXqJ3$8rzy!7GBK z`0-_3h1W?9L~U?@b^VvmeTSC;Z1FXOErG_cHRLcz`J?Zy!N*{SjT;0z9tW$#ArPj* z3}LFs->$I+NLs8wM80>T&RRI5w-#dbHb9&qC&ZaRTaL#oPRd4>ZxYGVS=2 zU>xoU#tB|*%p1S1`W>Wf!`GJ+ahJADAIpH_jJBvqudsKd=jJ*Z35 zhAZKQP;&Y((tXUJBK9CuAbqAH-VE*}nIPZ02~;K?LB4u(Ei!8*ZPz$sb-T*yDqz3nbw70O|&aT@H^z6a(< zlYv*f9t5NtL45CHP}XY!X^mH~_do|I==FfS(_>IH=?5jV0Z=!33hKts;ef?U&~knP zINv95@YGW{;`0pDZQsCthh8wUYX`lcb~ujj24~+MP_-Ncb-ND;{}B$j4KM3FCLSNb z(qjk?`iy`{$S1J(`2Z&a2avyh05npFU~rWPh6MyLFC@aDk|@x-9tZXpqQK!|3^*0V zf^|s@coipt=jCJwDoq8in)7hHIUi2k&j*JmrEv1uHSl|K4cuOogYT=`U_d~6O?V3& zNp1(5geMT1@D};--@@UrF*rt?0O!-ANN*hjpVI^25jhGDsb3&4YY@CrCLlO%0$ekZ zUq5de@W{uWmXHg%m*b(LHWE5(N${#J7b0HQK=i9S@a}#*^tD7oZ%YdD-=BlGEtjDC z`5hQ}oezmw6A*=b_N4rNNWJ(0lJh@9EYfLmZuUcR)i;Qx`s#Zh!ug(NDC|Xk`r&7A zap)Q34YxzZr?-$?Plnr#Ls0c#7%nuC;YJ(MYdYqkqH6)}BE9C$z!Efdy?}v^`^!4b zyS@o{+dBnaBk!SaU<8_`KfpkLKYaR#;^+uWjt#-�X4(okG9QBL8Q9yzy^$#IIK) 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 + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {118E09E5-83B5-4DC6-A3ED-70F0F1BFE66C} + RegisterManager + MFCProj + + + + Application + true + Unicode + Static + + + Application + true + Unicode + Static + + + Application + false + true + Unicode + Dynamic + + + Application + false + true + Unicode + Dynamic + + + + + + + + + + + + + + + + + + + true + + + true + + + false + + + false + + + + Use + Level3 + Disabled + WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions) + + + Windows + true + + + false + true + _DEBUG;%(PreprocessorDefinitions) + + + 0x0804 + _DEBUG;%(PreprocessorDefinitions) + $(IntDir);%(AdditionalIncludeDirectories) + + + + + Use + Level3 + Disabled + WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions) + + + Windows + true + AsInvoker + + + false + _DEBUG;%(PreprocessorDefinitions) + + + 0x0804 + _DEBUG;%(PreprocessorDefinitions) + $(IntDir);%(AdditionalIncludeDirectories) + + + + + Level3 + Use + MaxSpeed + true + true + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + + + Windows + true + true + true + + + false + true + NDEBUG;%(PreprocessorDefinitions) + + + 0x0804 + NDEBUG;%(PreprocessorDefinitions) + $(IntDir);%(AdditionalIncludeDirectories) + + + + + Level3 + Use + MaxSpeed + true + true + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + + + Windows + true + true + true + + + false + NDEBUG;%(PreprocessorDefinitions) + + + 0x0804 + NDEBUG;%(PreprocessorDefinitions) + $(IntDir);%(AdditionalIncludeDirectories) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Create + Create + Create + Create + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Register/RegisterManager/RegisterManager/RegisterManager.vcxproj.filters b/Register/RegisterManager/RegisterManager/RegisterManager.vcxproj.filters new file mode 100644 index 0000000..a57635f --- /dev/null +++ b/Register/RegisterManager/RegisterManager/RegisterManager.vcxproj.filters @@ -0,0 +1,115 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + + 资源文件 + + + 资源文件 + + + 资源文件 + + + 资源文件 + + + 资源文件 + + + 资源文件 + + + 资源文件 + + + 资源文件 + + + 资源文件 + + + 资源文件 + + + 资源文件 + + + 资源文件 + + + + + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + + + 资源文件 + + + \ No newline at end of file diff --git a/Register/RegisterManager/RegisterManager/RegisterManager.vcxproj.user b/Register/RegisterManager/RegisterManager/RegisterManager.vcxproj.user new file mode 100644 index 0000000..ace9a86 --- /dev/null +++ b/Register/RegisterManager/RegisterManager/RegisterManager.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/Register/RegisterManager/RegisterManager/RegisterManagerDlg.cpp b/Register/RegisterManager/RegisterManager/RegisterManagerDlg.cpp new file mode 100644 index 0000000..8154a62 --- /dev/null +++ b/Register/RegisterManager/RegisterManager/RegisterManagerDlg.cpp @@ -0,0 +1,3399 @@ + +// RegisterManagerDlg.cpp : ʵļ +// + +#include "stdafx.h" +#include "RegisterManager.h" +#include "RegisterManagerDlg.h" +#include "afxdialogex.h" +#include "KeyDlg.h" +#include "RegFindDlg.h" +#include "RegModifyDlg.h" +#include "RegHexEditDlg.h" +#ifdef _DEBUG +#define new DEBUG_NEW +#endif + + +// Ӧó򡰹ڡ˵ CAboutDlg Ի +HANDLE g_hDevice = NULL; +CWnd* g_Father = NULL; + +HANDLE +OpenDevice(LPCTSTR lpDevicePath) +{ + HANDLE hDevice = CreateFile(lpDevicePath, + GENERIC_READ | GENERIC_WRITE, + FILE_SHARE_READ | FILE_SHARE_WRITE, + NULL, + OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL, + NULL); + + if (hDevice == INVALID_HANDLE_VALUE) + { + + } + + return hDevice; + +} + +class CAboutDlg : public CDialogEx +{ +public: + CAboutDlg(); + +// Ի + enum { IDD = IDD_ABOUTBOX }; + + protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV ֧ + +// ʵ +protected: + DECLARE_MESSAGE_MAP() +}; + +CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD) +{ +} + +void CAboutDlg::DoDataExchange(CDataExchange* pDX) +{ + CDialogEx::DoDataExchange(pDX); +} + +BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx) +END_MESSAGE_MAP() + + +// CRegisterManagerDlg Ի + + + + +CRegisterManagerDlg::CRegisterManagerDlg(CWnd* pParent /*=NULL*/) + : CDialogEx(CRegisterManagerDlg::IDD, pParent) + , m_strComboText(_T("")) +{ + m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); + + m_wzhKeyCurrentUser = NULL; + m_RegPathList.clear(); + m_bmRefresh.LoadBitmap(IDB_REFRESH); //ͼ + m_bmDelete.LoadBitmap(IDB_DELETE); + m_bmCopy.LoadBitmap(IDB_COPY); + m_bmExport.LoadBitmap(IDB_EXPORT); + m_bmLookfor.LoadBitmap(IDB_LOOKFOR); + + m_FindRegDlg = NULL; +} + +CRegisterManagerDlg::~CRegisterManagerDlg() +{ + if (m_wzhKeyCurrentUser) + { + free(m_wzhKeyCurrentUser); + m_wzhKeyCurrentUser = NULL; + } + + m_RegPathList.clear(); +} + +void CRegisterManagerDlg::DoDataExchange(CDataExchange* pDX) +{ + CDialogEx::DoDataExchange(pDX); + DDX_Control(pDX, IDC_TREE, m_Tree); + DDX_Control(pDX, IDC_LIST, m_List); + DDX_Control(pDX, IDC_COMBO, m_ComboBox); + DDX_CBString(pDX, IDC_COMBO, m_strComboText); +} + +BEGIN_MESSAGE_MAP(CRegisterManagerDlg, CDialogEx) + ON_WM_SYSCOMMAND() + ON_WM_PAINT() + ON_WM_QUERYDRAGICON() + ON_NOTIFY(TVN_ITEMEXPANDING, IDC_TREE, &CRegisterManagerDlg::OnTvnItemexpandingTree) + ON_NOTIFY(TVN_SELCHANGED, IDC_TREE, &CRegisterManagerDlg::OnTvnSelchangedTree) + ON_BN_CLICKED(IDC_GOTO, &CRegisterManagerDlg::OnBnClickedGoto) + ON_CBN_DROPDOWN(IDC_COMBO, &CRegisterManagerDlg::OnCbnDropdownCombo) + ON_COMMAND(ID_REG_REFRESH, &CRegisterManagerDlg::OnRegRefresh) + ON_NOTIFY(NM_RCLICK, IDC_TREE, &CRegisterManagerDlg::OnNMRClickTree) + ON_COMMAND(ID_REG_NEW_KEY, &CRegisterManagerDlg::OnRegNewKey) + ON_COMMAND(ID_STRING_VALUE, &CRegisterManagerDlg::OnStringValue) + ON_COMMAND(ID_BINARY_VALUE, &CRegisterManagerDlg::OnBinaryValue) + ON_COMMAND(ID_DWORD_VALUE, &CRegisterManagerDlg::OnDwordValue) + ON_COMMAND(ID_MUI_STRING_VALUE, &CRegisterManagerDlg::OnMuiStringValue) + ON_COMMAND(ID_EXPAND_STRING_VALUE, &CRegisterManagerDlg::OnExpandStringValue) + ON_COMMAND(ID_REG_DELETE, &CRegisterManagerDlg::OnRegDelete) + ON_COMMAND(ID_REG_RENAME, &CRegisterManagerDlg::OnRegRename) + ON_COMMAND(ID_QWORD_VALUE, &CRegisterManagerDlg::OnQwordValue) + ON_COMMAND(ID_REG_COPY_KEY_NAME, &CRegisterManagerDlg::OnRegCopyKeyName) + ON_COMMAND(ID_REG_COPY_FULL_KEY_NAME, &CRegisterManagerDlg::OnRegCopyFullKeyName) + ON_COMMAND(ID_REG_ADD_TO_QUICK_ADDRESS, &CRegisterManagerDlg::OnRegAddToQuickAddress) + ON_COMMAND(ID_REG_INPORT, &CRegisterManagerDlg::OnRegInport) + ON_COMMAND(ID_REG_EXPORT, &CRegisterManagerDlg::OnRegExport) + ON_COMMAND(ID_REG_LOOK_FOR, &CRegisterManagerDlg::OnRegLookFor) + ON_NOTIFY(NM_RCLICK, IDC_LIST, &CRegisterManagerDlg::OnNMRClickList) + ON_COMMAND(ID_REG_LIST_REFRESH, &CRegisterManagerDlg::OnRegListRefresh) + ON_COMMAND(ID_REG_LIST_MODIFY, &CRegisterManagerDlg::OnRegListModify) + ON_COMMAND(ID_REG_LIST_DELETE, &CRegisterManagerDlg::OnRegListDelete) + ON_COMMAND(ID_REG_LIST_RENAME, &CRegisterManagerDlg::OnRegListRename) + ON_COMMAND(ID_REG_LIST_COPY_VALUE, &CRegisterManagerDlg::OnRegListCopyValue) + ON_COMMAND(ID_REG_LIST_COPY_VALUE_DATA, &CRegisterManagerDlg::OnRegListCopyValueData) +END_MESSAGE_MAP() + + +// CRegisterManagerDlg Ϣ + +BOOL CRegisterManagerDlg::OnInitDialog() +{ + CDialogEx::OnInitDialog(); + + // ...˵ӵϵͳ˵С + + // IDM_ABOUTBOX ϵͳΧڡ + ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); + ASSERT(IDM_ABOUTBOX < 0xF000); + + CMenu* pSysMenu = GetSystemMenu(FALSE); + if (pSysMenu != NULL) + { + BOOL bNameValid; + CString strAboutMenu; + bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX); + ASSERT(bNameValid); + if (!strAboutMenu.IsEmpty()) + { + pSysMenu->AppendMenu(MF_SEPARATOR); + pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); + } + } + + // ô˶ԻͼꡣӦóڲǶԻʱܽԶ + // ִд˲ + SetIcon(m_hIcon, TRUE); // ôͼ + SetIcon(m_hIcon, FALSE); // Сͼ + + // TODO: ڴӶijʼ + + + + g_Father = this; + + + InitControlTree(); //ʼؼ + + + //ʼListؼ + HICON hIcon[10]; + hIcon[0] = AfxGetApp()->LoadIcon (IDI_REG_SZ); + hIcon[1] = AfxGetApp()->LoadIcon (IDI_DWORD); + m_ImageList.Create(16, 16, ILC_COLOR16 | ILC_MASK, 2, 2); + for(int n = 0; n < 2; n++) + { + m_ImageList.Add(hIcon[n]); + m_List.SetImageList(&m_ImageList, LVSIL_SMALL); + } + + m_List.SetExtendedStyle(LVS_EX_FULLROWSELECT); + m_List.InsertColumn(0, L"", LVCFMT_LEFT, 200); + m_List.InsertColumn(1, L"", LVCFMT_LEFT, 130); + m_List.InsertColumn(2, L"", LVCFMT_LEFT, 590); + + InitRegistry(); + InitRegPathList(); //Combo ϵĿٶλ + return TRUE; // ǽõؼ򷵻 TRUE +} + +void CRegisterManagerDlg::OnSysCommand(UINT nID, LPARAM lParam) +{ + if ((nID & 0xFFF0) == IDM_ABOUTBOX) + { + CAboutDlg dlgAbout; + dlgAbout.DoModal(); + } + else + { + CDialogEx::OnSysCommand(nID, lParam); + } +} + +// ԻСťҪĴ +// Ƹͼꡣʹĵ/ͼģ͵ MFC Ӧó +// ⽫ɿԶɡ + +void CRegisterManagerDlg::OnPaint() +{ + if (IsIconic()) + { + CPaintDC dc(this); // ڻƵ豸 + + SendMessage(WM_ICONERASEBKGND, reinterpret_cast(dc.GetSafeHdc()), 0); + + // ʹͼڹо + int cxIcon = GetSystemMetrics(SM_CXICON); + int cyIcon = GetSystemMetrics(SM_CYICON); + CRect rect; + GetClientRect(&rect); + int x = (rect.Width() - cxIcon + 1) / 2; + int y = (rect.Height() - cyIcon + 1) / 2; + + // ͼ + dc.DrawIcon(x, y, m_hIcon); + } + else + { + CDialogEx::OnPaint(); + } +} + +//û϶Сʱϵͳô˺ȡù +//ʾ +HCURSOR CRegisterManagerDlg::OnQueryDragIcon() +{ + return static_cast(m_hIcon); +} + + + + +BOOL CRegisterManagerDlg::InitControlTree() +{ + + //IconԴ + int iCount = 3; + HICON hIcon[4]; + hIcon[0] = AfxGetApp()->LoadIcon (IDI_COMPUTER); + hIcon[1] = AfxGetApp()->LoadIcon (IDI_CLOSE_DIRECTORY); + hIcon[2] = AfxGetApp()->LoadIcon (IDI_OPEN_DIRECTORY); + + + //ͼƬ + m_TreeImageList.Create(16, 16, ILC_COLOR16 | ILC_MASK, 2, 2); + for(int n = 0; n < iCount; n++) + { + m_TreeImageList.Add(hIcon[n]); + m_Tree.SetImageList(&m_TreeImageList, LVSIL_NORMAL); + } + + DWORD dwStyle = GetWindowLong(m_Tree.m_hWnd, GWL_STYLE); + dwStyle |= TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT; + ::SetWindowLong (m_Tree.m_hWnd, GWL_STYLE, dwStyle); + + HTREEITEM Computer = m_Tree.InsertItem(L"ҵĵ", 0, 0); + HTREEITEM hTreeItem0 = m_Tree.InsertItem(L"HKEY_CLASSES_ROOT", 1, 2, Computer, TVI_LAST); + HTREEITEM hTreeItem1 = m_Tree.InsertItem(L"HKEY_CURRENT_USER", 1, 2, Computer, TVI_LAST); + HTREEITEM hTreeItem2 = m_Tree.InsertItem(L"HKEY_LOCAL_MACHINE", 1, 2, Computer, TVI_LAST); + HTREEITEM hTreeItem3 = m_Tree.InsertItem(L"HKEY_USERS", 1, 2, Computer, TVI_LAST); + HTREEITEM hTreeItem4 = m_Tree.InsertItem(L"HKEY_CURRENT_CONFIG", 1, 2, Computer, TVI_LAST); + + m_Tree.Expand(Computer, TVE_EXPAND); + + return TRUE; +} + + +VOID CRegisterManagerDlg::InitRegistry() +{ + + + m_List.DeleteAllItems(); + m_strComboText = L""; + UpdateData( FALSE ); + + HTREEITEM hRootItem = m_Tree.GetRootItem(); + + if (hRootItem != NULL) + { + HTREEITEM hChild = m_Tree.GetChildItem(hRootItem); + while(hChild != NULL) + { + m_Tree.Expand(hChild, TVE_COLLAPSE); + + CString strKey = m_Tree.GetItemText(hChild); + + if (!strKey.CompareNoCase(L"HKEY_CLASSES_ROOT")) + { + EnumSubKeys(CLASSES_ROOT, hChild, TRUE); + } + else if (!strKey.CompareNoCase(L"HKEY_CURRENT_USER")) + { + EnumCurrentUserSubKeys(hChild); //Ƚ + } + else if (!strKey.CompareNoCase(L"HKEY_LOCAL_MACHINE")) + { + EnumSubKeys(LOCAL_MACHINE, hChild); + } + else if (!strKey.CompareNoCase(L"HKEY_USERS")) + { + EnumSubKeys(USERS, hChild); + } + else if (!strKey.CompareNoCase(L"HKEY_CURRENT_CONFIG")) + { + EnumSubKeys(CURRENT_CONFIGL, hChild, TRUE); + } + else + { + break; + } + + hChild = m_Tree.GetNextSiblingItem(hChild); + } + } + + m_Tree.Invalidate(TRUE); +} + + + +VOID CRegisterManagerDlg::EnumSubKeys(CString strKey, HTREEITEM hItem, BOOL bSubSubKey/* = FALSE */) +{ + if ( !strKey.IsEmpty() && hItem != NULL ) + { + DeleteSubTree(hItem); //οЧ + + UNICODE_STRING uniKey; + + if (InitUnicodeString(&uniKey, strKey.GetBuffer())) + { + HANDLE hKey; + OBJECT_ATTRIBUTES oa; + + InitializeObjectAttributes(&oa, &uniKey, OBJ_CASE_INSENSITIVE, 0, NULL); + + if (OpenKey(&hKey,KEY_ALL_ACCESS, &oa)) + { + /* WCHAR wzBuffer[256] = {0}; + wsprintf(wzBuffer,L"0x%p",hKey); + ::MessageBox(NULL,wzBuffer,L"Data",MB_OK);*/ + + for (ULONG i = 0;;i++) + { + ULONG nRetLen = 0; + BOOL bRet = EnumerateKey(hKey,i,KeyBasicInformation,NULL,0,&nRetLen); + + if (!bRet && GetLastError() == ERROR_NO_MORE_ITEMS) + { + break; + } + else if (!bRet && GetLastError() == ERROR_INSUFFICIENT_BUFFER) // STATUS_BUFFER_TOO_SMALL + { + + + //MessageBox(L"1",L"1"); + PKEY_BASIC_INFORMATION Buffer = (PKEY_BASIC_INFORMATION)malloc(nRetLen + 0x100); + if (Buffer) + { + memset(Buffer, 0, nRetLen + 0x100); + bRet = EnumerateKey(hKey, i, KeyBasicInformation,Buffer, nRetLen + 0x100, &nRetLen); + + if (bRet) + { + m_Tree.InsertItem(Buffer->Name, 1, 2, hItem, TVI_LAST); + } + + free(Buffer); + + // öôֻҪһͿˣ + // ΪǰѾһ+ˣҪΪٶŻ + if (bRet && bSubSubKey) + { + break; + } + } + } + } + + CloseHandle(hKey); + } + + FreeUnicodeString(&uniKey); + } + } +} + + +VOID CRegisterManagerDlg::DeleteSubTree(HTREEITEM hTreeItem) +{ + if(hTreeItem == NULL) + { + return; + } + + if(m_Tree.ItemHasChildren(hTreeItem)) + { + HTREEITEM hNext, hChild = m_Tree.GetChildItem(hTreeItem); + while(hChild != NULL) + { + hNext = m_Tree.GetNextSiblingItem(hChild); + m_Tree.DeleteItem(hChild); + hChild = hNext; + } + } +} + + + +BOOL CRegisterManagerDlg::InitUnicodeString(PUNICODE_STRING uniString, WCHAR *wzString) +{ + BOOL bRet = FALSE; + if (!wzString) + { + uniString->Buffer = NULL; + uniString->Length = 0; + uniString->MaximumLength = 2; + bRet = TRUE; + } + else + { + ULONG nLen = wcslen(wzString); + if (uniString && nLen > 0) + { + PWCHAR Buffer = (PWCHAR)malloc((nLen + 1) * sizeof(WCHAR)); + if (Buffer) + { + memset(Buffer, 0, (nLen + 1) * sizeof(WCHAR)); + wcscpy_s(Buffer, nLen + 1, wzString); + uniString->Buffer = Buffer; + uniString->Length = (USHORT)(nLen * sizeof(WCHAR)); + uniString->MaximumLength = (USHORT)((nLen + 1) * sizeof(WCHAR)); + bRet = TRUE; + } + } + } + + return bRet; +} +VOID CRegisterManagerDlg::FreeUnicodeString(UNICODE_STRING *uniString) +{ + if (uniString && uniString->Buffer && uniString->Length > 0) + { + uniString->Length = 0; + uniString->MaximumLength = 0; + free(uniString->Buffer); + uniString->Buffer = NULL; + } +} + +BOOL CRegisterManagerDlg::OpenKey(OUT PHANDLE KeyHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes + ) +{ + + DWORD dwReturnSize = 0; + DWORD dwRet = 0; + + struct{ + ACCESS_MASK DesiredAccess; + POBJECT_ATTRIBUTES ObjectAttributes; + }Open; + + + + memset(&Open, 0, sizeof(Open)); + + g_hDevice = OpenDevice(L"\\\\.\\RegisterManagerLink"); + + + if (g_hDevice==(HANDLE)-1) + { + return FALSE; + } + + Open.DesiredAccess = DesiredAccess; + Open.ObjectAttributes = ObjectAttributes; + + + dwRet = DeviceIoControl(g_hDevice,CTL_OPEN_KEY, + &Open, + sizeof(Open), + KeyHandle, + sizeof(KeyHandle), + &dwReturnSize, + NULL); + + + if (dwRet==0) + { + + CloseHandle(g_hDevice); + return FALSE; + } + + CloseHandle(g_hDevice); + + return TRUE; +} + + + +BOOL CRegisterManagerDlg::EnumerateKey(IN HANDLE KeyHandle, + IN ULONG ulIndex, + IN ULONG ulKeyInformationClass, + OUT PVOID KeyInformation, + IN ULONG ulLength, + OUT PULONG ResultLength + ) +{ + + DWORD dwReturnSize = 0; + DWORD dwRet = 0; + + struct{ + HANDLE hKey; + ULONG Index; + ULONG InformationClass; + ULONG Length; + }Enum; + + + memset(&Enum, 0, sizeof(Enum)); + + g_hDevice = OpenDevice(L"\\\\.\\RegisterManagerLink"); + + + if (g_hDevice==(HANDLE)-1) + { + return FALSE; + } + + + Enum.hKey = KeyHandle; + Enum.Index = ulIndex; + Enum.InformationClass = ulKeyInformationClass; + Enum.Length = ulLength; + + + typedef struct _ENUM_VALUE_ + { + PULONG RetLength; + PVOID ValueInfor; + }ENUM_VALUE, *PENUM_VALUE; + + + ENUM_VALUE EnumValue; + memset(&EnumValue, 0, sizeof(ENUM_VALUE)); + EnumValue.RetLength = ResultLength; + EnumValue.ValueInfor = KeyInformation; + + dwRet = DeviceIoControl(g_hDevice,CTL_ENUM_KEY, + &Enum, + sizeof(Enum), + &EnumValue, + sizeof(ENUM_VALUE), + &dwReturnSize, + NULL); + + + if (dwRet==0) + { + + CloseHandle(g_hDevice); + return FALSE; + } + + CloseHandle(g_hDevice); + + return TRUE; +} + + +void CRegisterManagerDlg::EnumCurrentUserSubKeys(HTREEITEM hChild) +{ + DeleteSubTree(hChild); + + if (!m_wzhKeyCurrentUser) + { + m_wzhKeyCurrentUser = (WCHAR*)malloc(1024 * sizeof(WCHAR)); + if (m_wzhKeyCurrentUser) + { + memset(m_wzhKeyCurrentUser, 0, 1024 * sizeof(WCHAR)); + + if (!GetCurrentUserKeyPath(m_wzhKeyCurrentUser)) + { + wcscpy_s(m_wzhKeyCurrentUser, 1024, L"\\Registry\\User\\.Default"); + } + } + } + + if (m_wzhKeyCurrentUser && wcslen(m_wzhKeyCurrentUser) > 0) + { + EnumSubKeys(m_wzhKeyCurrentUser, hChild, TRUE); + } +} + + + +BOOL CRegisterManagerDlg::GetCurrentUserKeyPath(OUT WCHAR *wzCurrentUserPath) +{ + if (!wzCurrentUserPath) + { + return FALSE; + } + + HANDLE hToken; + UCHAR szBuffer[256] = {0}; + PSID_AND_ATTRIBUTES SidBuffer; + ULONG Length; + BOOL Status = FALSE; + + Status = OpenThreadToken(GetCurrentThread(), + TOKEN_QUERY, + TRUE, + &hToken); + + if (!Status) + { + Status = OpenProcessToken(GetCurrentProcess(), + TOKEN_QUERY, + &hToken); + + if (!Status) + { + return Status; + } + } + + SidBuffer = (PSID_AND_ATTRIBUTES)szBuffer; + Status = GetTokenInformation(hToken, + TokenUser, + (PVOID)SidBuffer, + sizeof(szBuffer), + &Length); + + CloseHandle(hToken); + if (!Status) + { + return Status; + } + + LPTSTR StringSid; + Status = ConvertSidToStringSid(SidBuffer[0].Sid, &StringSid); + if (!Status) return Status; + + WCHAR wzUser[] = L"\\Registry\\User\\"; + + Length = wcslen(StringSid) * sizeof(WCHAR) + sizeof(wzUser); + + WCHAR *wzPath = (WCHAR *)malloc(Length); + if (!wzPath) + { + LocalFree((HLOCAL)StringSid); + return FALSE; + } + + memset(wzPath, 0, Length); + wcscpy_s(wzPath, Length / sizeof(WCHAR),wzUser); + wcscat_s(wzPath, Length / sizeof(WCHAR), StringSid); + + LocalFree((HLOCAL)StringSid); + + wcscpy_s(wzCurrentUserPath, 1024, wzPath); + free(wzPath); + + return TRUE; +} + +void CRegisterManagerDlg::OnTvnItemexpandingTree(NMHDR *pNMHDR, LRESULT *pResult) +{ + LPNMTREEVIEW pNMTreeView = reinterpret_cast(pNMHDR); + // TODO: ڴӿؼ֪ͨ + HTREEITEM hItem = pNMTreeView->itemNew.hItem; + BOOL nRet = FALSE; + if (!nRet) + { + // ۵״̬ʱŲӽڵ + if(!(TVIS_EXPANDED & m_Tree.GetItemState(hItem, TVIS_EXPANDED)) && + m_Tree.GetRootItem() != hItem && + hItem != NULL) + { + DeleteSubTree(hItem); + + HTREEITEM hItemTemp = hItem; + CString strKeyPath, strKeyPathTemp; + while (1) + { + CString strText = m_Tree.GetItemText(hItemTemp); + + if (!strText.CompareNoCase(L"HKEY_CLASSES_ROOT")) + { + strKeyPath = CLASSES_ROOT; + break; + } + else if (!strText.CompareNoCase(L"HKEY_CURRENT_USER")) + { + strKeyPath = m_wzhKeyCurrentUser; + break; + } + else if (!strText.CompareNoCase(L"HKEY_LOCAL_MACHINE")) + { + strKeyPath = LOCAL_MACHINE; + break; + } + else if (!strText.CompareNoCase(L"HKEY_USERS")) + { + strKeyPath = USERS; + break; + } + else if (!strText.CompareNoCase(L"HKEY_CURRENT_CONFIG")) + { + strKeyPath = CURRENT_CONFIGL; + break; + } + else + { + strKeyPathTemp = strText + L"\\" + strKeyPathTemp; + } + + hItemTemp = m_Tree.GetParentItem(hItemTemp); + } + + strKeyPath = strKeyPath + L"\\" + strKeyPathTemp; + EnumSubKeys(strKeyPath, hItem); + EnumSubSubKeys(strKeyPath, hItem); + } + } + + + *pResult = 0; +} + + +void CRegisterManagerDlg::EnumSubSubKeys(CString strKey, HTREEITEM hItem) +{ + if (!strKey.IsEmpty() && hItem != NULL) + { + HTREEITEM hChild = m_Tree.GetChildItem(hItem); + while(hChild != NULL) + { + CString strKeyPath = strKey + L"\\" + m_Tree.GetItemText(hChild); + EnumSubKeys(strKeyPath, hChild, TRUE); // bSubSubKey Ϊtrue,Żöٶ + hChild = m_Tree.GetNextSiblingItem(hChild); + } + } +} + + +void CRegisterManagerDlg::OnTvnSelchangedTree(NMHDR *pNMHDR, LRESULT *pResult) +{ + LPNMTREEVIEW pNMTreeView = reinterpret_cast(pNMHDR); + + + + HTREEITEM hItem = pNMTreeView->itemNew.hItem; + CString strKeyShowPath; + + if(m_Tree.GetRootItem() != hItem && + hItem != NULL) + { + BOOL nRet = FALSE; + if (!nRet) + { + HTREEITEM hItemTemp = hItem; + CString strKeyPath, strKeyPathTemp; + while (1) + { + CString strText = m_Tree.GetItemText(hItemTemp); + + if (!strText.CompareNoCase(L"HKEY_CLASSES_ROOT")) + { + strKeyPath = CLASSES_ROOT; + strKeyShowPath = L"HKEY_CLASSES_ROOT"; + break; + } + else if (!strText.CompareNoCase(L"HKEY_CURRENT_USER")) + { + strText = m_wzhKeyCurrentUser; + strKeyShowPath = L"HKEY_CURRENT_USER"; + break; + } + else if (!strText.CompareNoCase(L"HKEY_LOCAL_MACHINE")) + { + strKeyPath = LOCAL_MACHINE; + strKeyShowPath = L"HKEY_LOCAL_MACHINE"; + break; + } + else if (!strText.CompareNoCase(L"HKEY_USERS")) + { + strKeyPath = USERS; + strKeyShowPath = L"HKEY_USERS"; + break; + } + else if (!strText.CompareNoCase(L"HKEY_CURRENT_CONFIG")) + { + strKeyPath = CURRENT_CONFIGL; + strKeyShowPath = L"HKEY_CURRENT_CONFIG"; + break; + } + else + { + strKeyPathTemp = strText + L"\\" + strKeyPathTemp; + } + + hItemTemp = m_Tree.GetParentItem(hItemTemp); + } + + strKeyPath = strKeyPath + L"\\" + strKeyPathTemp; + strKeyShowPath = strKeyShowPath + L"\\" + strKeyPathTemp; + EnumValues(strKeyPath); //List ؼʾ + } + } + + strKeyShowPath.TrimRight('\\'); + m_strComboText = strKeyShowPath; + UpdateData(FALSE); + + *pResult = 0; +} + + + +void CRegisterManagerDlg::EnumValues(CString strKey) +{ + if (strKey.IsEmpty()) + { + return; + } + + UNICODE_STRING uniKey; + + if (InitUnicodeString(&uniKey, strKey.GetBuffer())) + { + HANDLE hKey; + OBJECT_ATTRIBUTES oa; + + InitializeObjectAttributes(&oa, &uniKey, OBJ_CASE_INSENSITIVE, 0, NULL); + if (OpenKey(&hKey, KEY_ALL_ACCESS, &oa)) + { + m_List.DeleteAllItems(); + BOOL bDefault = FALSE; + + for (ULONG i = 0; ; i++) + { + ULONG nRetLen = 0; + BOOL bRet = EnumerateValueKey(hKey,i,KeyValueFullInformation,NULL,0,&nRetLen); + if (!bRet && GetLastError() == ERROR_NO_MORE_ITEMS) + { + //û + break; + } + else if (!bRet && GetLastError() == ERROR_INSUFFICIENT_BUFFER) + { + PKEY_VALUE_FULL_INFORMATION Buffer = (PKEY_VALUE_FULL_INFORMATION)malloc(nRetLen + 0x100); + if (Buffer) + { + memset(Buffer, 0, nRetLen + 0x100); + bRet = EnumerateValueKey(hKey, i, KeyValueFullInformation, Buffer, nRetLen + 0x100, &nRetLen); + + if (bRet) + { + CString strName, strType, strData; + WCHAR wzTempName[1024] = {0}; + + strType = GetKeyType(Buffer->Type); + strData = GetKeyData(Buffer->Type, (WCHAR*)((PBYTE)Buffer + Buffer->DataOffset), Buffer->DataLength); + + // NameLengthΪ0 + if (Buffer->NameLength == 0) + { + strName = L"Ĭ"; + bDefault = TRUE; + } + else + { + wcsncpy_s(wzTempName, 1024, Buffer->Name, Buffer->NameLength / sizeof(WCHAR)); + strName = wzTempName; + } + + int nImage = 1; + if (Buffer->Type == REG_SZ || + Buffer->Type == REG_EXPAND_SZ || + Buffer->Type == REG_MULTI_SZ) + { + nImage = 0; + } + + int n = m_List.InsertItem(m_List.GetItemCount(),strName, nImage); + + if (strType == L"REG_QWORD") + { + Sleep(1); + } + m_List.SetItemText(n, 1, strType); + m_List.SetItemText(n, 2, strData); + + if (Buffer->NameLength == 0) + { + m_List.SetItemData(n, 1); + } + } + + free(Buffer); + } + } + } + + // һĬϵļΪ + if (!bDefault) + { + int n = m_List.InsertItem(0,L"Ĭ", 0); + m_List.SetItemText(n, 1, L"REG_SZ"); + m_List.SetItemText(n, 2, L"ֵδ"); + + m_List.SetItemData(n, 1); + } + + CloseHandle(hKey); + } + + + FreeUnicodeString(&uniKey); + } +} + + +BOOL CRegisterManagerDlg::EnumerateValueKey(IN HANDLE KeyHandle, + IN ULONG ulIndex, + IN ULONG ulKeyValueInformationClass, + OUT PVOID KeyValueInformation, + IN ULONG ulLength, + OUT PULONG ulResultLength + ) +{ + + DWORD dwReturnSize = 0; + DWORD dwRet = 0; + + struct{ + HANDLE hKey; + ULONG Index; + ULONG InformationClass; + ULONG Length; + }Enum; + + + memset(&Enum, 0, sizeof(Enum)); + + g_hDevice = OpenDevice(L"\\\\.\\RegisterManagerLink"); + + + if (g_hDevice==(HANDLE)-1) + { + return FALSE; + } + + + Enum.hKey = KeyHandle; + Enum.Index = ulIndex; + Enum.InformationClass = ulKeyValueInformationClass; + Enum.Length = ulLength; + + typedef struct _ENUM_VALUE_ + { + PULONG RetLength; + PVOID ValueInfor; + }ENUM_VALUE, *PENUM_VALUE; + + + ENUM_VALUE EnumValue; + memset(&EnumValue, 0, sizeof(ENUM_VALUE)); + EnumValue.RetLength = ulResultLength; + EnumValue.ValueInfor = KeyValueInformation; + + dwRet = DeviceIoControl(g_hDevice,CTL_ENUM_KEY_VALUE, + &Enum, + sizeof(Enum), + &EnumValue, + sizeof(ENUM_VALUE), + &dwReturnSize, + NULL); + + + if (dwRet==0) + { + + CloseHandle(g_hDevice); + return FALSE; + } + + CloseHandle(g_hDevice); + + return TRUE; + +} + + + + +CString CRegisterManagerDlg::GetKeyType(ULONG ulType) +{ + CString strRet; + + switch (ulType) + { + case REG_NONE: + strRet = L"REG_NONE"; + break; + + case REG_SZ: + strRet = L"REG_SZ"; + break; + + case REG_EXPAND_SZ: + strRet = L"REG_EXPAND_SZ"; + break; + + case REG_BINARY: + strRet = L"REG_BINARY"; + break; + + case REG_DWORD: + strRet = L"REG_DWORD"; + break; + + case REG_DWORD_BIG_ENDIAN: + strRet = L"REG_DWORD_BIG_ENDIAN"; + break; + + case REG_LINK: + strRet = L"REG_LINK"; + break; + + case REG_MULTI_SZ: + strRet = L"REG_MULTI_SZ"; + break; + + case REG_RESOURCE_LIST: + strRet = L"REG_RESOURCE_LIST"; + break; + + case REG_FULL_RESOURCE_DESCRIPTOR: + strRet = L"REG_FULL_RESOURCE_DESCRIPTOR"; + break; + + case REG_RESOURCE_REQUIREMENTS_LIST: + strRet = L"REG_RESOURCE_REQUIREMENTS_LIST"; + break; + + case REG_QWORD: + strRet = L"REG_QWORD"; + break; + + default: + strRet = L"Unknow"; + } + + return strRet; +} + +CString CRegisterManagerDlg::GetKeyData(ULONG ulType, WCHAR* wzData, ULONG ulDataLength) +{ + CString strRet; + + if (!ulDataLength) + { + return strRet; + } + + switch (ulType) + { + case REG_SZ: + case REG_EXPAND_SZ: + strRet = wzData; + break; + + case REG_LINK: + case REG_NONE: + case REG_RESOURCE_REQUIREMENTS_LIST: + case REG_FULL_RESOURCE_DESCRIPTOR: + case REG_RESOURCE_LIST: + case REG_BINARY: + { + for (ULONG i = 0; i RegPathList; + GetAllRegPath(RegPathList); + m_nComboBoxCnt = 0; + + for (list ::iterator ir = RegPathList.begin(); + ir != RegPathList.end(); + ir++) + { + m_ComboBox.InsertString(m_nComboBoxCnt, *ir); + m_nComboBoxCnt++; + } +} + + + +void CRegisterManagerDlg::GetAllRegPath(std::list &RegPathList) +{ + RegPathList.clear(); + + for (std::list ::iterator itor = m_RegPathList.begin(); + itor != m_RegPathList.end(); + itor++) + { + RegPathList.push_back(*itor); + } +} + + +void CRegisterManagerDlg::InitRegPathList() +{ + m_RegPathList.push_back(L"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run"); + m_RegPathList.push_back(L"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Windows"); + m_RegPathList.push_back(L"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\ShellExecuteHooks"); + m_RegPathList.push_back(L"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Shell Extensions\\Approved"); + m_RegPathList.push_back(L"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\ShellServiceObjectDelayLoad"); + m_RegPathList.push_back(L"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon"); + m_RegPathList.push_back(L"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Internet Explorer"); + m_RegPathList.push_back(L"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\IniFileMapping"); + m_RegPathList.push_back(L"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options"); + m_RegPathList.push_back(L"HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Session Manager"); + m_RegPathList.push_back(L"HKEY_LOCAL_MACHINE\\SOFTWARE\\Policies\\Microsoft\\Windows\\IPSec\\Policy\\Local"); + m_RegPathList.push_back(L"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Desktop\\NameSpace"); +} + +void CRegisterManagerDlg::OnBnClickedGoto() +{ + UpdateData(TRUE); + m_ComboBox.ResetContent(); + m_ComboBox.SetWindowText(m_strComboText); + + + if (m_strComboText.IsEmpty()) + { + return; + } + + + CString strKeyPath = ComboString2KeyPath(); + if (strKeyPath.IsEmpty()) + { + return; + } + + CString strHead = m_strComboText.Left(m_strComboText.Find(L"\\")); + if (strHead.IsEmpty()) + { + strHead = m_strComboText; + } + + if (strHead.IsEmpty()) + { + return; + } + + HTREEITEM hRootItem = m_Tree.GetRootItem(); + if (hRootItem == NULL) + { + + return; + } + + HTREEITEM hChild = m_Tree.GetChildItem(hRootItem); + CString strRoot; + + WCHAR wzhKeyRoot[] = L"HKEY_CLASSES_ROOT"; + WCHAR wzhKCR[] = L"HKCR"; + + WCHAR wzhKeyCurrentUser[] = L"HKEY_CURRENT_USER"; + WCHAR wzhKCU[] = L"HKCU"; + + WCHAR wzhKeyLocalMachine[] = L"HKEY_LOCAL_MACHINE"; + WCHAR wzhKLM[] = L"HKLM"; + + WCHAR wzhKeyUsers[] = L"HKEY_USERS"; + WCHAR wzhKU[] = L"HKU";; + + WCHAR wzhKeyCurrentConfig[] = L"HKEY_CURRENT_CONFIG"; + WCHAR wzhKCC[] = L"HKCC";; + + while(hChild != NULL) + { + CString strKey = m_Tree.GetItemText(hChild); + + if ((!strHead.CompareNoCase(wzhKeyRoot) || !strHead.CompareNoCase(wzhKCR)) && + !strKey.CompareNoCase(wzhKeyRoot)) + { + strRoot = CLASSES_ROOT; + break; + } + else if ((!strHead.CompareNoCase(wzhKeyCurrentUser) || !strHead.CompareNoCase(wzhKCU)) && + !strKey.CompareNoCase(wzhKeyCurrentUser)) + { + strRoot = m_wzhKeyCurrentUser; + break; + } + else if ((!strHead.CompareNoCase(wzhKeyLocalMachine) || !strHead.CompareNoCase(wzhKLM)) && + !strKey.CompareNoCase(wzhKeyLocalMachine)) + { + strRoot = LOCAL_MACHINE; + break; + } + else if ((!strHead.CompareNoCase(wzhKeyUsers) || !strHead.CompareNoCase(wzhKU)) && + !strKey.CompareNoCase(wzhKeyUsers)) + { + strRoot = USERS; + break; + } + else if ((!strHead.CompareNoCase(wzhKeyCurrentConfig) || !strHead.CompareNoCase(wzhKCC)) && + !strKey.CompareNoCase(wzhKeyCurrentConfig)) + { + strRoot = CURRENT_CONFIGL; + break; + } + + hChild = m_Tree.GetNextSiblingItem(hChild); + } + + if (hChild == NULL || strRoot.IsEmpty()) + { + return; + } + + // չθHKEY_LOCAL_MACHINEHKEY_USERS + m_Tree.Expand(hChild, TVE_COLLAPSE); + EnumSubKeys(strRoot, hChild); + m_Tree.Expand(hChild, TVE_EXPAND); + + if (m_strComboText.Find(L"\\") != -1) + { + CString strKeyEnd = strKeyPath.GetBuffer() + strRoot.GetLength(); + strKeyPath.ReleaseBuffer(); + + if (strKeyEnd.IsEmpty()) + { + + return; + } + + strKeyEnd.TrimLeft('\\'); + + if (strKeyEnd.IsEmpty()) + { + + return; + } + + CString strTemp; + BOOL bQuiet = FALSE; + + do + { + strTemp = strKeyEnd.Left(strKeyEnd.Find('\\')); + + if (strTemp.IsEmpty()) + { + strTemp = strKeyEnd; + bQuiet = TRUE; + } + + hChild = GetTreeSubItemByName(hChild, strTemp); + if (hChild == NULL) + { + CString strMsgBox; + + strMsgBox = L""; + strMsgBox += L" \'" + m_strComboText + L"\'"; + MessageBox(strMsgBox, L"Registry", MB_OK | MB_ICONINFORMATION); + break; + } + + strRoot += L"\\" + strTemp; + + if (bQuiet) + { + EnumValues(strRoot); + m_Tree.Expand(hChild, TVE_EXPAND); + m_Tree.Select(hChild, TVGN_FIRSTVISIBLE); + m_Tree.SelectItem(hChild); + m_Tree.SetItemState(hChild, TVIS_DROPHILITED | TVIS_BOLD, TVIS_DROPHILITED | TVIS_BOLD); + //m_hChild = hChild; + } + else + { + EnumSubKeys(strRoot, hChild); + m_Tree.Expand(hChild, TVE_EXPAND); + } + + strKeyEnd = strKeyEnd.Right(strKeyEnd.GetLength() - strKeyEnd.Find('\\') - 1); + + } while (!bQuiet); + } +} + + + + +CString CRegisterManagerDlg::ComboString2KeyPath() +{ + CString strHead = m_strComboText.Left(m_strComboText.Find('\\')); + CString strRight = m_strComboText.Right(m_strComboText.GetLength() - m_strComboText.Find('\\')); + CString strKeyPath; + + if (strHead.IsEmpty()) + { + strHead = strRight; + strRight.Empty(); + } + + WCHAR wzhKeyRoot[] = L"HKEY_CLASSES_ROOT"; + WCHAR wzhKCR[] = L"HKCR"; + + WCHAR wzhKeyCurrentUser[] = L"HKEY_CURRENT_USER"; + WCHAR wzhKCU[] = L"HKCU"; + + WCHAR wzhKeyLocalMachine[] = L"HKEY_LOCAL_MACHINE"; + WCHAR wzhKLM[] = L"HKLM"; + + WCHAR wzhKeyUsers[] = L"HKEY_USERS"; + WCHAR wzhKU[] = L"HKU";; + + WCHAR wzhKeyCurrentConfig[] = L"HKEY_CURRENT_CONFIG"; + WCHAR wzhKCC[] = L"HKCC";; + + if (!strHead.CompareNoCase(wzhKeyRoot) || !strHead.CompareNoCase(wzhKCR)) + { + strKeyPath = CLASSES_ROOT; + } + else if (!strHead.CompareNoCase(wzhKeyCurrentUser) || !strHead.CompareNoCase(wzhKCU)) + { + strKeyPath = m_wzhKeyCurrentUser; + } + else if (!strHead.CompareNoCase(wzhKeyLocalMachine) || !strHead.CompareNoCase(wzhKLM)) + { + strKeyPath = LOCAL_MACHINE; + } + else if (!strHead.CompareNoCase(wzhKeyUsers) || !strHead.CompareNoCase(wzhKU)) + { + strKeyPath = USERS; + } + else if (!strHead.CompareNoCase(wzhKeyCurrentConfig) || !strHead.CompareNoCase(wzhKCC)) + { + strKeyPath = CURRENT_CONFIGL; + } + + strKeyPath += strRight; + strKeyPath.TrimRight('\\'); + + return strKeyPath; +} + + + +HTREEITEM CRegisterManagerDlg::GetTreeSubItemByName(HTREEITEM hPatentItem, CString strName) +{ + HTREEITEM hChild = m_Tree.GetChildItem(hPatentItem); + HTREEITEM hRetItem = NULL; + + while(hChild != NULL) + { + CString strKey = m_Tree.GetItemText(hChild); + + if (!strKey.CompareNoCase(strName)) + { + hRetItem = hChild; + break; + } + else if (!strKey.CompareNoCase(strName)) + { + hRetItem = hChild; + break; + } + else if (!strKey.CompareNoCase(strName)) + { + hRetItem = hChild; + break; + } + else if (!strKey.CompareNoCase(strName)) + { + hRetItem = hChild; + break; + } + else if (!strKey.CompareNoCase(strName)) + { + hRetItem = hChild; + break; + } + + hChild = m_Tree.GetNextSiblingItem(hChild); + } + + return hRetItem; +} + + +BOOL CRegisterManagerDlg::PreTranslateMessage(MSG* pMsg) +{ + if(pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_ESCAPE) return TRUE; + + if(pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN) + { + OnBnClickedGoto(); + return TRUE; + } + + + return CDialogEx::PreTranslateMessage(pMsg); +} + + + +void CRegisterManagerDlg::OnNMRClickTree(NMHDR *pNMHDR, LRESULT *pResult) +{ + + CPoint Point; + + GetCursorPos(&Point); + m_Tree.ScreenToClient(&Point); + + m_RightClickTreeItem = m_Tree.HitTest(Point, NULL); + CString strItemText; + + if ( m_RightClickTreeItem != NULL ) + { + strItemText = m_Tree.GetItemText(m_RightClickTreeItem); + m_Tree.SelectItem(m_RightClickTreeItem); + } + + + if (m_RightClickTreeItem == NULL || + !strItemText.CompareNoCase(L"ҵĵ")) + { + + } + + else + { + + CMenu ExMenu; + ExMenu.CreatePopupMenu(); + ExMenu.AppendMenu(MF_STRING, ID_STRING_VALUE,L"ֵַ"); + ExMenu.AppendMenu(MF_STRING, ID_BINARY_VALUE,L"ֵ"); + ExMenu.AppendMenu(MF_STRING, ID_DWORD_VALUE, L"DWORDֵ"); + ExMenu.AppendMenu(MF_STRING, ID_QWORD_VALUE, L"QWORDֵ"); + ExMenu.AppendMenu(MF_STRING, ID_MUI_STRING_VALUE,L"ֵַ"); + ExMenu.AppendMenu(MF_STRING, ID_EXPAND_STRING_VALUE,L"ֵַ"); + + + + CMenu Menu; + Menu.CreatePopupMenu(); + Menu.AppendMenu(MF_STRING, ID_REG_REFRESH,L"ˢ"); + Menu.AppendMenu(MF_SEPARATOR); + Menu.AppendMenu(MF_STRING, ID_REG_LOOK_FOR,L""); + Menu.AppendMenu(MF_SEPARATOR); + Menu.AppendMenu(MF_STRING, ID_REG_NEW_KEY,L"½"); + Menu.AppendMenu(MF_POPUP, (UINT)ExMenu.m_hMenu,L"½ֵ"); + Menu.AppendMenu(MF_SEPARATOR); + Menu.AppendMenu(MF_STRING, ID_REG_DELETE,L"ɾ"); + Menu.AppendMenu(MF_STRING, ID_REG_RENAME, L""); + + Menu.AppendMenu(MF_SEPARATOR); + Menu.AppendMenu(MF_STRING, ID_REG_INPORT,L""); + Menu.AppendMenu(MF_STRING, ID_REG_EXPORT,L""); + Menu.AppendMenu(MF_SEPARATOR); + + Menu.AppendMenu(MF_STRING, ID_REG_COPY_KEY_NAME,L""); + Menu.AppendMenu(MF_STRING, ID_REG_COPY_FULL_KEY_NAME,L"·"); + Menu.AppendMenu(MF_SEPARATOR); + Menu.AppendMenu(MF_STRING, ID_REG_ADD_TO_QUICK_ADDRESS,L"ӵٶλ"); + Menu.AppendMenu(MF_SEPARATOR); + int x = GetSystemMetrics(SM_CXMENUCHECK); + int y = GetSystemMetrics(SM_CYMENUCHECK); + + + if (x >= 15 && y >= 15) + { + Menu.SetMenuItemBitmaps(ID_REG_REFRESH, MF_BYCOMMAND, &m_bmRefresh, &m_bmRefresh); + Menu.SetMenuItemBitmaps(ID_REG_LOOK_FOR, MF_BYCOMMAND, &m_bmLookfor, &m_bmLookfor); + Menu.SetMenuItemBitmaps(ID_REG_DELETE, MF_BYCOMMAND, &m_bmDelete, &m_bmDelete); + + Menu.SetMenuItemBitmaps(ID_REG_COPY_KEY_NAME, MF_BYCOMMAND, &m_bmCopy, &m_bmCopy); + Menu.SetMenuItemBitmaps(ID_REG_COPY_FULL_KEY_NAME, MF_BYCOMMAND, &m_bmCopy, &m_bmCopy); + + + Menu.SetMenuItemBitmaps(ID_REG_INPORT, MF_BYCOMMAND, &m_bmExport, &m_bmExport); + Menu.SetMenuItemBitmaps(ID_REG_EXPORT, MF_BYCOMMAND, &m_bmExport, &m_bmExport); + } + + + if (!strItemText.CompareNoCase(L"HKEY_CLASSES_ROOT") || + !strItemText.CompareNoCase(L"HKEY_CURRENT_USER") || + !strItemText.CompareNoCase(L"HKEY_LOCAL_MACHINE") || + !strItemText.CompareNoCase(L"HKEY_USERS") || + !strItemText.CompareNoCase(L"HKEY_CURRENT_CONFIG") ) + { + Menu.EnableMenuItem(ID_REG_DELETE, MF_BYCOMMAND | MF_GRAYED | MF_DISABLED); + Menu.EnableMenuItem(ID_REG_RENAME, MF_BYCOMMAND | MF_GRAYED | MF_DISABLED); + } + + CPoint Point; + GetCursorPos(&Point); + Menu.TrackPopupMenu(TPM_RIGHTBUTTON, Point.x, Point.y, this); + Menu.DestroyMenu(); + ExMenu.DestroyMenu(); + } + + + + *pResult = 0; +} + + +void CRegisterManagerDlg::OnRegRefresh() +{ + CString strItemText; + + if ( m_RightClickTreeItem != NULL ) + { + strItemText = m_Tree.GetItemText(m_RightClickTreeItem); + } + + // computerôֱӳʼע + if (m_RightClickTreeItem == NULL || + !strItemText.CompareNoCase(L"ҵĵ")) + { + InitRegistry(); + } + else + { + // Ǵ״̬ˢ + if(m_RightClickTreeItem != NULL && + (TVIS_EXPANDED & m_Tree.GetItemState(m_RightClickTreeItem, TVIS_EXPANDED))) + { + m_Tree.Expand(m_RightClickTreeItem, TVE_COLLAPSE); + DeleteSubTree(m_RightClickTreeItem); + + HTREEITEM hItemTemp = m_RightClickTreeItem; + CString strKeyPath, strKeyPathTemp; + + while (1) + { + CString strText = m_Tree.GetItemText(hItemTemp); + + if (!strText.CompareNoCase(L"HKEY_CLASSES_ROOT")) + { + strKeyPath = CLASSES_ROOT; + break; + } + else if (!strText.CompareNoCase(L"HKEY_CURRENT_USER")) + { + strKeyPath = m_wzhKeyCurrentUser; + break; + } + else if (!strText.CompareNoCase(L"HKEY_LOCAL_MACHINE")) + { + strKeyPath = LOCAL_MACHINE; + break; + } + else if (!strText.CompareNoCase(L"HKEY_USERS")) + { + strKeyPath = USERS; + break; + } + else if (!strText.CompareNoCase(L"HKEY_CURRENT_CONFIG")) + { + strKeyPath = CURRENT_CONFIGL; + break; + } + else + { + strKeyPathTemp = strText + L"\\" + strKeyPathTemp; + } + + hItemTemp = m_Tree.GetParentItem(hItemTemp); + } + + strKeyPath = strKeyPath + L"\\" + strKeyPathTemp; + EnumSubKeys(strKeyPath, m_RightClickTreeItem); + EnumSubSubKeys(strKeyPath, m_RightClickTreeItem); + + m_Tree.Expand(m_RightClickTreeItem, TVE_EXPAND); + } + } +} + + + + + +void CRegisterManagerDlg::OnRegNewKey() +{ + CString strKeyPath = String2KeyPath(); + if (strKeyPath.IsEmpty()) + { + return; + } + + CKeyDlg CreateKeyDlg; //Dlg ½ ԶһDlgType + CString strNewKey; + + CreateKeyDlg.m_nDlgType = enumCreateKey; + if (CreateKeyDlg.DoModal() == IDOK) + { + strNewKey = CreateKeyDlg.m_strKeyNameEdit; + } + + if (strNewKey.IsEmpty()) + { + return; + } + + CString strKeyPathTemp = strKeyPath + L"\\"; + strKeyPathTemp += strNewKey; + + UNICODE_STRING uniKey; + if (InitUnicodeString(&uniKey, strKeyPathTemp.GetBuffer())) + { + HANDLE hKey; + OBJECT_ATTRIBUTES oa; + ULONG Disposition = 0; + + InitializeObjectAttributes(&oa, &uniKey, OBJ_CASE_INSENSITIVE, 0, NULL); + + if (CreateKey(&hKey, KEY_ALL_ACCESS, &oa, 0, NULL, 0, &Disposition)) + { + if (Disposition == REG_OPENED_EXISTING_KEY) + { + MessageBox(L"üѾ",L"Shine", MB_ICONERROR | MB_OK); + } + else + { + + HTREEITEM hItem = m_Tree.GetSelectedItem(); + m_Tree.InsertItem(strNewKey, 1, 2, hItem, TVI_LAST); + } + + CloseHandle(hKey); + } + + FreeUnicodeString(&uniKey); + } +} + + + + +CString CRegisterManagerDlg::String2KeyPath() +{ + CString strHead = m_strComboText.Left(m_strComboText.Find('\\')); + CString strRight = m_strComboText.Right(m_strComboText.GetLength() - m_strComboText.Find('\\')); + CString strKeyPath; + + if (strHead.IsEmpty()) + { + strHead = strRight; + strRight.Empty(); + } + + if (!strHead.CompareNoCase(L"HKEY_CLASSES_ROOT")) + { + strKeyPath = CLASSES_ROOT; + } + else if (!strHead.CompareNoCase(L"HKEY_CURRENT_USER")) + { + strKeyPath = m_wzhKeyCurrentUser; + } + else if (!strHead.CompareNoCase(L"HKEY_LOCAL_MACHINE")) + { + strKeyPath = LOCAL_MACHINE; + } + else if (!strHead.CompareNoCase(L"HKEY_USERS")) + { + strKeyPath = USERS; + } + else if (!strHead.CompareNoCase(L"HKEY_CURRENT_CONFIG")) + { + strKeyPath = CURRENT_CONFIGL; + } + + strKeyPath += strRight; + + return strKeyPath; +} + + + +BOOL CRegisterManagerDlg::CreateKey( + OUT PHANDLE KeyHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes, + IN ULONG ulTitleIndex, + IN PUNICODE_STRING uniClass, + IN ULONG ulCreateOptions, + OUT PULONG Disposition + ) + +{ + + DWORD dwReturnSize = 0; + DWORD dwRet = 0; + + struct{ + ACCESS_MASK DesiredAccess; + POBJECT_ATTRIBUTES ObjectAttributes; + }Create; + + memset(&Create, 0, sizeof(Create)); + Create.DesiredAccess = DesiredAccess; + Create.ObjectAttributes = ObjectAttributes; + + + + typedef struct _CREATE_VALUE_ + { + PHANDLE KeyHandle; + PULONG Disposition; + }CREATE_VALUE, *PCREATE_VALUE; + + + CREATE_VALUE CreateValue; + memset(&CreateValue, 0, sizeof(CREATE_VALUE)); + + + CreateValue.KeyHandle = KeyHandle; + CreateValue.Disposition = Disposition; + + g_hDevice = OpenDevice(L"\\\\.\\RegisterManagerLink"); + + + if (g_hDevice==(HANDLE)-1) + { + return FALSE; + } + + + + dwRet = DeviceIoControl(g_hDevice,CTL_CREATE_KEY, + &Create, + sizeof(Create), + &CreateValue, + sizeof(CREATE_VALUE), + &dwReturnSize, + NULL); + + + if (dwRet==0) + { + + CloseHandle(g_hDevice); + return FALSE; + } + + CloseHandle(g_hDevice); + + return TRUE; +} + + +void CRegisterManagerDlg::OnStringValue() +{ + SetValueKey(REG_SZ,NULL,0); +} + + + + +void CRegisterManagerDlg::SetValueKey(ULONG ulType, PVOID Data, ULONG ulDataSize) +{ + CString strKeyPath = String2KeyPath(); + if (strKeyPath.IsEmpty()) + { + return; + } + + CKeyDlg SetValueKeyDlg; + CString strValue; + + SetValueKeyDlg.m_nDlgType = enumSetValueKey; + if (SetValueKeyDlg.DoModal() == IDOK) + { + strValue = SetValueKeyDlg.m_strKeyNameEdit; + } + + if (strValue.IsEmpty()) + { + return; + } + + UNICODE_STRING uniKey; + if (InitUnicodeString(&uniKey, strKeyPath.GetBuffer())) + { + HANDLE hKey; + OBJECT_ATTRIBUTES oa; + + InitializeObjectAttributes(&oa, &uniKey, OBJ_CASE_INSENSITIVE, 0, NULL); + + if (OpenKey(&hKey, KEY_ALL_ACCESS, &oa)) + { + UNICODE_STRING uniValue; + + if (InitUnicodeString(&uniValue, strValue.GetBuffer())) + { + SetValueKey(hKey, &uniValue, 0, ulType, Data, ulDataSize); + FreeUnicodeString(&uniValue); + } + + CloseHandle(hKey); + } + + FreeUnicodeString(&uniKey); + } + + OnRegListRefresh(); //ˢControlList +} + + + + +BOOL CRegisterManagerDlg::SetValueKey( + IN HANDLE KeyHandle, + IN PUNICODE_STRING uniValueName, + IN ULONG ulTitleIndex, + IN ULONG ulType, + IN PVOID Data, + IN ULONG ulDataSize + ) +{ + + + + DWORD dwReturnSize = 0; + DWORD dwRet = 0; + + struct{ + HANDLE hKey; + PUNICODE_STRING ValueName; + ULONG Type; + PVOID Data; + ULONG DataSize; + }Set; + + memset(&Set, 0, sizeof(Set)); + + Set.hKey = KeyHandle; + Set.ValueName = uniValueName; + Set.Type = ulType; + Set.Data = Data; + Set.DataSize = ulDataSize; + + g_hDevice = OpenDevice(L"\\\\.\\RegisterManagerLink"); + + + if (g_hDevice==(HANDLE)-1) + { + return FALSE; + } + + + + dwRet = DeviceIoControl(g_hDevice,CTL_SET_KEY_VALUE, + &Set, + sizeof(Set), + NULL,0, + &dwReturnSize, + NULL); + + + if (dwRet==0) + { + + CloseHandle(g_hDevice); + return FALSE; + } + + CloseHandle(g_hDevice); + + return TRUE; +} + + + +void CRegisterManagerDlg::OnRegListRefresh() +{ + CString strKeyPath = String2KeyPath(); + EnumValues(strKeyPath); +} + +void CRegisterManagerDlg::OnBinaryValue() +{ + SetValueKey(REG_BINARY,NULL,0); +} + + +void CRegisterManagerDlg::OnDwordValue() +{ + DWORD dwValue = 0; + SetValueKey(REG_DWORD,&dwValue,sizeof(DWORD)); +} + + +void CRegisterManagerDlg::OnQwordValue() +{ + QWORD dwValue = 0; + SetValueKey(REG_QWORD,&dwValue,sizeof(QWORD)); +} + +void CRegisterManagerDlg::OnMuiStringValue() +{ + SetValueKey(REG_MULTI_SZ,NULL,0); +} + + +void CRegisterManagerDlg::OnExpandStringValue() +{ + SetValueKey(REG_EXPAND_SZ,NULL,0); +} + + + +void CRegisterManagerDlg::OnRegDelete() +{ + if (m_RightClickTreeItem != NULL) + { + if (MessageBox(L"ȷɾ",L"Shine", MB_YESNO | MB_ICONQUESTION) != IDYES) + { + return; + } + + HTREEITEM hItemTemp = m_RightClickTreeItem; + CString strKeyPath, strKeyPathTemp; + + while (1) + { + CString strText = m_Tree.GetItemText(hItemTemp); + + if (!strText.CompareNoCase(L"HKEY_CLASSES_ROOT")) + { + strKeyPath = CLASSES_ROOT; + break; + } + else if (!strText.CompareNoCase(L"HKEY_CURRENT_USER")) + { + strKeyPath = m_wzhKeyCurrentUser; + break; + } + else if (!strText.CompareNoCase(L"HKEY_LOCAL_MACHINE")) + { + strKeyPath = LOCAL_MACHINE; + break; + } + else if (!strText.CompareNoCase(L"HKEY_USERS")) + { + strKeyPath = USERS; + break; + } + else if (!strText.CompareNoCase(L"HKEY_CURRENT_CONFIG")) + { + strKeyPath = CURRENT_CONFIGL; + break; + } + else + { + strKeyPathTemp = strText + L"\\" + strKeyPathTemp; + } + + hItemTemp = m_Tree.GetParentItem(hItemTemp); + } + + strKeyPath = strKeyPath + L"\\" + strKeyPathTemp; + strKeyPath.TrimRight('\\'); + + m_Tree.Expand(m_RightClickTreeItem, TVE_COLLAPSE); + DeleteKeyAndSubKeys(strKeyPath); + UpdateKey(strKeyPath, m_RightClickTreeItem); //ˢTreeؼ + } +} + + + +void CRegisterManagerDlg::DeleteKeyAndSubKeys(CString strKey) +{ + if (strKey.IsEmpty()) + { + return; + } + + UNICODE_STRING uniKey; + BOOL bQuit = FALSE; + if (InitUnicodeString(&uniKey, strKey.GetBuffer())) + { + strKey.ReleaseBuffer(); + + HANDLE hKey; + OBJECT_ATTRIBUTES oa; + + InitializeObjectAttributes(&oa, &uniKey, OBJ_CASE_INSENSITIVE, 0, NULL); + + if (OpenKey(&hKey, KEY_ALL_ACCESS, &oa)) + { + ULONG i = 0; + while (1) + { + if (bQuit) + { + break; + } + + ULONG ulRetLen = 0; + BOOL bRet = EnumerateKey(hKey, i, KeyBasicInformation, NULL, 0, &ulRetLen); + if (!bRet && GetLastError() == ERROR_NO_MORE_ITEMS) // STATUS_NO_MORE_ENTRIES + { + if (!DeleteKey(hKey) ) + { + + bQuit = TRUE; + } + + break; + } + else if (!bRet && GetLastError() == ERROR_INSUFFICIENT_BUFFER) // STATUS_BUFFER_TOO_SMALL + { + PKEY_BASIC_INFORMATION Buffer = (PKEY_BASIC_INFORMATION)malloc(ulRetLen + 100); + + if (Buffer) + { + memset(Buffer, 0, ulRetLen + 100); + bRet = EnumerateKey(hKey, i, KeyBasicInformation, Buffer, ulRetLen + 100, &ulRetLen); + + if (bRet && Buffer->NameLength) + { + WCHAR wzName[1024] = {0}; + wcsncpy_s(wzName, 1024, Buffer->Name, Buffer->NameLength / sizeof(WCHAR)); + CString strKeyTemp = strKey + L"\\" + wzName; + DeleteKeyAndSubKeys(strKeyTemp); + } + else + { + break; + } + + free(Buffer); + } + } + } + + CloseHandle(hKey); + } + + FreeUnicodeString(&uniKey); + } +} + + +BOOL CRegisterManagerDlg::DeleteKey(IN HANDLE KeyHandle) +{ + DWORD dwReturnSize = 0; + DWORD dwRet = 0; + struct + { + HANDLE hKey; + }Delete; + + memset(&Delete, 0, sizeof(Delete)); + Delete.hKey = KeyHandle; + + + + g_hDevice = OpenDevice(L"\\\\.\\RegisterManagerLink"); + + + if (g_hDevice==(HANDLE)-1) + { + return FALSE; + } + + + + dwRet = DeviceIoControl(g_hDevice,CTL_DELETE_KEY, + &Delete, + sizeof(Delete), + NULL,0, + &dwReturnSize, + NULL); + + + if (dwRet==0) + { + + CloseHandle(g_hDevice); + return FALSE; + } + + CloseHandle(g_hDevice); + + return TRUE; +} + + + +void CRegisterManagerDlg::UpdateKey(CString strKey, HTREEITEM hItem) +{ + if ( !strKey.IsEmpty() && hItem != NULL ) + { + DeleteSubTree(hItem); + + UNICODE_STRING uniKey; + + if (InitUnicodeString(&uniKey, strKey.GetBuffer())) + { + HANDLE hKey; + OBJECT_ATTRIBUTES oa; + + InitializeObjectAttributes(&oa, &uniKey, OBJ_CASE_INSENSITIVE, 0, NULL); + + if (OpenKey(&hKey, KEY_ALL_ACCESS, &oa)) + { + for (ULONG i = 0; ; i++) + { + ULONG ulRetLen = 0; + BOOL bRet = EnumerateKey(hKey, i, KeyBasicInformation, NULL, 0, &ulRetLen); + + if (!bRet && GetLastError() == ERROR_NO_MORE_ITEMS) + { + break; + } + else if (!bRet && GetLastError() == ERROR_INSUFFICIENT_BUFFER) + { + PKEY_BASIC_INFORMATION Buffer = (PKEY_BASIC_INFORMATION)malloc(ulRetLen + 0x100); + if (Buffer) + { + memset(Buffer, 0, ulRetLen + 0x100); + bRet = EnumerateKey(hKey, i, KeyBasicInformation, Buffer, ulRetLen + 0x100, &ulRetLen); + + if (bRet) + { + m_Tree.InsertItem(Buffer->Name, 1, 2, hItem, TVI_LAST); + } + + free(Buffer); + } + } + } + + CloseHandle(hKey); + } + else + { + m_Tree.DeleteItem(hItem); + } + + FreeUnicodeString(&uniKey); + } + } +} + +void CRegisterManagerDlg::OnRegRename() +{ + CString strKeyPath = String2KeyPath(); + if (strKeyPath.IsEmpty()) + { + return; + } + + CString strKeyName = m_Tree.GetItemText(m_RightClickTreeItem); + CKeyDlg RenameKeyDlg; + RenameKeyDlg.m_nDlgType = enumRenameKey; + RenameKeyDlg.m_strKeyNameEdit = strKeyName; + if (RenameKeyDlg.DoModal() == IDOK) + { + CString strNewKeyName = RenameKeyDlg.m_strKeyNameEdit; + if (strNewKeyName.CompareNoCase(strKeyName)) //ֲ + { + UNICODE_STRING uniKey; + if (strNewKeyName.GetBuffer()!=NULL) + { + HANDLE hKey; + OBJECT_ATTRIBUTES oa; + HTREEITEM hItemTemp = m_RightClickTreeItem; + CString strKeyPath, strKeyPathTemp; + while (1) + { + CString strText = m_Tree.GetItemText(hItemTemp); + + if (!strText.CompareNoCase(L"HKEY_CLASSES_ROOT")) + { + strKeyPath = CLASSES_ROOT; + break; + } + else if (!strText.CompareNoCase(L"HKEY_CURRENT_USER")) + { + strKeyPath = m_wzhKeyCurrentUser; + break; + } + else if (!strText.CompareNoCase(L"HKEY_LOCAL_MACHINE")) + { + strKeyPath = LOCAL_MACHINE; + break; + } + else if (!strText.CompareNoCase(L"HKEY_USERS")) + { + strKeyPath = USERS; + break; + } + else if (!strText.CompareNoCase(L"HKEY_CURRENT_CONFIG")) + { + strKeyPath = CURRENT_CONFIGL; + break; + } + else + { + strKeyPathTemp = strText + L"\\" + strKeyPathTemp; + } + + hItemTemp = m_Tree.GetParentItem(hItemTemp); + } + + strKeyPath = strKeyPath + L"\\" + strKeyPathTemp; + + InitUnicodeString(&uniKey, strKeyPath.GetBuffer()); + + InitializeObjectAttributes(&oa, &uniKey, OBJ_CASE_INSENSITIVE, 0, NULL); + + if (OpenKey(&hKey, KEY_ALL_ACCESS, &oa)) + { + UNICODE_STRING uniNewKey; + if (InitUnicodeString(&uniNewKey,strNewKeyName.GetBuffer())) + { + if (RenameKey(hKey, &uniNewKey)) + { + m_Tree.SetItemText(m_RightClickTreeItem, strNewKeyName); //ؼ޸ijµ + + + //ComboBox + CString strTemp = m_strComboText.Left(m_strComboText.ReverseFind('\\')); + + strTemp+=L"\\"; + + strTemp+=strNewKeyName; + + + m_ComboBox.SetWindowText(strTemp); + + + } + + FreeUnicodeString(&uniNewKey); + } + + CloseHandle(hKey); + } + + FreeUnicodeString(&uniKey); + } + } + } +} + + +BOOL CRegisterManagerDlg::RenameKey( + IN HANDLE KeyHandle, + IN PUNICODE_STRING uniNewName + ) +{ + DWORD dwReturnSize = 0; + DWORD dwRet = 0; + + struct + { + HANDLE hKey; + PUNICODE_STRING uniNewName; + }Rename; + + memset(&Rename, 0, sizeof(Rename)); + + Rename.hKey = KeyHandle; + Rename.uniNewName = uniNewName; + + g_hDevice = OpenDevice(L"\\\\.\\RegisterManagerLink"); + + + if (g_hDevice==(HANDLE)-1) + { + return FALSE; + } + + + + dwRet = DeviceIoControl(g_hDevice,CTL_RENAME_KEY, + &Rename, + sizeof(Rename), + NULL,0, + &dwReturnSize, + NULL); + + + if (dwRet==0) + { + + CloseHandle(g_hDevice); + return FALSE; + } + + CloseHandle(g_hDevice); + + return TRUE; +} + + + +void CRegisterManagerDlg::OnRegCopyKeyName() +{ + UpdateData(TRUE); + CString strKeyName = m_strComboText.Right(m_strComboText.GetLength() - m_strComboText.ReverseFind('\\') - 1); + if (strKeyName.IsEmpty()) + { + strKeyName = m_strComboText; + } + + SetStringToClipboard(strKeyName); +} + + +void CRegisterManagerDlg::OnRegCopyFullKeyName() +{ + UpdateData(TRUE); + SetStringToClipboard(m_strComboText); +} + + + +BOOL CRegisterManagerDlg::SetStringToClipboard(CString strImageName) +{ + if (strImageName.IsEmpty()) + { + return TRUE; + } + + BOOL bRet = FALSE; + + if( OpenClipboard() ) + { + HGLOBAL hClipBuffer = 0; + WCHAR* wzBuffer = NULL; + + EmptyClipboard(); + hClipBuffer = LocalAlloc(GMEM_ZEROINIT, (strImageName.GetLength() + 1) * sizeof(WCHAR)); + if (hClipBuffer) + { + wzBuffer = (WCHAR*)GlobalLock(hClipBuffer); + if (wzBuffer) + { + wcsncpy_s(wzBuffer, strImageName.GetLength() + 1, strImageName.GetBuffer(), strImageName.GetLength()); + strImageName.ReleaseBuffer(); + SetClipboardData(CF_UNICODETEXT, hClipBuffer); + GlobalUnlock(hClipBuffer); + + bRet = TRUE; + } + } + + CloseClipboard(); + } + + return bRet; +} + + +void CRegisterManagerDlg::OnRegAddToQuickAddress() +{ + UpdateData(TRUE); + if (!m_strComboText.IsEmpty()) + { + m_RegPathList.push_back(m_strComboText); + m_nComboBoxCnt++; + + UpdateData(FALSE); + } +} + + +void CRegisterManagerDlg::OnRegInport() +{ + CFileDialog FileDlg(TRUE); + FileDlg.m_ofn.lpstrTitle = L"Open Register File"; + FileDlg.m_ofn.lpstrFilter = L"Registration Files(*.reg)\0*.reg\0\0"; + + if (IDOK == FileDlg.DoModal()) + { + CString strPath = FileDlg.GetPathName(); + ShellImportRegister(strPath); + + MessageBox(L"ɹ",L"Shine", MB_OK | MB_ICONINFORMATION); + + OnRegRefresh(); + } +} + + +VOID CRegisterManagerDlg::ShellImportRegister( + LPCTSTR ImportFile) //עļ +{ + CString strItem(ImportFile); + CString strParameters; + strParameters = L"/s \"" + strItem + L"\""; + ShellExecute(NULL, L"open", L"regedit.exe", + strParameters, NULL, SW_HIDE); + +} + +void CRegisterManagerDlg::OnRegExport() +{ + CString strItemText; + + if ( m_RightClickTreeItem != NULL ) + { + strItemText = m_Tree.GetItemText(m_RightClickTreeItem); + + if (strItemText.CompareNoCase(L"ҵĵ")) + { + HTREEITEM hItemTemp = m_RightClickTreeItem; + CString strKeyPath, strKeyPathTemp; + + while (1) + { + CString strText = m_Tree.GetItemText(hItemTemp); + + if (!strText.CompareNoCase(L"HKEY_CLASSES_ROOT")) + { + strKeyPath = L"HKEY_CLASSES_ROOT"; + break; + } + else if (!strText.CompareNoCase(L"HKEY_CURRENT_USER")) + { + strKeyPath = m_wzhKeyCurrentUser; + break; + } + else if (!strText.CompareNoCase(L"HKEY_LOCAL_MACHINE")) + { + strKeyPath = L"HKEY_LOCAL_MACHINE"; + break; + } + else if (!strText.CompareNoCase(L"HKEY_USERS")) + { + strKeyPath = L"HKEY_USERS"; + break; + } + else if (!strText.CompareNoCase(L"HKEY_CURRENT_CONFIG")) + { + strKeyPath = L"HKEY_CURRENT_CONFIG"; + break; + } + else + { + strKeyPathTemp = strText + L"\\" + strKeyPathTemp; + } + + hItemTemp = m_Tree.GetParentItem(hItemTemp); + } + + strKeyPath = strKeyPath + L"\\" + strKeyPathTemp; + strKeyPath.TrimRight('\\'); + + CString strFileName = strKeyPath.Right(strKeyPath.GetLength() - strKeyPath.ReverseFind(L'\\') - 1); + CFileDialog FileDlg( FALSE, 0, strFileName, 0, L"Register Files (*.reg)|*.reg;|All Files (*.*)|*.*||", 0 ); + if (IDOK == FileDlg.DoModal()) + { + CString strFilePath = FileDlg.GetFileName(); + CString strExtern = strFilePath.Right(4); + + + + if (strExtern.CompareNoCase(L".reg")) + { + strFilePath += L".reg"; + } + + if ( !PathFileExists(strFilePath) || + (PathFileExists(strFilePath) && + MessageBox(L"ļѾ",L"Shine", MB_YESNO | MB_ICONQUESTION) == IDYES && + DeleteFile(strFilePath))) + { + ShellExportRegister(strKeyPath, strFilePath); + + MessageBox(L"ɹ",L"Shine", MB_OK | MB_ICONINFORMATION); + } + } + } + } +} + + +VOID CRegisterManagerDlg::ShellExportRegister( + CString strItem, + CString strFileName) +{ + CString strParameters = L"/e \"" + strFileName + L"\" \"" + strItem + L"\""; + ShellExecute(0, L"open", L"regedit.exe", strParameters, NULL, SW_SHOWNORMAL); +} + + +void CRegisterManagerDlg::OnRegLookFor() +{ + m_FindRegDlg = new CRegFindDlg(); + m_FindRegDlg->m_strSearchInKey = m_strComboText; + m_FindRegDlg->Create(IDD_FIND_REG_DIALOG); + m_FindRegDlg->ShowWindow(SW_SHOWNORMAL); +} + + + +void CRegisterManagerDlg::JmpToReg(CString strKey, CString strData) +{ + if (strKey.IsEmpty()) + { + return; + } + + JmpToRegCommon(strKey, strData); +} + + +void CRegisterManagerDlg::JmpToRegCommon(CString strKey, CString strData) +{ + HTREEITEM hRootItem = m_Tree.GetRootItem(); + if (hRootItem == NULL) + { + return; + } + + HTREEITEM hChild = m_Tree.GetChildItem(hRootItem); + CString strRoot; + + while(hChild != NULL) + { + CString strKeyTemp = m_Tree.GetItemText(hChild); + + if (!_wcsnicmp(strKey.GetBuffer(), L"HKEY_CLASSES_ROOT", wcslen(L"HKEY_CLASSES_ROOT")) && + !strKeyTemp.CompareNoCase(L"HKEY_CLASSES_ROOT")) + { + strRoot = CLASSES_ROOT; + break; + } + else if (!_wcsnicmp(strKey.GetBuffer(), L"HKEY_CURRENT_USER", wcslen(L"HKEY_CURRENT_USER")) && + !strKeyTemp.CompareNoCase(L"HKEY_CURRENT_USER")) + { + strRoot = m_wzhKeyCurrentUser; + break; + } + else if (!_wcsnicmp(strKey.GetBuffer(), L"HKEY_LOCAL_MACHINE", wcslen(L"HKEY_LOCAL_MACHINE")) && + !strKeyTemp.CompareNoCase(L"HKEY_LOCAL_MACHINE")) + { + strRoot = LOCAL_MACHINE; + break; + } + else if (!_wcsnicmp(strKey.GetBuffer(), L"HKEY_USERS", wcslen(L"HKEY_USERS")) && + !strKeyTemp.CompareNoCase(L"HKEY_USERS")) + { + strRoot = USERS; + break; + } + else if (!_wcsnicmp(strKey.GetBuffer(), L"HKEY_CURRENT_CONFIG", wcslen(L"HKEY_CURRENT_CONFIG")) && + !strKeyTemp.CompareNoCase(L"HKEY_CURRENT_CONFIG")) + { + strRoot = CURRENT_CONFIGL; + break; + } + + hChild = m_Tree.GetNextSiblingItem(hChild); + } + + if (hChild == NULL || strRoot.IsEmpty()) + { + return; + } + + m_Tree.Expand(hChild, TVE_COLLAPSE); + EnumSubKeys(strRoot, hChild); + m_Tree.Expand(hChild, TVE_EXPAND); + + if (strKey.Find(L"\\") != -1) + { + CString strKeyEnd = strKey.Right(strKey.GetLength() - strKey.Find('\\') - 1); + + if (strKeyEnd.IsEmpty()) + { + return; + } + + strKeyEnd.TrimLeft('\\'); + + if (strKeyEnd.IsEmpty()) + { + return; + } + + CString strTemp; + BOOL bQuiet = FALSE; + + do + { + strTemp = strKeyEnd.Left(strKeyEnd.Find('\\')); + + if (strTemp.IsEmpty()) + { + strTemp = strKeyEnd; + bQuiet = TRUE; + } + + hChild = GetTreeSubItemByName(hChild, strTemp); + if (hChild == NULL) + { + CString strMsgBox; + + strMsgBox = L""; + strMsgBox += L" \'" + strKey + L"\'"; + MessageBox(strMsgBox, L"Shine", MB_OK | MB_ICONINFORMATION); + break; + } + + strRoot += L"\\" + strTemp; + + if (bQuiet) + { + EnumValues(strRoot); + m_Tree.Expand(hChild, TVE_EXPAND); + m_Tree.Select(hChild, TVGN_FIRSTVISIBLE); + m_Tree.SelectItem(hChild); + m_Tree.SetItemState(hChild, TVIS_DROPHILITED | TVIS_BOLD, TVIS_DROPHILITED | TVIS_BOLD); + + if (!strData.IsEmpty()) + { + DWORD dwCnt = m_List.GetItemCount(); + for (DWORD i = 0; i < dwCnt; i++) + { + if (!(m_List.GetItemText(i, 0)).CompareNoCase(strData)) + { + m_List.EnsureVisible(i, false); + m_List.SetItemState(i, LVIS_FOCUSED | LVIS_SELECTED,LVIS_FOCUSED | LVIS_SELECTED); + m_List.SetFocus(); + break; + } + } + } + + break; + } + else + { + EnumSubKeys(strRoot, hChild); + m_Tree.Expand(hChild, TVE_EXPAND); + } + + strKeyEnd = strKeyEnd.Right(strKeyEnd.GetLength() - strKeyEnd.Find('\\') - 1); + + } while (!bQuiet); + } +} + +void CRegisterManagerDlg::OnNMRClickList(NMHDR *pNMHDR, LRESULT *pResult) +{ + LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast(pNMHDR); + + if (!m_strComboText.IsEmpty()) + { + + + CMenu Menu; + Menu.CreatePopupMenu(); + Menu.AppendMenu(MF_STRING, ID_REG_LIST_REFRESH,L"ˢ"); + + Menu.AppendMenu(MF_SEPARATOR); + Menu.AppendMenu(MF_STRING, ID_REG_LIST_MODIFY,L"޸"); + Menu.AppendMenu(MF_STRING, ID_REG_LIST_DELETE, L"ɾ"); + Menu.AppendMenu(MF_STRING, ID_REG_LIST_RENAME, L""); + Menu.AppendMenu(MF_SEPARATOR); + Menu.AppendMenu(MF_STRING, ID_REG_LIST_COPY_VALUE, L"ֵ"); + Menu.AppendMenu(MF_STRING, ID_REG_LIST_COPY_VALUE_DATA,L"ֵ"); + + Menu.AppendMenu(MF_SEPARATOR); + + + int x = GetSystemMetrics(SM_CXMENUCHECK); + int y = GetSystemMetrics(SM_CYMENUCHECK); + if (x >= 15 && y >= 15) + { + Menu.SetMenuItemBitmaps(ID_REG_LIST_REFRESH, MF_BYCOMMAND, &m_bmRefresh, &m_bmRefresh); + Menu.SetMenuItemBitmaps(ID_REG_LIST_DELETE, MF_BYCOMMAND, &m_bmDelete, &m_bmDelete); + Menu.SetMenuItemBitmaps(ID_REG_LIST_COPY_VALUE, MF_BYCOMMAND, &m_bmCopy, &m_bmCopy); + Menu.SetMenuItemBitmaps(ID_REG_LIST_COPY_VALUE_DATA, MF_BYCOMMAND, &m_bmCopy, &m_bmCopy); + } + + if (m_List.GetSelectedCount() == 0) + { + Menu.EnableMenuItem(ID_REG_LIST_MODIFY, MF_BYCOMMAND | MF_GRAYED | MF_DISABLED); + Menu.EnableMenuItem(ID_REG_LIST_DELETE, MF_BYCOMMAND | MF_GRAYED | MF_DISABLED); + Menu.EnableMenuItem(ID_REG_LIST_RENAME, MF_BYCOMMAND | MF_GRAYED | MF_DISABLED); + Menu.EnableMenuItem(ID_REG_LIST_COPY_VALUE, MF_BYCOMMAND | MF_GRAYED | MF_DISABLED); + Menu.EnableMenuItem(ID_REG_LIST_COPY_VALUE_DATA, MF_BYCOMMAND | MF_GRAYED | MF_DISABLED); + } + else if (m_List.GetSelectedCount() == 1) + { + int nItem = m_List.GetSelectionMark(); + if (nItem != -1) + { + if (m_List.GetItemData(nItem)) + { + Menu.EnableMenuItem(ID_REG_LIST_RENAME, MF_BYCOMMAND | MF_GRAYED | MF_DISABLED); + + if (!(m_List.GetItemText(nItem, 2)).CompareNoCase(L"(ֵδ)")) + { + Menu.EnableMenuItem(ID_REG_LIST_DELETE, MF_BYCOMMAND | MF_GRAYED | MF_DISABLED); + } + } + } + } + + CPoint Point; + GetCursorPos(&Point); + Menu.TrackPopupMenu(TPM_RIGHTBUTTON, Point.x, Point.y, this); + Menu.DestroyMenu(); + + } + + *pResult = 0; +} + + +void CRegisterManagerDlg::OnRegListModify() +{ + int nItem = m_List.GetSelectionMark(); + if (nItem != -1) + { + CString strType = m_List.GetItemText(nItem, 1); + + if (strType.Find(L"SZ") != -1) + { + CString strValue = m_List.GetItemText(nItem, 0); + CString strData = m_List.GetItemText(nItem, 2); + + if (m_List.GetItemData(nItem) && !strData.CompareNoCase(L"(ֵδ)")) + { + strData = L""; + } + + CRegModifyDlg RegModifyDlg; + RegModifyDlg.m_strValueDataEdit = strData; + RegModifyDlg.m_strValueNameEdit = strValue; + + if (RegModifyDlg.DoModal() == IDOK) + { + CString strDataNew = RegModifyDlg.m_strValueDataEdit; + if (m_List.GetItemData(nItem)) + { + strValue = L""; + } + + ModifyValue(strValue,GetValueType(m_List.GetItemText(nItem, 1)),strDataNew.GetBuffer(), strDataNew.GetLength() * sizeof(WCHAR)); + OnRegListRefresh(); + } + } + else if (!strType.CompareNoCase(L"REG_DWORD")) + { + CString strValue = m_List.GetItemText(nItem, 0); + CString strData = m_List.GetItemText(nItem, 2); + + CString strShowData; + strShowData.Format(L"%ld", HexStringToLong(strData)); + + CRegModifyDlg RegModifyDlg; + RegModifyDlg.m_strValueDataEdit = strShowData; + RegModifyDlg.m_strValueNameEdit = strValue; + + if (RegModifyDlg.DoModal() == IDOK) + { + CString strDataNew = RegModifyDlg.m_strValueDataEdit; + DWORD dwData = 0; + + + + swscanf_s(strDataNew.GetBuffer(0), L"%x", &dwData); + + + + ModifyValue(strValue, GetValueType(m_List.GetItemText(nItem, 1)), &dwData, sizeof(DWORD)); + OnRegListRefresh(); + } + } + + else if (!strType.CompareNoCase(L"REG_QWORD")) + { + CString strValue = m_List.GetItemText(nItem, 0); + CString strData = m_List.GetItemText(nItem, 2); + + CString strShowData; + strShowData.Format(L"%ld", HexStringToLong(strData)); + + CRegModifyDlg RegModifyDlg; + RegModifyDlg.m_strValueDataEdit = strShowData; + RegModifyDlg.m_strValueNameEdit = strValue; + + if (RegModifyDlg.DoModal() == IDOK) + { + CString strDataNew = RegModifyDlg.m_strValueDataEdit; + LONGLONG dwData = 0; + + + + swscanf_s(strDataNew.GetBuffer(0), L"%p", &dwData); + + + + ModifyValue(strValue, GetValueType(m_List.GetItemText(nItem, 1)), &dwData, sizeof(LONGLONG)); + OnRegListRefresh(); + } + } + + + + else if (!strType.CompareNoCase(L"REG_BINARY") || + !strType.CompareNoCase(L"REG_RESOURCE_REQUIREMENTS_LIST") || + !strType.CompareNoCase(L"REG_FULL_RESOURCE_DESCRIPTOR") || + !strType.CompareNoCase(L"REG_RESOURCE_LIST")) + { + CString strValue = m_List.GetItemText(nItem, 0); + CString strData = m_List.GetItemText(nItem, 2); + ULONG ulLen = strData.GetLength() + strData.GetLength() % 2 + 10; + PBYTE Data = (PBYTE)malloc(ulLen); + ULONG ulDataLen = 0; + + if (Data) + { + memset(Data, 0, ulLen); + int n = strData.Find(' '); + while (n != -1) + { + swscanf_s(strData, L"%2x", &Data[ulDataLen++]); + strData = strData.Right(strData.GetLength() - n - 1); + n = strData.Find(' '); + } + + CRegHexEditDlg EditDlg; + EditDlg.m_Data = Data; + EditDlg.m_DataLen = ulDataLen; + EditDlg.m_strValueNameEdit = strValue; + + if (EditDlg.DoModal() == IDOK) + { + PBYTE RetData = EditDlg.m_RetData; + ULONG RetLen = EditDlg.m_RetLen; + if (RetData && RetLen) + { + ModifyValue(strValue, GetValueType(m_List.GetItemText(nItem, 1)),RetData, RetLen); + OnRegListRefresh(); + } + + if (RetData) + { + free(RetData); + } + } + + if (Data) + { + free(Data); + Data = NULL; + } + } + } + } +} + +ULONG CRegisterManagerDlg::GetValueType(CString strType) +{ + ULONG ulRet = 0; + if (strType.IsEmpty()) + { + return 0; + } + + if (!strType.CompareNoCase(L"REG_NONE")) + { + ulRet = REG_NONE; + } + else if (!strType.CompareNoCase(L"REG_SZ")) + { + ulRet = REG_SZ; + } + else if (!strType.CompareNoCase(L"REG_EXPAND_SZ")) + { + ulRet = REG_EXPAND_SZ; + } + else if (!strType.CompareNoCase(L"REG_BINARY")) + { + ulRet = REG_BINARY; + } + else if (!strType.CompareNoCase(L"REG_DWORD")) + { + ulRet = REG_DWORD; + } + else if (!strType.CompareNoCase(L"REG_DWORD_BIG_ENDIAN")) + { + ulRet = REG_DWORD_BIG_ENDIAN; + } + else if (!strType.CompareNoCase(L"REG_LINK")) + { + ulRet = REG_LINK; + } + else if (!strType.CompareNoCase(L"REG_MULTI_SZ")) + { + ulRet = REG_MULTI_SZ; + } + else if (!strType.CompareNoCase(L"REG_RESOURCE_LIST")) + { + ulRet = REG_RESOURCE_LIST; + } + else if (!strType.CompareNoCase(L"REG_FULL_RESOURCE_DESCRIPTOR")) + { + ulRet = REG_FULL_RESOURCE_DESCRIPTOR; + } + else if (!strType.CompareNoCase(L"REG_RESOURCE_REQUIREMENTS_LIST")) + { + ulRet = REG_RESOURCE_REQUIREMENTS_LIST; + } + else if (!strType.CompareNoCase(L"REG_QWORD")) + { + ulRet = REG_QWORD; + } + else if (!strType.CompareNoCase(L"Unknow")) + { + ulRet = 0; + } + + return ulRet; +} + + + +void CRegisterManagerDlg::ModifyValue(CString strValue, ULONG ulType, PVOID Data, ULONG ulDataSize) +{ + CString strKeyPath = String2KeyPath(); + + if (!strKeyPath.IsEmpty()) + { + UNICODE_STRING uniKey; + if (InitUnicodeString(&uniKey, strKeyPath.GetBuffer())) + { + HANDLE hKey; + OBJECT_ATTRIBUTES oa; + + InitializeObjectAttributes(&oa, &uniKey, OBJ_CASE_INSENSITIVE, 0, NULL); + + if (OpenKey(&hKey, KEY_ALL_ACCESS, &oa)) + { + if (strValue.IsEmpty()) + { + UNICODE_STRING uniValue; + uniValue.Buffer = NULL; + uniValue.Length = 0; + uniValue.MaximumLength = 2; + + if (SetValueKey(hKey, &uniValue, 0, ulType,Data, ulDataSize)) + { + + } + } + else + { + UNICODE_STRING uniValue; + if (InitUnicodeString(&uniValue, strValue.GetBuffer())) + { + SetValueKey(hKey, &uniValue, 0, ulType, Data, ulDataSize); + FreeUnicodeString(&uniValue); + } + } + + CloseHandle(hKey); + } + + FreeUnicodeString(&uniKey); + } + } +} + + +void CRegisterManagerDlg::OnRegListDelete() +{ + int nItem = m_List.GetSelectionMark(); + if (nItem != -1) + { + CString strValue = m_List.GetItemText(nItem, 0); + CString strKeyPath = String2KeyPath(); + + if (!strKeyPath.IsEmpty()) + { + if (MessageBox(L"ȷɾ",L"Shine", MB_ICONQUESTION | MB_YESNO) != IDYES) + { + return; + } + + UNICODE_STRING uniKey; + BOOL bOk = FALSE; + if (InitUnicodeString(&uniKey, strKeyPath.GetBuffer())) + { + HANDLE hKey; + OBJECT_ATTRIBUTES oa; + + InitializeObjectAttributes(&oa, &uniKey, OBJ_CASE_INSENSITIVE, 0, NULL); + + if (OpenKey(&hKey, KEY_ALL_ACCESS, &oa)) + { + UNICODE_STRING uniValue; + + if (m_List.GetItemData(nItem)) + { + uniValue.Buffer = NULL; + uniValue.Length = 0; + uniValue.MaximumLength = 2; + + bOk = DeleteValueKey(hKey, &uniValue); + } + else + { + if (InitUnicodeString(&uniValue, strValue.GetBuffer())) + { + bOk = DeleteValueKey(hKey, &uniValue); + FreeUnicodeString(&uniValue); + + } + } + + CloseHandle(hKey); + } + + FreeUnicodeString(&uniKey); + } + + if (bOk) + { + OnRegListRefresh(); + } + } + } +} + +ULONG CRegisterManagerDlg::HexStringToLong(CString strHex) +{ + ULONG ulRet = 0; + + if (!strHex.IsEmpty()) + { + swscanf_s(strHex.GetBuffer(wcslen(L"0x")), L"%x", &ulRet); + strHex.ReleaseBuffer(wcslen(L"0x")); + } + + return ulRet; +} + + +BOOL CRegisterManagerDlg::DeleteValueKey( + IN HANDLE KeyHandle, + IN PUNICODE_STRING uniValueName + ) +{ + DWORD dwReturnSize = 0; + DWORD dwRet = 0; + + + struct + { + HANDLE hKey; + PUNICODE_STRING uniValueName; + }DeleteValueKey; + + + memset(&DeleteValueKey, 0, sizeof(DeleteValueKey)); + + DeleteValueKey.hKey = KeyHandle; + DeleteValueKey.uniValueName = uniValueName; + + g_hDevice = OpenDevice(L"\\\\.\\RegisterManagerLink"); + + + if (g_hDevice==(HANDLE)-1) + { + return FALSE; + } + + + + dwRet = DeviceIoControl(g_hDevice,CTL_DELETE_KEY_VALUE, + &DeleteValueKey, + sizeof(DeleteValueKey), + NULL,0, + &dwReturnSize, + NULL); + + + if (dwRet==0) + { + + CloseHandle(g_hDevice); + return FALSE; + } + + CloseHandle(g_hDevice); + + return TRUE; +} + + +void CRegisterManagerDlg::OnRegListRename() +{ + CString strKeyPath = String2KeyPath(); + if (strKeyPath.IsEmpty()) + { + return; + } + + int nItem = m_List.GetSelectionMark(); + if (nItem != -1) + { + CKeyDlg RenameValueDlg; + RenameValueDlg.m_nDlgType = enumRenameValue; + CString strValueNameOld = m_List.GetItemText(nItem, 0); + RenameValueDlg.m_strKeyNameEdit = strValueNameOld; + CString strNewValueName; + if (RenameValueDlg.DoModal() == IDOK) + { + strNewValueName = RenameValueDlg.m_strKeyNameEdit; + } + + if (strNewValueName.IsEmpty()) + { + return; + } + + if (strNewValueName.CompareNoCase(strValueNameOld)) + { + //ԭȼֵĸ + PKEY_VALUE_FULL_INFORMATION ValueInfor = (PKEY_VALUE_FULL_INFORMATION)GetValueInfo(strKeyPath, strValueNameOld); + if (ValueInfor) + { + //ؽһµ + CreateValueKey(strNewValueName, ValueInfor->Type, + (PVOID)((PBYTE)ValueInfor + ValueInfor->DataOffset), ValueInfor->DataLength); + + // ɾɵļֵ + UNICODE_STRING uniKey; + if (InitUnicodeString(&uniKey, strKeyPath.GetBuffer())) + { + HANDLE hKey; + OBJECT_ATTRIBUTES oa; + + InitializeObjectAttributes(&oa, &uniKey, OBJ_CASE_INSENSITIVE, 0, NULL); + + if (OpenKey(&hKey, KEY_ALL_ACCESS, &oa)) + { + UNICODE_STRING uniValue; + + if (InitUnicodeString(&uniValue, strValueNameOld.GetBuffer())) + { + DeleteValueKey(hKey, &uniValue); + FreeUnicodeString(&uniValue); + m_List.DeleteItem(nItem); + } + + CloseHandle(hKey); + } + + FreeUnicodeString(&uniKey); + } + + // ͷԴ + free(ValueInfor); + ValueInfor = NULL; + } + } + } +} + + + +PVOID CRegisterManagerDlg::GetValueInfo(CString strKey, CString strValue) +{ + PVOID Ret = NULL; + + if (strKey.IsEmpty() || strValue.IsEmpty()) + { + return NULL; + } + + UNICODE_STRING uniKey; + + if (InitUnicodeString(&uniKey,strKey.GetBuffer())) + { + HANDLE hKey; + OBJECT_ATTRIBUTES oa; + + InitializeObjectAttributes(&oa, &uniKey, OBJ_CASE_INSENSITIVE, 0, NULL); + if (OpenKey(&hKey, KEY_ALL_ACCESS, &oa)) + { + for (ULONG i = 0; ; i++) + { + ULONG ulRetLen = 0; + BOOL bRet = EnumerateValueKey(hKey, i, KeyValueFullInformation, NULL, 0, &ulRetLen); + if (!bRet && GetLastError() == ERROR_NO_MORE_ITEMS) + { + break; + } + else if (!bRet && GetLastError() == ERROR_INSUFFICIENT_BUFFER) // STATUS_BUFFER_TOO_SMALL + { + PKEY_VALUE_FULL_INFORMATION Buffer = (PKEY_VALUE_FULL_INFORMATION)malloc(ulRetLen + 0x100); + if (Buffer) + { + memset(Buffer, 0, ulRetLen + 0x100); + bRet = EnumerateValueKey(hKey, i, KeyValueFullInformation, Buffer, ulRetLen + 0x100, &ulRetLen); + + if (bRet) + { + WCHAR wzTempName[1024] = {0}; + wcsncpy_s(wzTempName, 1024, Buffer->Name,Buffer->NameLength / sizeof(WCHAR)); + + if (!strValue.CompareNoCase(wzTempName)) + { + Ret = (PVOID)Buffer; + break; + } + } + + free(Buffer); + } + } + } + + CloseHandle(hKey); + } + + FreeUnicodeString(&uniKey); + } + + return Ret; +} + + + + +void CRegisterManagerDlg::CreateValueKey(CString strValue, ULONG ulType, PVOID Data, ULONG ulDataSize) +{ + CString strKeyPath = String2KeyPath(); + if (strKeyPath.IsEmpty() || strValue.IsEmpty()) + { + return; + } + + UNICODE_STRING uniKey; + if (InitUnicodeString(&uniKey, strKeyPath.GetBuffer())) + { + HANDLE hKey; + OBJECT_ATTRIBUTES oa; + + InitializeObjectAttributes(&oa, &uniKey, OBJ_CASE_INSENSITIVE, 0, NULL); + + if (OpenKey(&hKey, KEY_ALL_ACCESS, &oa)) + { + UNICODE_STRING uniValue; + + if (InitUnicodeString(&uniValue, strValue.GetBuffer())) + { + SetValueKey(hKey, &uniValue, 0, ulType, Data, ulDataSize); + FreeUnicodeString(&uniValue); + } + + CloseHandle(hKey); + } + + FreeUnicodeString(&uniKey); + } + + OnRegListRefresh(); +} + + +void CRegisterManagerDlg::OnRegListCopyValue() +{ + int nItem = m_List.GetSelectionMark(); + if (nItem != -1) + { + CString strValue = m_List.GetItemText(nItem, 0); + SetStringToClipboard(strValue); + } +} + + +void CRegisterManagerDlg::OnRegListCopyValueData() +{ + int nItem = m_List.GetSelectionMark(); + if (nItem != -1) + { + CString strData = m_List.GetItemText(nItem, 2); + SetStringToClipboard(strData); + } +} diff --git a/Register/RegisterManager/RegisterManager/RegisterManagerDlg.h b/Register/RegisterManager/RegisterManager/RegisterManagerDlg.h new file mode 100644 index 0000000..99911d5 --- /dev/null +++ b/Register/RegisterManager/RegisterManager/RegisterManagerDlg.h @@ -0,0 +1,276 @@ + +// RegisterManagerDlg.h : ͷļ +// + +#pragma once +#include "afxcmn.h" +#include "afxwin.h" +#include +#include +#include +#include "RegFindDlg.h" +using namespace std; +typedef struct _KEY_BASIC_INFORMATION { + LARGE_INTEGER LastWriteTime; + ULONG TitleIndex; + ULONG NameLength; + WCHAR Name[1]; +} KEY_BASIC_INFORMATION, *PKEY_BASIC_INFORMATION; + + +typedef enum _KEY_INFORMATION_CLASS { + KeyBasicInformation, + KeyNodeInformation, + KeyFullInformation, + KeyNameInformation, + KeyCachedInformation, + KeyFlagsInformation, + KeyVirtualizationInformation, + KeyHandleTagsInformation, + MaxKeyInfoClass +} KEY_INFORMATION_CLASS; + +typedef struct _KEY_VALUE_FULL_INFORMATION { + ULONG TitleIndex; + ULONG Type; + ULONG DataOffset; + ULONG DataLength; + ULONG NameLength; + WCHAR Name[1]; +} KEY_VALUE_FULL_INFORMATION, *PKEY_VALUE_FULL_INFORMATION; + +typedef enum _KEY_VALUE_INFORMATION_CLASS { + KeyValueBasicInformation, + KeyValueFullInformation, + KeyValuePartialInformation, + KeyValueFullInformationAlign64, + KeyValuePartialInformationAlign64, + MaxKeyValueInfoClass +} KEY_VALUE_INFORMATION_CLASS; + + +#define CLASSES_ROOT L"\\Registry\\Machine\\SOFTWARE\\Classes" +#define LOCAL_MACHINE L"\\Registry\\Machine" +#define USERS L"\\Registry\\User" +#define CURRENT_CONFIGL L"\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\Hardware Profiles\\Current" + + + +#define CTL_CREATE_KEY \ + CTL_CODE(FILE_DEVICE_UNKNOWN,0x833,METHOD_NEITHER,FILE_ANY_ACCESS) + +#define CTL_OPEN_KEY \ + CTL_CODE(FILE_DEVICE_UNKNOWN,0x830,METHOD_NEITHER,FILE_ANY_ACCESS) + +#define CTL_ENUM_KEY \ + CTL_CODE(FILE_DEVICE_UNKNOWN,0x831,METHOD_NEITHER,FILE_ANY_ACCESS) + +#define CTL_ENUM_KEY_VALUE \ + CTL_CODE(FILE_DEVICE_UNKNOWN,0x832,METHOD_NEITHER,FILE_ANY_ACCESS) + +#define CTL_SET_KEY_VALUE \ + CTL_CODE(FILE_DEVICE_UNKNOWN,0x834,METHOD_NEITHER,FILE_ANY_ACCESS) + + +#define CTL_DELETE_KEY \ + CTL_CODE(FILE_DEVICE_UNKNOWN,0x835,METHOD_NEITHER,FILE_ANY_ACCESS) + +#define CTL_RENAME_KEY \ + CTL_CODE(FILE_DEVICE_UNKNOWN,0x836,METHOD_NEITHER,FILE_ANY_ACCESS) + + +#define CTL_DELETE_KEY_VALUE \ + CTL_CODE(FILE_DEVICE_UNKNOWN,0x837,METHOD_NEITHER,FILE_ANY_ACCESS) + +#define OBJ_CASE_INSENSITIVE 0x00000040L +#define InitializeObjectAttributes( p, n, a, r, s ) { \ + (p)->Length = sizeof(OBJECT_ATTRIBUTES); \ + (p)->RootDirectory = r; \ + (p)->Attributes = a; \ + (p)->ObjectName = n; \ + (p)->SecurityDescriptor = s; \ + (p)->SecurityQualityOfService = NULL; \ +} + +typedef struct _UNICODE_STRING { + USHORT Length; + USHORT MaximumLength; + PWSTR Buffer; +}UNICODE_STRING, *PUNICODE_STRING; + + +typedef struct _OBJECT_ATTRIBUTES { + ULONG Length; + HANDLE RootDirectory; + PUNICODE_STRING ObjectName; + ULONG Attributes; + PVOID SecurityDescriptor; + PVOID SecurityQualityOfService; +}OBJECT_ATTRIBUTES, *POBJECT_ATTRIBUTES; + + +// CRegisterManagerDlg Ի +class CRegisterManagerDlg : public CDialogEx +{ +// +public: + CRegisterManagerDlg(CWnd* pParent = NULL); // ׼캯 + CRegisterManagerDlg::~CRegisterManagerDlg(); + BOOL InitControlTree(); + VOID InitRegistry(); + VOID EnumSubKeys(CString strKey, HTREEITEM hItem, BOOL bSubSubKey = FALSE); + VOID DeleteSubTree(HTREEITEM hTreeItem); + VOID CRegisterManagerDlg::FreeUnicodeString(UNICODE_STRING *uniString); + BOOL InitUnicodeString(PUNICODE_STRING uniString, WCHAR *wzString); + BOOL CRegisterManagerDlg::OpenKey(OUT PHANDLE KeyHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes + ); + BOOL CRegisterManagerDlg::EnumerateKey(IN HANDLE KeyHandle, + IN ULONG ulIndex, + IN ULONG ulKeyInformationClass, + OUT PVOID KeyInformation, + IN ULONG ulLength, + OUT PULONG ResultLength + ); + void CRegisterManagerDlg::EnumCurrentUserSubKeys(HTREEITEM hChild); + BOOL CRegisterManagerDlg::GetCurrentUserKeyPath(OUT WCHAR *wzCurrentUserPath); + void CRegisterManagerDlg::EnumSubSubKeys(CString strKey, HTREEITEM hItem); + void CRegisterManagerDlg::EnumValues(CString strKey); + + BOOL CRegisterManagerDlg::EnumerateValueKey(IN HANDLE KeyHandle, + IN ULONG ulIndex, + IN ULONG ulKeyValueInformationClass, + OUT PVOID KeyValueInformation, + IN ULONG ulLength, + OUT PULONG ulResultLength + ); + CString CRegisterManagerDlg::GetKeyType(ULONG ulType); + CString CRegisterManagerDlg::GetKeyData(ULONG ulType, WCHAR* wzData, ULONG ulDataLength); + + + VOID CRegisterManagerDlg::InitializeComboBox(); + void CRegisterManagerDlg::GetAllRegPath(std::list &RegPathList); + void CRegisterManagerDlg::InitRegPathList(); + CString CRegisterManagerDlg::ComboString2KeyPath(); + HTREEITEM CRegisterManagerDlg::GetTreeSubItemByName(HTREEITEM hPatentItem, CString strName); + CString CRegisterManagerDlg::String2KeyPath(); + + BOOL CRegisterManagerDlg::CreateKey( + OUT PHANDLE KeyHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes, + IN ULONG ulTitleIndex, + IN PUNICODE_STRING uniClass, + IN ULONG ulCreateOptions, + OUT PULONG Disposition + ); + + void CRegisterManagerDlg::SetValueKey(ULONG ulType, PVOID Data, ULONG ulDataSize); + + BOOL CRegisterManagerDlg::SetValueKey( + IN HANDLE KeyHandle, + IN PUNICODE_STRING uniValueName, + IN ULONG ulTitleIndex, + IN ULONG ulType, + IN PVOID Data, + IN ULONG ulDataSize + ); + + + void CRegisterManagerDlg::DeleteKeyAndSubKeys(CString strKey); + BOOL CRegisterManagerDlg::DeleteKey(IN HANDLE KeyHandle); + void CRegisterManagerDlg::UpdateKey(CString strKey, HTREEITEM hItem); + + + BOOL CRegisterManagerDlg::RenameKey( + IN HANDLE KeyHandle, + IN PUNICODE_STRING uniNewName + ); + BOOL SetStringToClipboard(CString strImageName); + VOID CRegisterManagerDlg::ShellImportRegister( + LPCTSTR ImportFile) ; + + VOID CRegisterManagerDlg::ShellExportRegister( + CString strItem, + CString strFileName); + + + void CRegisterManagerDlg::JmpToReg(CString strKey, CString strData); + void CRegisterManagerDlg::JmpToRegCommon(CString strKey, CString strData); + + BOOL CRegisterManagerDlg::DeleteValueKey( + IN HANDLE KeyHandle, + IN PUNICODE_STRING uniValueName + ); + + + PVOID CRegisterManagerDlg::GetValueInfo(CString strKey, CString strValue); + void CRegisterManagerDlg::CreateValueKey(CString strValue, ULONG ulType, PVOID Data, ULONG ulDataSize); + ULONG CRegisterManagerDlg::GetValueType(CString strType); + void CRegisterManagerDlg::ModifyValue(CString strValue, ULONG ulType, PVOID Data, ULONG ulDataSize); + ULONG CRegisterManagerDlg::HexStringToLong(CString strHex); + // Ի + enum { IDD = IDD_REGISTERMANAGER_DIALOG }; + + protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV ֧ + + +// ʵ +protected: + HICON m_hIcon; + + // ɵϢӳ亯 + virtual BOOL OnInitDialog(); + afx_msg void OnSysCommand(UINT nID, LPARAM lParam); + afx_msg void OnPaint(); + afx_msg HCURSOR OnQueryDragIcon(); + DECLARE_MESSAGE_MAP() +public: + CTreeCtrl m_Tree; + CImageList m_TreeImageList; + CListCtrl m_List; + CImageList m_ImageList; + CComboBox m_ComboBox; + CString m_strComboText; + WCHAR* m_wzhKeyCurrentUser; //Ǵ洢Current_User ֵ עҪͷڴ + std::list m_RegPathList; // עĿٶλ + ULONG m_nComboBoxCnt; // ٶλ + HTREEITEM m_RightClickTreeItem; // ؼϵҼѡ + CBitmap m_bmRefresh; + CBitmap m_bmDelete; + CBitmap m_bmCopy; + CBitmap m_bmExport; + CBitmap m_bmLookfor; + CRegFindDlg *m_FindRegDlg; //Dlg + afx_msg void OnTvnItemexpandingTree(NMHDR *pNMHDR, LRESULT *pResult); + afx_msg void OnTvnSelchangedTree(NMHDR *pNMHDR, LRESULT *pResult); + afx_msg void OnBnClickedGoto(); + afx_msg void OnCbnDropdownCombo(); + virtual BOOL PreTranslateMessage(MSG* pMsg); + afx_msg void OnRegRefresh(); + afx_msg void OnNMRClickTree(NMHDR *pNMHDR, LRESULT *pResult); + afx_msg void OnRegNewKey(); + afx_msg void OnStringValue(); + afx_msg void OnBinaryValue(); + afx_msg void OnDwordValue(); + afx_msg void OnMuiStringValue(); + afx_msg void OnExpandStringValue(); + afx_msg void OnRegDelete(); + afx_msg void OnRegRename(); + afx_msg void OnQwordValue(); + afx_msg void OnRegCopyKeyName(); + afx_msg void OnRegCopyFullKeyName(); + afx_msg void OnRegAddToQuickAddress(); + afx_msg void OnRegInport(); + afx_msg void OnRegExport(); + afx_msg void OnRegLookFor(); + afx_msg void OnNMRClickList(NMHDR *pNMHDR, LRESULT *pResult); + afx_msg void OnRegListRefresh(); + afx_msg void OnRegListModify(); + afx_msg void OnRegListDelete(); + afx_msg void OnRegListRename(); + afx_msg void OnRegListCopyValue(); + afx_msg void OnRegListCopyValueData(); +}; diff --git a/Register/RegisterManager/RegisterManager/res/Bmp/Copy.bmp b/Register/RegisterManager/RegisterManager/res/Bmp/Copy.bmp new file mode 100644 index 0000000000000000000000000000000000000000..a8890f3eb026dad4cb77b7018521af03374e99b1 GIT binary patch literal 822 zcmZ{g+e!ja6o!pnpvxYiC+GpX@45q)k(8aJ$e^GLp$j`0q78)wSwR#*L0))c1tpF{ zC_+h~kzqwe4q^>81{3}5J==y|O^bhT)>`{pYksDwxv|!wMKI8cV(2w^ZL* z!EXEvzpZ`V+GeVi?v|e{tpvLjQW&X2B%?Hu_7U5`$rg^*O!;7M2XYZ40uX(Odl8$( z$qbG?2ydJ6p+Otv|BB-m?N(x&X>-Jm`~gmvAPGn;K=jiO#pd|^D}9~Ru&(fAFK*%{ z;`XmQyQ-cO0m?t5^|fR(Cyw88*>QEi6rJivDQ6;%-<#;62BZa|(d6{s@G z1;|-sMc#kJ?VuiXNj@hk&y*+eJre3^Wn%3k&j92cbDI`M@bS+2#t4BkfILL`0yb_v6aMGpvg<-9Q*d|8(cAjQI+r-s3pkaa7s$b zq)C&uZ8?NTF|w9G^FzS_aVA2?b=a#T@5>cL3i!^PiOf@UK)3+issbR)NJ0o84~zFUB7?--o5j}5God%eAZ2q-wKrDbDO)cFMqe*OCO`t|EOckV#cLu4`4A6&e6iMjdO;^K4X&Ox-` zSAS#s_DNb=lcS@7?t*B+um0kW9lPu6ch8+WdGchSmQx200@b%DC}4FD#22_opzqM! z4|FzG1Tg_kJy7Kj8~`YV=^lvs4I4IW0)wq!uzmY>pc#17W3>T~`n7Av=nF{RsfU&DgY)k($gl%IsnQM8NvVn literal 0 HcmV?d00001 diff --git a/Register/RegisterManager/RegisterManager/res/Bmp/Lookfor.bmp b/Register/RegisterManager/RegisterManager/res/Bmp/Lookfor.bmp new file mode 100644 index 0000000000000000000000000000000000000000..a16e281ffdb4f2ecf1d663838b771302ef227876 GIT binary patch literal 1334 zcmbtTSxi$=5Isc@REk9ev2`nMMHWQ`6Qv+tBDGYCK#1qLbbS*LTfNC2_{w0=ee&1_b*Q}Z|2O*y?18refni7L6DIW z2fky$2CkAwv>h5siGb^H6xt4xAB=$0ti9zeJC#Yk`Zolsuq12e7OLF0G+WU(Nb3)U6A|nYFRFye$r9vl-S?MR0U> z;F;5b=g#M7rGD*dh4aBZIBr(KakT>W))v@b+TrSa0S{|)dnLT3es6z>53Nm*-qfPY zS&OID6>xu+(9U>Uj|9h^EBNTT4e2B0%L7Q?p5XD73vhpx;AC8CzXs`3J^OW2IwAEu z!o#X^+F#)8mT=>CJ#6R8$n8igZ9~a{N_5z2@QSfD z3k*fw$V~FGehF6c$V)wPZWLGb%D-xg_pFl7`}ukN$TjhBp3~F>y!}eI4U0sOb_fQd zS>?q!QnB`WgIlgwp-|w6%2(6AC|^xoVHPwpE_9mBjXLJ)5v%TMKypDgL@feh%k?|xm?v{;YCK&Ve*t*?-9ftKtoRSD^ zN|x_zW1$ho%|;lEg(x)c#%IHyH8t`~akt{m1jPQr7PAsMYEk-Re&MwAIN@MCi7F-`dCvSvbdb*yJT-0hoVoM* z;!~$hPfkggp_|G0M4c{HJ1H(cA#w7QSn?4gM~xn%jTt*uJ8t|0je4*ud`LvNYN#qQ cJZf0ecmYPKTWQEE9aE{`- zxS7*|+>IRlM0};qARLZpyaoBr^c3RxYIET65{3Lv=_lgU7Kh`g?u<0z7wSqy?=6bK zy1uC0V+-7F#SBHO{0Wch%StDHxv@MbxKTfgBQH3$UqJqBekjLC{8~rVn_pmpfSXBh zt)tMT{kv_rAd~p*o*GH?g+d{MsS!?09oMyetT>B!$6&1_NyzK^bvPe%VP+PU#}=;5 zDRVaQXJhqhaR8hoRsQDDa=&9O$s_*C+Mp;3JCcR9Q0s5mf#>V4 z1tdR+o`7>_wxWRP>lHkUEgxFY4M5l;UON!>jwT*Wchjq|+{*U&RkADxgF#Ugeb3KN hUeDwC9`YCSy^8coyl=JrV!ZY@A+N~aFuDG-`2^@1H{k#P literal 0 HcmV?d00001 diff --git a/Register/RegisterManager/RegisterManager/res/Check.avi b/Register/RegisterManager/RegisterManager/res/Check.avi new file mode 100644 index 0000000000000000000000000000000000000000..89efdb494a915155331c81dc17a0e5c8f683f4ea GIT binary patch literal 135168 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 aKm2Z6a{1-UlNFa$k{hodN>2ayqU68J;-vck literal 0 HcmV?d00001 diff --git a/Register/RegisterManager/RegisterManager/res/Icon/CloseDir.ico b/Register/RegisterManager/RegisterManager/res/Icon/CloseDir.ico new file mode 100644 index 0000000000000000000000000000000000000000..4e7af0b246f67216794bf99b873c4d03d6d16084 GIT binary patch literal 1406 zcmeHGziU%b6#m{zV_upxebl76br8FCC_+I8b*l=YX3%!fA%oHcVk0C*1;rn&&_Se# zg8_%))+xn7@W-GMlxESX3U#W2U;=drC^RL?^E>w?`m~h(1AgJWbG~!Vz4zR6PXL2I z+Xi7F>j(O24N=6khhosLVYuqI-RAc71*kiZG4kLA4m?`LC}r%)D#l;dF!{zo?j2>t z!PSqH&kkl+)-hY7UUM+_jk4}wp88&k+HtTzUa3^DPVSJaEAyU%|C`%&zzUY}VX%tZ z!!0PR_6}aPw4Z! z+Gk5OU9Vvncph?Vy4>&9G{lsA|U)50m=Yq0V2X|SEGnGUlJ>7BP8rMnAOxq)|#qUelpG!*HHDt>p2UExwbC}4U zAuAx0n!u&vBvRuUoXi)2Y+k=v>R1Mc&*hQXdlq?SZlpKY1lA#MD{m%{{l%7EiH=+t zic*0K1H9Pvwg literal 0 HcmV?d00001 diff --git a/Register/RegisterManager/RegisterManager/res/Icon/Computer.ico b/Register/RegisterManager/RegisterManager/res/Icon/Computer.ico new file mode 100644 index 0000000000000000000000000000000000000000..b77a05b3235415ab99e06c590f8653d4ab18ac30 GIT binary patch literal 14846 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 yS1CZ%WwUOVh(M2|R7i%sIJxyJez&c0uPFBjGT literal 0 HcmV?d00001 diff --git a/Register/RegisterManager/RegisterManager/res/Icon/REG_DWORD.ico b/Register/RegisterManager/RegisterManager/res/Icon/REG_DWORD.ico new file mode 100644 index 0000000000000000000000000000000000000000..1402294a8c03dcf2f37c56ef4751108e55b3546e GIT binary patch literal 318 zcma)2Ariwd3{!5s>tN7uVV@V4L9>+^7ws!~%APQ|B2RWwFgE8b$&!IDK;p|e1DLQT z;6}Bw-C5X)zLx}c@XXsw2FMWN4u{qnNnoB6YzP~Jb;DEO8c<}ecRLY*D=J1H9gG!T-QN!i7BpUqZTNoB#j- literal 0 HcmV?d00001 diff --git a/Register/RegisterManager/RegisterManager/res/Icon/REG_SZ.ico b/Register/RegisterManager/RegisterManager/res/Icon/REG_SZ.ico new file mode 100644 index 0000000000000000000000000000000000000000..e6afa49fbee8050c2f9be5cb7aba8d3c1a4f04c6 GIT binary patch literal 318 zcma)2F%kkH3|z*WIZG<*EAJuc{R$m+rt>;bqi+Zo>37=e9CpYONH7xlgj0*eq-`+y%~^lCJp%l=PsPv!y~M ue%gd!E$zyiN|T}Xt?%9EkjyzT#dxRa&;v&YcY6cRSKr`&;veC}Sb+~%PGL#_ literal 0 HcmV?d00001 diff --git a/Register/RegisterManager/RegisterManager/res/RegisterManager.ico b/Register/RegisterManager/RegisterManager/res/RegisterManager.ico new file mode 100644 index 0000000000000000000000000000000000000000..d56fbcdfdf6eac0f4727c34770c26689271d96af GIT binary patch literal 67777 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 NK9A-8OQnhX{{?OVn?wKr literal 0 HcmV?d00001 diff --git a/Register/RegisterManager/RegisterManager/res/RegisterManager.rc2 b/Register/RegisterManager/RegisterManager/res/RegisterManager.rc2 new file mode 100644 index 0000000000000000000000000000000000000000..a20b10475873f6c81c46643cd9c26164e1d649b9 GIT binary patch literal 686 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 // MFC ͱ׼ +#include // MFC չ + + +#include // MFC Զ + + + +#ifndef _AFX_NO_OLE_SUPPORT +#include // MFC Internet Explorer 4 ؼ֧ +#endif +#ifndef _AFX_NO_AFXCMN_SUPPORT +#include // MFC Windows ؼ֧ +#endif // _AFX_NO_AFXCMN_SUPPORT + +#include // Ϳؼ MFC ֧ + + + + + + + + + +#ifdef _UNICODE +#if defined _M_IX86 +#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"") +#elif defined _M_X64 +#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"") +#else +#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"") +#endif +#endif + + diff --git a/Register/RegisterManager/RegisterManager/targetver.h b/Register/RegisterManager/RegisterManager/targetver.h new file mode 100644 index 0000000..0afac5b --- /dev/null +++ b/Register/RegisterManager/RegisterManager/targetver.h @@ -0,0 +1,8 @@ +#pragma once + +// SDKDDKVer.h ߰汾Ŀ Windows ƽ̨ + +// ҪΪǰ Windows ƽ̨Ӧó WinSDKVer.h +// WIN32_WINNT ΪҪֵ֧ƽ̨Ȼٰ SDKDDKVer.h + +#include diff --git a/Register/RegisterManagerDrv/RegisterManagerDrv.c b/Register/RegisterManagerDrv/RegisterManagerDrv.c new file mode 100644 index 0000000..b323f5e --- /dev/null +++ b/Register/RegisterManagerDrv/RegisterManagerDrv.c @@ -0,0 +1,1098 @@ +#include "RegisterManagerDrv.h" + +PDRIVER_OBJECT g_DriverObject = NULL; +WIN_VERSION WinVersion = WINDOWS_UNKNOW; +ULONG_PTR SYSTEM_ADDRESS_START = 0; +ULONG_PTR PreviousModeOffsetOf_KTHREAD = 0; +ULONG_PTR IndexOffset = 0; +pfnNtEnumerateValueKey NtEnumerateValueKeyAddress = NULL; +pfnNtOpenKey NtOpenKeyAddress = NULL; +pfnNtEnumerateKey NtEnumerateKeyAddress = NULL; +pfnNtCreateKey NtCreateKeyAddress = NULL; +pfnNtSetValueKey NtSetValueKeyAddress = NULL; +pfnNtDeleteKey NtDeleteKeyAddress = NULL; +pfnNtRenameKey NtRenameKeyAddress = NULL; +pfnNtDeleteValueKey NtDeleteValueKeyAddress = NULL; +ULONG_PTR SSDTDescriptor = 0; +ULONG_PTR ulIndex = 0; +ULONG_PTR SSDTFuncAddress = 0; + + +HANDLE hRoot = NULL; +NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject,PUNICODE_STRING RegisterPath) +{ + PDEVICE_OBJECT DeviceObject; + NTSTATUS Status; + ULONG i; + + UNICODE_STRING uniDeviceName; + UNICODE_STRING uniLinkName; + + RtlInitUnicodeString(&uniDeviceName,DEVICE_NAME); + RtlInitUnicodeString(&uniLinkName,LINK_NAME); + + //豸; + Status = IoCreateDevice(DriverObject,0,&uniDeviceName,FILE_DEVICE_UNKNOWN,0,FALSE,&DeviceObject); + if (!NT_SUCCESS(Status)) + { + return Status; + } + + //; + Status = IoCreateSymbolicLink(&uniLinkName,&uniDeviceName); + + for (i = 0; iMajorFunction[i] = DefaultDispatch; + } + DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = ControlDispatch; + DriverObject->DriverUnload = UnloadDriver; + +#ifdef WIN64 +/* __asm + { + xchg rax,rbx + } +*/ DbgPrint("X64: RegisterManager IS RUNNING!!!\n"); +#else +/* __asm + { + xor eax,eax + } +*/ DbgPrint("X86: RegisterManager IS RUNNING!!!\n"); +#endif + + + g_DriverObject = DriverObject; + WinVersion = GetWindowsVersion(); + SetGolbalMember(); + return STATUS_SUCCESS; +} + + + +NTSTATUS ControlDispatch(PDEVICE_OBJECT DeviceObject,PIRP Irp) +{ + + NTSTATUS Status = STATUS_SUCCESS; + PIO_STACK_LOCATION IrpSp; + PVOID InputBuffer = NULL; + PVOID OutputBuffer = NULL; + ULONG_PTR InputSize = 0; + ULONG_PTR OutputSize = 0; + ULONG_PTR IoControlCode = 0; + PETHREAD EThread = NULL; + CHAR PreMode = 0; + IrpSp = IoGetCurrentIrpStackLocation(Irp); + + IrpSp = IoGetCurrentIrpStackLocation(Irp); + InputBuffer = IrpSp->Parameters.DeviceIoControl.Type3InputBuffer; + OutputBuffer = Irp->UserBuffer; + InputSize = IrpSp->Parameters.DeviceIoControl.InputBufferLength; + OutputSize = IrpSp->Parameters.DeviceIoControl.OutputBufferLength; + + IoControlCode = IrpSp->Parameters.DeviceIoControl.IoControlCode; + + + switch(IoControlCode) + { + + case CTL_OPEN_KEY: + { + + + DbgPrint("Ӧò¼"); + + + Status = RegOpenKey(InputBuffer,OutputBuffer); + + if (NT_SUCCESS(Status)) + { + Irp->IoStatus.Information = OutputSize; + Irp->IoStatus.Status = Status; + } + + else + { + Irp->IoStatus.Information = 0; + Irp->IoStatus.Status = Status; + } + + + break; + + } + + case CTL_ENUM_KEY: + { + + + Status = RegEnumerateKey(InputBuffer,OutputBuffer); + + + if (NT_SUCCESS(Status)) + { + Irp->IoStatus.Information = OutputSize; + Irp->IoStatus.Status = Status; + } + + else + { + Irp->IoStatus.Information = 0; + Irp->IoStatus.Status = Status; + } + + + + break; + } + + case CTL_ENUM_KEY_VALUE: + { + + Status = RegEnumerateValueKey(InputBuffer,OutputBuffer); + + + if (NT_SUCCESS(Status)) + { + Irp->IoStatus.Information = OutputSize; + Irp->IoStatus.Status = Status; + } + + else + { + Irp->IoStatus.Information = 0; + Irp->IoStatus.Status = Status; + } + + break; + } + + case CTL_CREATE_KEY: + { + + Status = RegCreateKey(InputBuffer,OutputBuffer); + + + if (NT_SUCCESS(Status)) + { + Irp->IoStatus.Information = OutputSize; + Irp->IoStatus.Status = Status; + } + + else + { + Irp->IoStatus.Information = 0; + Irp->IoStatus.Status = Status; + } + + break; + } + + case CTL_SET_KEY_VALUE: + { + + Status = RegSetValueKey(InputBuffer,OutputBuffer); + + + if (NT_SUCCESS(Status)) + { + Irp->IoStatus.Information = OutputSize; + Irp->IoStatus.Status = Status; + } + + else + { + Irp->IoStatus.Information = 0; + Irp->IoStatus.Status = Status; + } + + break; + } + + case CTL_DELETE_KEY: + { + + Status = RegDeleteKey(InputBuffer,OutputBuffer); + + + if (NT_SUCCESS(Status)) + { + Irp->IoStatus.Information = OutputSize; + Irp->IoStatus.Status = Status; + } + + else + { + Irp->IoStatus.Information = 0; + Irp->IoStatus.Status = Status; + } + + break; + } + + case CTL_RENAME_KEY: + { + + Status = RegRenameKey(InputBuffer,OutputBuffer); + + + if (NT_SUCCESS(Status)) + { + Irp->IoStatus.Information = OutputSize; + Irp->IoStatus.Status = Status; + } + + else + { + Irp->IoStatus.Information = 0; + Irp->IoStatus.Status = Status; + } + + break; + } + + + case CTL_DELETE_KEY_VALUE: + { + + Status = RegDeleteValueKey(InputBuffer,OutputBuffer); + + + if (NT_SUCCESS(Status)) + { + Irp->IoStatus.Information = OutputSize; + Irp->IoStatus.Status = Status; + } + + else + { + Irp->IoStatus.Information = 0; + Irp->IoStatus.Status = Status; + } + + break; + } + default: + { + + Irp->IoStatus.Status = STATUS_UNSUCCESSFUL; + Irp->IoStatus.Information = 0; + + + + break; + } + } + + + IoCompleteRequest(Irp,IO_NO_INCREMENT); + + return Status; +} + +NTSTATUS RegOpenKey(PVOID InBuffer,PVOID OutBuffer) +{ + POPEN Open = (POPEN)InBuffer; + ACCESS_MASK Mask = Open->DesiredAccess; + POBJECT_ATTRIBUTES oa = Open->ObjectAttributes; + PHANDLE KeyHandle = (PHANDLE)OutBuffer; + NTSTATUS Status = STATUS_UNSUCCESSFUL; + + __try + { + ProbeForRead(oa,sizeof(OBJECT_ATTRIBUTES),1); + Status = KernelOpenKey(KeyHandle,Mask,oa); + + + } + __except(1) + { + Status = STATUS_UNSUCCESSFUL; + } + + return Status; +} + + + +NTSTATUS KernelOpenKey(OUT PHANDLE KeyHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes + ) + +{ + NTSTATUS Status = STATUS_UNSUCCESSFUL; + PETHREAD EThread = NULL; + CHAR PreMode = 0; + + if (!KeyHandle || + !ObjectAttributes) + { + return Status; + } + + + EThread = PsGetCurrentThread(); + PreMode = ChangePreMode(EThread); + Status = NtOpenKeyAddress(KeyHandle, DesiredAccess, ObjectAttributes); + RecoverPreMode(EThread, PreMode); + + + return Status; +} + + + + +NTSTATUS RegEnumerateKey(PVOID InBuffer,PVOID OutBuffer) +{ + PENUM Enum = (PENUM)InBuffer; + HANDLE KeyHandle = Enum->hKey; + ULONG Index = Enum->Index; + KEY_INFORMATION_CLASS KeyInformationClass = Enum->InformationClass; + ULONG Length = Enum->Length; + PENUM_VALUE EnumValue = (PENUM_VALUE)OutBuffer; + ULONG ulReturn = 0; + return KernelEnumerateKey(KeyHandle, Index, KeyInformationClass,EnumValue->ValueInfor,Length,EnumValue->RetLength); +} + + + +NTSTATUS KernelEnumerateKey(IN HANDLE KeyHandle, + IN ULONG Index, + IN KEY_INFORMATION_CLASS KeyInformationClass, + OUT PVOID KeyInformation, + IN ULONG Length, + OUT PULONG ResultLength + ) +{ + NTSTATUS Status = STATUS_UNSUCCESSFUL; + PETHREAD EThread = NULL; + CHAR PreMode = 0; + + if (!KeyHandle) + { + return Status; + } + + + + EThread = PsGetCurrentThread(); + PreMode = ChangePreMode(EThread);; + Status = NtEnumerateKeyAddress(KeyHandle, Index, KeyInformationClass, KeyInformation, Length, ResultLength); + RecoverPreMode(EThread, PreMode); + if (Status == STATUS_BUFFER_TOO_SMALL) + { + DbgPrint("STATUS_BUFFER_TOO_SMALL\r\n"); + } + else if (STATUS_NO_MORE_ENTRIES == Status) + { + DbgPrint("STATUS_NO_MORE_ENTRIES\r\n"); + } + + else if (Status==STATUS_ACCESS_VIOLATION) + { + DbgPrint("STATUS_ACCESS_VIOLATION %d\r\n",RtlNtStatusToDosError(Status)); + } + + return Status; +} + + + + +NTSTATUS RegEnumerateValueKey(PVOID InBuffer,PVOID OutBuffer) +{ + PENUM Enum = (PENUM)InBuffer; + HANDLE KeyHandle = Enum->hKey; + ULONG Index = Enum->Index; + KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass = Enum->InformationClass; + ULONG Length = Enum->Length; + PENUM_VALUE EnumValue = (PENUM_VALUE)OutBuffer; + + return KernelEnumerateValueKey(KeyHandle, Index, KeyValueInformationClass, EnumValue->ValueInfor, Length, EnumValue->RetLength); +} + + +NTSTATUS KernelEnumerateValueKey(IN HANDLE KeyHandle, + IN ULONG Index, + IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass, + OUT PVOID KeyValueInformation, + IN ULONG Length, + OUT PULONG ResultLength + ) +{ + NTSTATUS Status = STATUS_UNSUCCESSFUL; + PETHREAD EThread = NULL; + CHAR PreMode = 0; + + + if (!KeyHandle) + { + return Status; + } + + EThread = PsGetCurrentThread(); + PreMode = ChangePreMode(EThread); + + Status = NtEnumerateValueKeyAddress(KeyHandle, Index, KeyValueInformationClass, KeyValueInformation, Length, ResultLength); + + if (Status == STATUS_BUFFER_TOO_SMALL) + { + DbgPrint("STATUS_BUFFER_TOO_SMALL\r\n"); + } + else if (STATUS_NO_MORE_ENTRIES == Status) + { + DbgPrint("STATUS_NO_MORE_ENTRIES\r\n"); + } + + else if (Status==STATUS_ACCESS_VIOLATION) + { + DbgPrint("STATUS_ACCESS_VIOLATION %d\r\n",RtlNtStatusToDosError(Status)); + } + + RecoverPreMode(EThread, PreMode); + return Status; +} + + +NTSTATUS RegCreateKey(PVOID InBuffer,PVOID OutBuffer) +{ + PCREATE Create = (PCREATE)InBuffer; + ACCESS_MASK DesiredAccess = Create->DesiredAccess; + POBJECT_ATTRIBUTES oa = Create->ObjectAttributes; + + PCREATE_VALUE CreateValue = (PCREATE_VALUE)OutBuffer; + PHANDLE KeyHandle = CreateValue->KeyHandle; + PULONG Disposition = CreateValue->Disposition; + return KernelCreateKey(KeyHandle, DesiredAccess, oa, 0, NULL, REG_OPTION_NON_VOLATILE, Disposition); +} + + + +NTSTATUS + KernelCreateKey( + OUT PHANDLE KeyHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes, + IN ULONG TitleIndex, + IN PUNICODE_STRING Class OPTIONAL, + IN ULONG CreateOptions, + OUT PULONG Disposition OPTIONAL + ) +{ + + PETHREAD EThread = NULL; + CHAR PreMode = 0; + NTSTATUS Status = STATUS_UNSUCCESSFUL; + + if (!KeyHandle) + { + return Status; + } + + EThread = PsGetCurrentThread(); + PreMode = ChangePreMode(EThread); + + Status = NtCreateKeyAddress(KeyHandle, DesiredAccess, ObjectAttributes, TitleIndex, Class, CreateOptions, Disposition); + + RecoverPreMode(EThread, PreMode); + return Status; +} + + +NTSTATUS RegSetValueKey(PVOID InBuffer,PVOID OutBuffer) +{ + PSET_KEY_VALUE SetKeyValue = (PSET_KEY_VALUE)InBuffer; + HANDLE KeyHandle = SetKeyValue->hKey; + PUNICODE_STRING uniValueName = (PUNICODE_STRING)(SetKeyValue->ValueName); + ULONG Type = SetKeyValue->Type; + PVOID Data = SetKeyValue->Data; + ULONG DataSize = SetKeyValue->DataSize; + return KernelSetValueKey(KeyHandle, uniValueName, 0, Type, Data, DataSize); +} + +NTSTATUS + KernelSetValueKey(IN HANDLE KeyHandle, + IN PUNICODE_STRING ValueName, + IN ULONG TitleIndex OPTIONAL, + IN ULONG Type, + IN PVOID Data, + IN ULONG DataSize + ) +{ + + PETHREAD EThread = NULL; + CHAR PreMode = 0; + NTSTATUS Status = STATUS_UNSUCCESSFUL; + + if (!KeyHandle) + { + return Status; + } + + EThread = PsGetCurrentThread(); + PreMode = ChangePreMode(EThread); + + Status = NtSetValueKeyAddress(KeyHandle, ValueName, TitleIndex, Type, Data, DataSize); + + RecoverPreMode(EThread, PreMode); + return Status; +} + +NTSTATUS RegDeleteKey(PVOID InBuffer,PVOID OutBuffer) +{ + PDELETE Delete = (PDELETE)InBuffer; + HANDLE KeyHandle = Delete->hKey; + + return KernelDeleteKey(KeyHandle); +} + + + +NTSTATUS + KernelDeleteKey( + IN HANDLE KeyHandle + ) +{ + + PETHREAD EThread = NULL; + CHAR PreMode = 0; + NTSTATUS Status = STATUS_UNSUCCESSFUL; + + if (!KeyHandle) + { + return Status; + } + + EThread = PsGetCurrentThread(); + PreMode = ChangePreMode(EThread); + + Status = NtDeleteKeyAddress(KeyHandle); + + RecoverPreMode(EThread, PreMode); + return Status; +} + + +NTSTATUS RegRenameKey(PVOID InBuffer,PVOID OutBuffer) +{ + PRENAME Rename = (PRENAME)InBuffer; + HANDLE KeyHandle = Rename->hKey; + PUNICODE_STRING uniNewName = (PUNICODE_STRING)(Rename->uniNewName); + + + return KernelRenameKey(KeyHandle, uniNewName); +} + + + + +NTSTATUS KernelRenameKey(IN HANDLE KeyHandle, IN PUNICODE_STRING uniNewName) +{ + + PETHREAD EThread = NULL; + CHAR PreMode = 0; + NTSTATUS Status = STATUS_UNSUCCESSFUL; + + if (!KeyHandle) + { + return Status; + } + + EThread = PsGetCurrentThread(); + PreMode = ChangePreMode(EThread); + + Status = NtRenameKeyAddress(KeyHandle, uniNewName); + + RecoverPreMode(EThread, PreMode); + return Status; +} + + +NTSTATUS RegDeleteValueKey(PVOID InBuffer,PVOID OutBuffer) +{ + PDELETE_KEY_VALUE DeleteKeyValue = (PDELETE_KEY_VALUE)InBuffer; + HANDLE KeyHandle = DeleteKeyValue->hKey; + PUNICODE_STRING uniValueName = (PUNICODE_STRING)(DeleteKeyValue->uniValueName); + + + return KernelDeleteValueKey(KeyHandle, uniValueName); +} + + +NTSTATUS + KernelDeleteValueKey(IN HANDLE KeyHandle, + IN PUNICODE_STRING uniValueName + ) +{ + + PETHREAD EThread = NULL; + CHAR PreMode = 0; + NTSTATUS Status = STATUS_UNSUCCESSFUL; + + if (!KeyHandle) + { + return Status; + } + + EThread = PsGetCurrentThread(); + PreMode = ChangePreMode(EThread); + + Status = NtDeleteValueKeyAddress(KeyHandle,uniValueName); + + RecoverPreMode(EThread, PreMode); + return Status; +} + + +NTSTATUS DefaultDispatch(PDEVICE_OBJECT DeviceObject,PIRP Irp) +{ + Irp->IoStatus.Status = STATUS_SUCCESS; + Irp->IoStatus.Information = 0; + IoCompleteRequest(Irp,IO_NO_INCREMENT); + + return STATUS_SUCCESS; +} + +VOID UnloadDriver(PDRIVER_OBJECT DriverObject) +{ + UNICODE_STRING uniLinkName; + PDEVICE_OBJECT NextObject = NULL; + PDEVICE_OBJECT CurrentObject = NULL; + RtlInitUnicodeString(&uniLinkName,LINK_NAME); + + IoDeleteSymbolicLink(&uniLinkName); + CurrentObject = DriverObject->DeviceObject; + while (CurrentObject != NULL) + { + + NextObject = CurrentObject->NextDevice; + IoDeleteDevice(CurrentObject); + CurrentObject = NextObject; + } + +#ifdef WIN64 + DbgPrint("X64: RegisterManager IS STOPPED!!!\n"); +#else + DbgPrint("X86: RegisterManager IS STOPPED!!!\n"); +#endif + + return; +} + + +CHAR ChangePreMode(PETHREAD EThread) +{ + + CHAR PreMode = *(PCHAR)((ULONG_PTR)EThread + PreviousModeOffsetOf_KTHREAD); + *(PCHAR)((ULONG_PTR)EThread + PreviousModeOffsetOf_KTHREAD) = KernelMode; + return PreMode; +} + +VOID RecoverPreMode(PETHREAD EThread, CHAR PreMode) +{ + + *(PCHAR)((ULONG_PTR)EThread + PreviousModeOffsetOf_KTHREAD) = PreMode; +} + + + +WIN_VERSION GetWindowsVersion() +{ + RTL_OSVERSIONINFOEXW osverInfo = {sizeof(osverInfo)}; + pfnRtlGetVersion RtlGetVersion = NULL; + WIN_VERSION WinVersion; + WCHAR wzRtlGetVersion[] = L"RtlGetVersion"; + + RtlGetVersion = GetFunctionAddressByName(wzRtlGetVersion); + if (RtlGetVersion) + { + RtlGetVersion((PRTL_OSVERSIONINFOW)&osverInfo); + } + else + { + PsGetVersion(&osverInfo.dwMajorVersion, &osverInfo.dwMinorVersion, &osverInfo.dwBuildNumber, NULL); + } + + DbgPrint("Build Number: %d\r\n", osverInfo.dwBuildNumber); + + if (osverInfo.dwMajorVersion == 5 && osverInfo.dwMinorVersion == 1) + { + DbgPrint("WINDOWS_XP\r\n"); + WinVersion = WINDOWS_XP; + } + else if (osverInfo.dwMajorVersion == 6 && osverInfo.dwMinorVersion == 1) + { + DbgPrint("WINDOWS 7\r\n"); + WinVersion = WINDOWS_7; + } + else if (osverInfo.dwMajorVersion == 6 && + osverInfo.dwMinorVersion == 2 && + osverInfo.dwBuildNumber == 9200) + { + DbgPrint("WINDOWS 8\r\n"); + WinVersion = WINDOWS_8; + } + else if (osverInfo.dwMajorVersion == 6 && + osverInfo.dwMinorVersion == 3 && + osverInfo.dwBuildNumber == 9600) + { + DbgPrint("WINDOWS 8.1\r\n"); + WinVersion = WINDOWS_8_1; + } + else + { + DbgPrint("WINDOWS_UNKNOW\r\n"); + WinVersion = WINDOWS_UNKNOW; + } + + return WinVersion; +} +VOID SetGolbalMember() +{ + switch(WinVersion) + { + case WINDOWS_XP: + { + SYSTEM_ADDRESS_START = 0x80000000; + + + PreviousModeOffsetOf_KTHREAD = 0x140; + IndexOffset = 1; + SSDTDescriptor = (ULONG_PTR)GetFunctionAddressByName(L"KeServiceDescriptorTable"); + //NtQueryObjectĵַ + ulIndex = GetSSDTApiFunIndex("NtOpenKey"); + SSDTFuncAddress = GetSSDTApiFunAddress(ulIndex,SSDTDescriptor); + NtOpenKeyAddress = (pfnNtOpenKey)SSDTFuncAddress; + + + ulIndex = GetSSDTApiFunIndex("NtEnumerateKey"); + SSDTFuncAddress = GetSSDTApiFunAddress(ulIndex,SSDTDescriptor); + NtEnumerateKeyAddress = (pfnNtEnumerateKey)SSDTFuncAddress; + + + ulIndex = GetSSDTApiFunIndex("NtEnumerateValueKey"); + SSDTFuncAddress = GetSSDTApiFunAddress(ulIndex,SSDTDescriptor); + NtEnumerateValueKeyAddress = (pfnNtEnumerateValueKey)SSDTFuncAddress; + + + ulIndex = GetSSDTApiFunIndex("NtCreateKey"); + SSDTFuncAddress = GetSSDTApiFunAddress(ulIndex,SSDTDescriptor); + NtCreateKeyAddress = (pfnNtCreateKey)SSDTFuncAddress; + + + + ulIndex = GetSSDTApiFunIndex("NtSetValueKey"); + SSDTFuncAddress = GetSSDTApiFunAddress(ulIndex,SSDTDescriptor); + NtSetValueKeyAddress = (pfnNtSetValueKey)SSDTFuncAddress; + + + ulIndex = GetSSDTApiFunIndex("NtDeleteKey"); + SSDTFuncAddress = GetSSDTApiFunAddress(ulIndex,SSDTDescriptor); + NtDeleteKeyAddress = (pfnNtDeleteKey)SSDTFuncAddress; + + + ulIndex = GetSSDTApiFunIndex("NtRenameKey"); + SSDTFuncAddress = GetSSDTApiFunAddress(ulIndex,SSDTDescriptor); + NtRenameKeyAddress = (pfnNtRenameKey)SSDTFuncAddress; + + ulIndex = GetSSDTApiFunIndex("NtDeleteValueKey"); + SSDTFuncAddress = GetSSDTApiFunAddress(ulIndex,SSDTDescriptor); + NtDeleteValueKeyAddress = (pfnNtDeleteValueKey)SSDTFuncAddress; + + break; + } + case WINDOWS_7: + { + + PreviousModeOffsetOf_KTHREAD = 0x1f6; + IndexOffset = 4; + SSDTDescriptor = GetKeServiceDescriptorTable64(); + + ulIndex = GetSSDTApiFunIndex("NtOpenKey"); + SSDTFuncAddress = GetSSDTApiFunAddress(ulIndex,SSDTDescriptor); + NtOpenKeyAddress = (pfnNtOpenKey)SSDTFuncAddress; + + ulIndex = GetSSDTApiFunIndex("NtEnumerateKey"); + SSDTFuncAddress = GetSSDTApiFunAddress(ulIndex,SSDTDescriptor); + NtEnumerateKeyAddress = (pfnNtEnumerateKey)SSDTFuncAddress; + + ulIndex = GetSSDTApiFunIndex("NtEnumerateValueKey"); + SSDTFuncAddress = GetSSDTApiFunAddress(ulIndex,SSDTDescriptor); + NtEnumerateValueKeyAddress = (pfnNtEnumerateValueKey)SSDTFuncAddress; + + + ulIndex = GetSSDTApiFunIndex("NtCreateKey"); + SSDTFuncAddress = GetSSDTApiFunAddress(ulIndex,SSDTDescriptor); + NtCreateKeyAddress = (pfnNtCreateKey)SSDTFuncAddress; + + ulIndex = GetSSDTApiFunIndex("NtSetValueKey"); + SSDTFuncAddress = GetSSDTApiFunAddress(ulIndex,SSDTDescriptor); + NtSetValueKeyAddress = (pfnNtSetValueKey)SSDTFuncAddress; + + + ulIndex = GetSSDTApiFunIndex("NtDeleteKey"); + SSDTFuncAddress = GetSSDTApiFunAddress(ulIndex,SSDTDescriptor); + NtDeleteKeyAddress = (pfnNtDeleteKey)SSDTFuncAddress; + + ulIndex = GetSSDTApiFunIndex("NtRenameKey"); + SSDTFuncAddress = GetSSDTApiFunAddress(ulIndex,SSDTDescriptor); + NtRenameKeyAddress = (pfnNtRenameKey)SSDTFuncAddress; + + ulIndex = GetSSDTApiFunIndex("NtDeleteValueKey"); + SSDTFuncAddress = GetSSDTApiFunAddress(ulIndex,SSDTDescriptor); + NtDeleteValueKeyAddress = (pfnNtDeleteValueKey)SSDTFuncAddress; + SYSTEM_ADDRESS_START = 0x80000000000; + break; + } + } +} + +PVOID GetFunctionAddressByName(WCHAR *wzFunction) +{ + UNICODE_STRING uniFunction; + PVOID AddrBase = NULL; + + if (wzFunction && wcslen(wzFunction) > 0) + { + RtlInitUnicodeString(&uniFunction, wzFunction); + AddrBase = MmGetSystemRoutineAddress(&uniFunction); + } + + return AddrBase; +} + + +ULONG_PTR GetKeServiceDescriptorTable64() +{ + PUCHAR StartSearchAddress = (PUCHAR)__readmsr(0xC0000082); + PUCHAR EndSearchAddress = StartSearchAddress + 0x500; + PUCHAR i = NULL; + UCHAR b1=0,b2=0,b3=0; + ULONG_PTR Temp = 0; + ULONG_PTR Address = 0; + for(i=StartSearchAddress;iOptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress){ + ExportTable =(IMAGE_EXPORT_DIRECTORY *)((ULONG_PTR)MapBase + NtHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress); + FunctionAddresses = (ULONG*)((ULONG_PTR)MapBase + ExportTable->AddressOfFunctions); + FunctionNames = (ULONG*)((ULONG_PTR)MapBase + ExportTable->AddressOfNames); + FunIndexs = (USHORT*)((ULONG_PTR)MapBase + ExportTable->AddressOfNameOrdinals); + for(i = 0; i < ExportTable->NumberOfNames; i++) + { + FunName = (LPSTR)((ULONG_PTR)MapBase + FunctionNames[i]); + if (_stricmp(FunName, lpszFunName) == 0) + { + ulFunIndex = FunIndexs[i]; + FunAddress = (ULONG_PTR)((ULONG_PTR)MapBase + FunctionAddresses[ulFunIndex]); + Index=*(ULONG*)(FunAddress+IndexOffset); + break; + } + } + } + }__except(EXCEPTION_EXECUTE_HANDLER) + { + ; + } + } + + if (Index == -1) + { + DbgPrint("%s Get Index Error\n", lpszFunName); + } + + ZwUnmapViewOfSection(NtCurrentProcess(), MapBase); + return Index; +} + + + + +NTSTATUS +MapFileInUserSpace(IN LPWSTR lpszFileName,IN HANDLE ProcessHandle OPTIONAL, + OUT PVOID *BaseAddress, + OUT PSIZE_T ViewSize OPTIONAL) +{ + NTSTATUS Status = STATUS_INVALID_PARAMETER; + HANDLE hFile = NULL; + HANDLE hSection = NULL; + OBJECT_ATTRIBUTES oa; + SIZE_T MapViewSize = 0; + IO_STATUS_BLOCK Iosb; + UNICODE_STRING uniFileName; + + if (!lpszFileName || !BaseAddress){ + return Status; + } + + RtlInitUnicodeString(&uniFileName, lpszFileName); + InitializeObjectAttributes(&oa, + &uniFileName, + OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, + NULL, + NULL + ); + + Status = IoCreateFile(&hFile, + GENERIC_READ | SYNCHRONIZE, + &oa, + &Iosb, + NULL, + FILE_ATTRIBUTE_NORMAL, + FILE_SHARE_READ, + FILE_OPEN, + FILE_SYNCHRONOUS_IO_NONALERT, + NULL, + 0, + CreateFileTypeNone, + NULL, + IO_NO_PARAMETER_CHECKING + ); + + if (!NT_SUCCESS(Status)) + { + DbgPrint("ZwCreateFile Failed! Error=%08x\n",Status); + return Status; + } + + oa.ObjectName = NULL; + Status = ZwCreateSection(&hSection, + SECTION_QUERY | SECTION_MAP_READ, + &oa, + NULL, + PAGE_WRITECOPY, + SEC_IMAGE, + hFile + ); + ZwClose(hFile); + if (!NT_SUCCESS(Status)) + { + DbgPrint("ZwCreateSection Failed! Error=%08x\n",Status); + return Status; + + } + + if (!ProcessHandle){ + ProcessHandle = NtCurrentProcess(); + } + + Status = ZwMapViewOfSection(hSection, + ProcessHandle, + BaseAddress, + 0, + 0, + 0, + ViewSize ? ViewSize : &MapViewSize, + ViewUnmap, + 0, + PAGE_WRITECOPY + ); + ZwClose(hSection); + if (!NT_SUCCESS(Status)) + { + DbgPrint("ZwMapViewOfSection Failed! Error=%08x\n",Status); + return Status; + } + + return Status; +} + + + + +ULONG_PTR GetSSDTApiFunAddress(ULONG_PTR ulIndex,ULONG_PTR SSDTDescriptor) +{ + ULONG_PTR SSDTFuncAddress = 0; + switch(WinVersion) + { + case WINDOWS_7: + { + SSDTFuncAddress = GetSSDTFunctionAddress64(ulIndex,SSDTDescriptor); + break; + } + + case WINDOWS_XP: + { + SSDTFuncAddress = GetSSDTFunctionAddress32(ulIndex,SSDTDescriptor); + break; + } + } +} + + +ULONG_PTR GetSSDTFunctionAddress32(ULONG_PTR ulIndex,ULONG_PTR SSDTDescriptor) +{ + ULONG_PTR ServiceTableBase= 0 ; + PSYSTEM_SERVICE_TABLE32 SSDT = (PSYSTEM_SERVICE_TABLE32)SSDTDescriptor; + + ServiceTableBase=(ULONG_PTR)(SSDT ->ServiceTableBase); + + return (ULONG_PTR)(((ULONG*)ServiceTableBase)[(ULONG)ulIndex]); +} + +ULONG_PTR GetSSDTFunctionAddress64(ULONG_PTR ulIndex,ULONG_PTR SSDTDescriptor) +{ + LONG dwTemp=0; + ULONG_PTR qwTemp=0; + ULONG_PTR ServiceTableBase= 0 ; + ULONG_PTR FuncAddress =0; + PSYSTEM_SERVICE_TABLE64 SSDT = (PSYSTEM_SERVICE_TABLE64)SSDTDescriptor; + ServiceTableBase=(ULONG_PTR)(SSDT ->ServiceTableBase); + qwTemp = ServiceTableBase + 4 * ulIndex; + dwTemp = *(PLONG)qwTemp; + dwTemp = dwTemp>>4; + FuncAddress = ServiceTableBase + (ULONG_PTR)dwTemp; + return FuncAddress; +} + + + diff --git a/Register/RegisterManagerDrv/RegisterManagerDrv.h b/Register/RegisterManagerDrv/RegisterManagerDrv.h new file mode 100644 index 0000000..bb97e74 --- /dev/null +++ b/Register/RegisterManagerDrv/RegisterManagerDrv.h @@ -0,0 +1,237 @@ +#pragma once + +#include +#include +#include +#define SEC_IMAGE 0x01000000 + +typedef struct _OPEN_ +{ + ACCESS_MASK DesiredAccess; + POBJECT_ATTRIBUTES ObjectAttributes; +}OPEN,*POPEN; + +typedef struct _ENUM_ +{ + HANDLE hKey; + ULONG Index; + ULONG InformationClass; + ULONG Length; +}ENUM,*PENUM; + +typedef struct _ENUM_VALUE_ +{ + PULONG RetLength; + PVOID ValueInfor; +}ENUM_VALUE, *PENUM_VALUE; + + +typedef struct _CREATE_ +{ + ACCESS_MASK DesiredAccess; + POBJECT_ATTRIBUTES ObjectAttributes; +}CREATE,*PCREATE; + + + +typedef struct _CREATE_VALUE_ +{ + PHANDLE KeyHandle; + PULONG Disposition; +}CREATE_VALUE, *PCREATE_VALUE; + +typedef struct _SET_KEY_VALUE_ +{ + HANDLE hKey; + PUNICODE_STRING ValueName; + ULONG Type; + PVOID Data; + ULONG DataSize; +}SET_KEY_VALUE,*PSET_KEY_VALUE; + + +typedef struct _DELETE_ +{ + HANDLE hKey; + +}*PDELETE; + + +typedef struct _DELETE_KEY_VALUE_ +{ + HANDLE hKey; + PUNICODE_STRING uniValueName; + +}DELETE_KEY_VALUE,*PDELETE_KEY_VALUE; + + +typedef struct _RENAME_ +{ + HANDLE hKey; + PUNICODE_STRING uniNewName; +}RENAME,*PRENAME; + + + +typedef enum WIN_VERSION { + WINDOWS_UNKNOW, + WINDOWS_XP, + WINDOWS_7, + WINDOWS_8, + WINDOWS_8_1 +} WIN_VERSION; + + +typedef struct _SYSTEM_SERVICE_TABLE64{ + PVOID ServiceTableBase; + PVOID ServiceCounterTableBase; + ULONG64 NumberOfServices; + PVOID ParamTableBase; +} SYSTEM_SERVICE_TABLE64, *PSYSTEM_SERVICE_TABLE64; + +typedef struct _SYSTEM_SERVICE_TABLE32 { + PVOID ServiceTableBase; + PVOID ServiceCounterTableBase; + ULONG32 NumberOfServices; + PVOID ParamTableBase; +} SYSTEM_SERVICE_TABLE32, *PSYSTEM_SERVICE_TABLE32; + +#define DEVICE_NAME L"\\Device\\RegisterManagerDevice" +#define LINK_NAME L"\\??\\RegisterManagerLink" + + +#define CTL_CREATE_KEY \ + CTL_CODE(FILE_DEVICE_UNKNOWN,0x833,METHOD_NEITHER,FILE_ANY_ACCESS) +#define CTL_OPEN_KEY \ + CTL_CODE(FILE_DEVICE_UNKNOWN,0x830,METHOD_NEITHER,FILE_ANY_ACCESS) +#define CTL_ENUM_KEY \ + CTL_CODE(FILE_DEVICE_UNKNOWN,0x831,METHOD_NEITHER,FILE_ANY_ACCESS) +#define CTL_ENUM_KEY_VALUE \ + CTL_CODE(FILE_DEVICE_UNKNOWN,0x832,METHOD_NEITHER,FILE_ANY_ACCESS) +#define CTL_SET_KEY_VALUE \ + CTL_CODE(FILE_DEVICE_UNKNOWN,0x834,METHOD_NEITHER,FILE_ANY_ACCESS) +#define CTL_DELETE_KEY \ + CTL_CODE(FILE_DEVICE_UNKNOWN,0x835,METHOD_NEITHER,FILE_ANY_ACCESS) +#define CTL_RENAME_KEY \ + CTL_CODE(FILE_DEVICE_UNKNOWN,0x836,METHOD_NEITHER,FILE_ANY_ACCESS) +#define CTL_DELETE_KEY_VALUE \ + CTL_CODE(FILE_DEVICE_UNKNOWN,0x837,METHOD_NEITHER,FILE_ANY_ACCESS) + +NTSYSAPI PIMAGE_NT_HEADERS NTAPI RtlImageNtHeader(PVOID Base); + +typedef NTSTATUS(NTAPI *pfnNtOpenKey)(PHANDLE KeyHandle, + ACCESS_MASK DesiredAccess, + POBJECT_ATTRIBUTES ObjectAttributes); + +typedef NTSTATUS(NTAPI *pfnNtEnumerateKey)( + HANDLE KeyHandle, + ULONG Index, + KEY_INFORMATION_CLASS KeyInformationClass, + PVOID KeyInformation, + ULONG Length, + PULONG ResultLength); + +typedef NTSTATUS(*pfnNtEnumerateValueKey)( + HANDLE KeyHandle, + ULONG Index, + KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass, + PVOID KeyValueInformation, + ULONG Length, + PULONG ResultLength); + + +typedef NTSTATUS (*pfnNtCreateKey)( + OUT PHANDLE KeyHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes, + IN ULONG TitleIndex, + IN PUNICODE_STRING Class OPTIONAL, + IN ULONG CreateOptions, + OUT PULONG Disposition OPTIONAL); + +typedef NTSTATUS (*pfnNtSetValueKey)( + IN HANDLE KeyHandle, + IN PUNICODE_STRING ValueName, + IN ULONG TitleIndex OPTIONAL, + IN ULONG Type, + IN PVOID Data, + IN ULONG DataSize); + +typedef NTSTATUS (*pfnNtDeleteKey)( + IN HANDLE KeyHandle); + +typedef NTSTATUS(*pfnNtRenameKey)( + IN HANDLE KeyHandle, + IN PUNICODE_STRING uniNewName); + +typedef NTSTATUS (*pfnNtDeleteValueKey)( + IN HANDLE KeyHandle, + IN PUNICODE_STRING uniValueName); + +VOID UnloadDriver(PDRIVER_OBJECT DriverObject); +NTSTATUS DefaultDispatch(PDEVICE_OBJECT DeviceObject,PIRP Irp); +NTSTATUS ControlDispatch(PDEVICE_OBJECT DeviceObject,PIRP Irp); + +typedef NTSTATUS (*pfnRtlGetVersion)(OUT PRTL_OSVERSIONINFOW lpVersionInformation); +PVOID GetFunctionAddressByName(WCHAR *wzFunction); +WIN_VERSION GetWindowsVersion(); +VOID SetGolbalMember(); +LONG GetSSDTApiFunIndex(IN LPSTR lpszFunName); +NTSTATUS MapFileInUserSpace(IN LPWSTR lpszFileName, + IN HANDLE ProcessHandle OPTIONAL, + OUT PVOID *BaseAddress, + OUT PSIZE_T ViewSize OPTIONAL); + +ULONG_PTR GetSSDTApiFunAddress(ULONG_PTR ulIndex,ULONG_PTR SSDTDescriptor); +ULONG_PTR GetSSDTFunctionAddress64(ULONG_PTR ulIndex,ULONG_PTR SSDTDescriptor); +ULONG_PTR GetSSDTFunctionAddress32(ULONG_PTR ulIndex,ULONG_PTR SSDTDescriptor); +ULONG_PTR GetKeServiceDescriptorTable64(); + +VOID RecoverPreMode(PETHREAD EThread, CHAR PreMode); +CHAR ChangePreMode(PETHREAD EThread); +NTSTATUS RegOpenKey(PVOID InBuffer,PVOID OutBuffer); +NTSTATUS KernelOpenKey(OUT PHANDLE KeyHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes); + +NTSTATUS RegEnumerateKey(PVOID InBuffer,PVOID OutBuffer); +NTSTATUS KernelEnumerateKey(IN HANDLE KeyHandle, + IN ULONG Index, + IN KEY_INFORMATION_CLASS KeyInformationClass, + OUT PVOID KeyInformation, + IN ULONG Length, + OUT PULONG ResultLength); + +NTSTATUS RegEnumerateValueKey(PVOID InBuffer,PVOID OutBuffer); +NTSTATUS KernelEnumerateValueKey(IN HANDLE KeyHandle, + IN ULONG Index, + IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass, + OUT PVOID KeyValueInformation, + IN ULONG Length, + OUT PULONG ResultLength); + +NTSTATUS RegCreateKey(PVOID InBuffer,PVOID OutBuffer); +NTSTATUS KernelCreateKey( + OUT PHANDLE KeyHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes, + IN ULONG TitleIndex, + IN PUNICODE_STRING Class OPTIONAL, + IN ULONG CreateOptions, + OUT PULONG Disposition OPTIONAL); +NTSTATUS RegSetValueKey(PVOID InBuffer,PVOID OutBuffer); +NTSTATUS KernelSetValueKey(IN HANDLE KeyHandle, + IN PUNICODE_STRING ValueName, + IN ULONG TitleIndex OPTIONAL, + IN ULONG Type, + IN PVOID Data, + IN ULONG DataSize); +NTSTATUS RegDeleteKey(PVOID InBuffer,PVOID OutBuffer); +NTSTATUS KernelDeleteKey( + IN HANDLE KeyHandle); +NTSTATUS RegRenameKey(PVOID InBuffer,PVOID OutBuffer); +NTSTATUS KernelRenameKey(IN HANDLE KeyHandle, IN PUNICODE_STRING uniNewName); +NTSTATUS RegDeleteValueKey(PVOID InBuffer,PVOID OutBuffer); +NTSTATUS KernelDeleteValueKey(IN HANDLE KeyHandle, + IN PUNICODE_STRING uniValueName); + diff --git a/Register/RegisterManagerDrv/RegisterManagerDrv.sln b/Register/RegisterManagerDrv/RegisterManagerDrv.sln new file mode 100644 index 0000000..48336fc --- /dev/null +++ b/Register/RegisterManagerDrv/RegisterManagerDrv.sln @@ -0,0 +1,16 @@ +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio 2010 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "RegisterManagerDrv", "RegisterManagerDrv.vcxproj", "{4EE67C57-BE79-4CD7-B3B0-94AECE62DB41}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + WinDDK|Win32 = WinDDK|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {4EE67C57-BE79-4CD7-B3B0-94AECE62DB41}.WinDDK|Win32.ActiveCfg = WinDDK|Win32 + {4EE67C57-BE79-4CD7-B3B0-94AECE62DB41}.WinDDK|Win32.Build.0 = WinDDK|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Register/RegisterManagerDrv/RegisterManagerDrv.suo b/Register/RegisterManagerDrv/RegisterManagerDrv.suo new file mode 100644 index 0000000000000000000000000000000000000000..131a38c564115cf38a1b5799d98180431d80d8cf GIT binary patch literal 9216 zcmeHMS!^3s6n$@&)1tKA_>8H#5O8@z_}eE%aK~ zZ<#mm-nZOy?|bv{*j3+*ys_q6kw@FaLUC?lskk(!-iAC`(v?CiK!)XW6B849r4Yzo zqzh;U{(!EFj5WLj>0&U~d?|Pdcm;SFcscko@a5nuz*v5{?p*tebm7iGyGY}w3A+f0 z6jD_TU}a0E)#8##o9F(qqK~^CTf3*}6Wc;GI>k){YJp)4f1C?e&V*NDD9WbH6adg4b3|0Xy$4E#DaVb z;MiA!uLiU2HAc$(b;w^2UIV@XycT>TcpdmAupN9ecs-cy%aCpa-vZtQ-VDAKd>fe0 z%aK+X`P-2?!7i}dsH-y4Y9rl>wARS;eR2cJ+l)FC|M&FJO<%1H*B-g^#679^j(#>g zim90q{p_Qsm;=!mxC%^3E4VxF@5=a0Tw(5O!9^Jh7UX%N6xFLzSV$QkW@m zQMM%!QPY`pOmlQ4GTBhFL(4`JX@^uHuBell&U8B2ok&H~`!f!INDFl)`ZA8TL@E^u zCly%;9MF_hCJ{~~6WV~Ijhbdq6H&G_%Z#G(y$&s{DjetXzv3y5eHO$)+yibBbs{KY z_deJf6!op6?e1qs9teuF$tQOAJUTLXsn*k#Uup-s#3jarMHacZ#Gr2Ap$7EnL8%z_ zQC&OmXEjp7IhT=j#fb66Dx(oGE?2%6IH*8}UZ7$ccu1dQrN?H-XDmWoDpfwQI#xhF z{SUFX4{{UGAZ00?Shc{$u~0V2=+-hZV=FewAO8+H=BVg^>@4Pjx>yn9%Xp1gU8;P> zbFJKdAl>WH`?O%zQ(%1`_)*i39aW6zGve49DmpZ^fwDRGf?`lXhNFzvv zcZB=8y7pQjoy;ZK^p>`!s zf26h)#-9P~$uO)YX{iG7PXeFuXW7_z$T-YwmoL8sE4mL-c@F7@)uyniDlk+Ybx_^Fu}<`Q};7 z4=mTf(~$%6=}+m?N|m3x|LA9lB<2|Pd5&S!an#cPm`|pYE(G@9jQ9TrboHHK_`6_Z zd*R3E>+;vQ3x2K`t%rP`y?6#Ib^JU{9x^%(r4UoAezo7xA34ycruPmt)dk02J^KAS zF9yGV`^5O;qdy*gbNu8;@Q350;}1V^c4YL-v5_-RKRo{Y=yX++xH8#q@b6WQ$k5QB z-x+WrWj;p7#TDA>Kc#K1AhuT_x(BsH;V7BU+Q!sPM|ZYeBJVxsQ@46~(=netIt-ue#|+#hhKy1rZeSdUU%e77d3N+- zJ)#)%U-M3UZj_!Zfpdj|nT!GR^l{UF>VD_%{nq1|6?KTR<$pA8dGg(zZ+!X6*wrt0 zU(qZs|8Pz6_oW+lJw5TrZ)2yA1o(clIJ0Wwr>||;(Dc^$x5Jyl`?wK69b#*2)#-Dm z*EJt`A$sh&bwAb4?0vnL+5hjhGs2(k>Al$LO+VvXwen%5cmtY|=OzVvIo}Iej}7;q z^4^f{yj1^_>wirwv3T^RW>8q%$W@s2f7KH~}ENU8E2XzMg^Xb<8kN)5@gM064} zbi1^=dC>KO|CMqno21uT|L2Z>CnAlgl%2wulh9^|j7WI0;f-)HnydVNSZ+V;lCy83 zC8y@!+>_JkRA?Tc>$2{lA6f@ae$jmV^=FQK6#lBQP}@@56?%WVdd?NO2Rxrh+fWb@ zr)ojFJ2VIUAZAB!+s62lH%>fnH5>L|6?dCj@cv2P`TD!U|yNupD35#SW1;&gSNcqB5|$@-~JW%AGFm7`k@WXhRP5t@C#(GTxS(2 z@A$e9bvY4V@ve?vcnZ_qV~i|jPX}%Pp6}J??xmL4eQM7(->)sHCELG#{}+Dw;!5Vy z?8jH^&HULf)$f}9uAPPb)#2sMMhE71R`dI72auF80KY-dGKzUXbN`#OW$I;>GNv@| kU##qpF^To=6N2%FDVwR4T=Ur-$Q(5b^N`L|ey+$r0hfx + + + + WinDDK + Win32 + + + + {4EE67C57-BE79-4CD7-B3B0-94AECE62DB41} + Win32Proj + "RegisterManagerDrv" + + + + + + + + .sys + false + $(WLHBASE)\bin\x86\x86;$(WLHBASE)\bin\x86 + $(WLHBASE)\inc\api;$(WLHBASE)\inc\crt;$(WLHBASE)\inc\ddk;$(WLHBASE)\inc + + $(WLHBASE)\lib\win7\i386 + + + + + + _X86_;DBG=1 + false + false + StdCall + CompileAsC + + + + + ntoskrnl.lib;hal.lib;wdm.lib;%(AdditionalDependencies) + + + true + Native + Driver + DriverEntry + true + 0x10000 + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Register/RegisterManagerDrv/RegisterManagerDrv.vcxproj.user b/Register/RegisterManagerDrv/RegisterManagerDrv.vcxproj.user new file mode 100644 index 0000000..ace9a86 --- /dev/null +++ b/Register/RegisterManagerDrv/RegisterManagerDrv.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/Register/RegisterManagerDrv/clean.bat b/Register/RegisterManagerDrv/clean.bat new file mode 100644 index 0000000..a92852f --- /dev/null +++ b/Register/RegisterManagerDrv/clean.bat @@ -0,0 +1,28 @@ +rem ///////////////// +rem / Add by ChiChou +rem / +rem / FileName:Clean.bat +rem / Description:Clean +rem / +rem //////////////// +rd .\bin /s /q +rd .\WinDDK /s /q +rd .\objchk_w2k_x86 /s /q +rd .\objchk_wxp_x86 /s /q +rd .\objchk_wnet_x86 /s /q +rd .\objchk_wlh_x86 /s /q +rd .\objfre_w2k_x86 /s /q +rd .\objfre_wxp_x86 /s /q +rd .\objfre_wnet_x86 /s /q +rd .\objfre_wlh_x86 /s /q +del .\*.log +del .\*.err +del .\*.xml +rem ***** del VS2005 file ***** +del .\*.ncb +del .\*.user +del .\*.suo /A:H +rem ***** del VS6.0 file ***** +del .\*.plg +del .\*.opt +exit \ No newline at end of file diff --git a/Register/RegisterManagerDrv/ddkbuild.cmd b/Register/RegisterManagerDrv/ddkbuild.cmd new file mode 100644 index 0000000..8acd7a4 --- /dev/null +++ b/Register/RegisterManagerDrv/ddkbuild.cmd @@ -0,0 +1,1122 @@ +@echo off +@set VERSION=V7.3 +@set OSR_DEBUG=off +@if "%OS%"=="Windows_NT" goto :Prerequisites +@echo This script requires Windows NT 4.0 or later to run properly! +goto :EOF +:Prerequisites +:: Check whether FINDSTR is available. It's used to show warnings etc. +findstr /? > NUL 2>&1 || echo "FINDSTR is a prerequisite but wasn't found!" && goto :EOF +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: +:: $Id: ddkbuild.cmd 27 2008-09-06 12:02:06Z oliver $ +:: +:: This software is supplied for instructional purposes only. +:: +:: OSR Open Systems Resources, Inc. (OSR) expressly disclaims any warranty +:: for this software. THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY +:: OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION, +:: THE IMPLIED WARRANTIES OF MECHANTABILITY OR FITNESS FOR A PARTICULAR +:: PURPOSE. THE ENTIRE RISK ARISING FROM THE USE OF THIS SOFTWARE REMAINS +:: WITH YOU. OSR's entire liability and your exclusive remedy shall not +:: exceed the price paid for this material. In no event shall OSR or its +:: suppliers be liable for any damages whatsoever (including, without +:: limitation, damages for loss of business profit, business interruption, +:: loss of business information, or any other pecuniary loss) arising out +:: of the use or inability to use this software, even if OSR has been +:: advised of the possibility of such damages. Because some states/ +:: jurisdictions do not allow the exclusion or limitation of liability for +:: consequential or incidental damages, the above limitation may not apply +:: to you. +:: +:: OSR Open Systems Resources, Inc. +:: 105 Route 101A Suite 19 +:: Amherst, NH 03031 (603) 595-6500 FAX: (603) 595-6503 +:: report bugs to +:: alternatively report them via +:: +:: +:: MODULE: +:: +:: ddkbuild.cmd +:: +:: ABSTRACT: +:: +:: This script allows drivers to be built with Visual Studio 2002 through +:: Visual Studio 2008 and possibly future versions. It will also work fine +:: from the command line. +:: If you are interested in a project wizard that makes use of this script, +:: try DDKWizard from . +:: +:: AUTHOR(S): +:: +:: - OSR Open Systems Resources, Inc. +:: - Oliver Schneider (ddkwizard.assarbad.net) +:: +:: REQUIREMENTS: +:: +:: Environment variables that must be set. +:: %NT4BASE% - Set this up for "-NT4" builds (legacy, support not tested) +:: %W2KBASE% - Set this up for "-W2K*" builds (legacy, support not tested) +:: %WXPBASE% - Set this up for "-WXP*" builds +:: %WNETBASE% - Set this up for "-WNET*" builds +:: %WLHBASE% - Set this up for "-WLH*" builds +:: %WDF_ROOT% - Must be set if attempting to do a WDF Build. +:: +:: Examples: +:: NT4BASE : could be "D:\NT4DDK" +:: W2KBASE : could be "D:\Nt50DDK" +:: WXPBASE : could be "D:\WINDDK\2600" +:: WNETBASE: could be "D:\WINDDK\3790.1830" or "C:\WINDDK\3790" +:: +:: COMMAND FORMAT: +:: +:: Run the script without any parameters to get the whole help content! +:: Note: "-WDF" has been tested with the 01.00.5054 version of the framework +:: +:: RETURN CODES AND THEIR MEANING: +:: +:: 001 == Unknown build type. Check the parameter +:: 002 == No WDF_ROOT given using WDF build type. +:: 003 == The DDK-specific base directory variable (NT4BASE, W2KBASE, WXPBASE, +:: WNETBASE) is not set at all and could not be auto-detected! +:: 004 == BASEDIR variable is empty. Check to see that the DDK-specific +:: variable is set correctly (i.e. NT4BASE, W2KBASE, WXPBASE, WNETBASE) +:: 005 == No mode (checked/free) was given. Check the respective parameter! +:: 006 == No DIR or SOURCES file found in the given target directory. +:: 007 == No target directory given. +:: 008 == Given target directory does not exist. +:: 009 == The SETENV script failed. +:: +:: Note: If %OSR_ERRCODE% and %ERRORLEVEL% are equal, the return code stems +:: from one of the tools being called during the build process. +:: +:: BROWSE FILES: +:: +:: This procedure supports the building of BROWSE files to be used by +:: Visual Studio 6 and by Visual Studio.NET However, the BSCfiles created +:: by bscmake for the two are not compatible. When this command procedure +:: runs, it selects the first bscmake.exe found in the path. So, make sure +:: that the correct bscmake.exe is in the path ... +:: +:: Note that if using Visual Studio.NET the .BSC must be added to the project +:: in order for the project to be browsed. +:: Another alternative is the VS addon named "Visual Assist X" which will +:: parse the header files - no more need for browse files. +:: +:: COMPILERS: +:: +:: If you are building NT4 you should really be using the VC6 compiler. +:: Later versions of the DDK now contain the compiler and the linker. This +:: procedure should use the correct compiler. +:: +:: GENERAL COMMENTS: +:: +:: This procedure has been cleaned up to be modular and easy to understand. +:: +:: As of the Server 2003 SP1 DDK DDKBUILD now clears the NO_BROWSE_FILE and +:: NO_BINPLACE environment variables so that users can use these features. +:: +:: Starting with the Vista WDK, the output in the respective tool window +:: in VS is in Unicode by default. This garbles the output from DDKBUILD +:: and we therefore clear the environment variable VS_UNICODE_OUTPUT. +:: +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: / MAIN function of the script +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:MAIN +:: Building "stack frame" +setlocal ENABLEEXTENSIONS & pushd . +:: Check whether the REG utility is available +reg /? > NUL 2>&1 && set OSR_REGAVAILABLE=1 + +:: This is set by client-side keyword substitution +set SVN_REVISION=$Revision: 27 $ +:: Extract the revision number from the revision keyword +set SVN_REVISION=%SVN_REVISION:~0,-2% +set SVN_REVISION=%SVN_REVISION:~11% +:: This is set by client-side keyword substitution +set SVN_REVDATE=$Date: 2008-09-06 12:02:06 +0000 (Sat, 06 Sep 2008) $ +:: Extract the date from the Date keyword +set SVN_REVDATE=%SVN_REVDATE:~7,10% +set VERSION=%VERSION%/r%SVN_REVISION% + +:: Init some special variables +set OSR_VERSTR=OSR DDKBUILD.CMD %VERSION% (%SVN_REVDATE%) - OSR, Open Systems Resources, Inc. +set OSR_PREBUILD_SCRIPT=ddkprebld.cmd +set OSR_POSTBUILD_SCRIPT=ddkpostbld.cmd +set OSR_SETENV_SCRIPT=ddkbldenv.cmd +set OSR_ECHO=@echo DDKBLD: + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: Set error messages +:: Possible codes: 1 +set ERR_UnknownBuildType=Unknown type of build. Please recheck parameters. +:: Possible codes: 2 +set ERR_NoWdfRoot=WDF_ROOT is not defined, are you using 00.01.5054 or later? +:: Possible codes: 3 +set ERR_BaseDirNotSet=To build using type %%OSR_TARGET%% you need to set the %%%%%%BASEDIRVAR%%%%%% environment variable to point to the %%BASEDIROS%% DDK base directory! +:: Possible codes: 4 +set ERR_NoBASEDIR=NT4BASE, W2KBASE, WXPBASE and/or WNETBASE environment variable(s) not set. Environment variable(s) must be set by user according to DDK version(s) installed. +:: Possible codes: 5 +set ERR_BadMode=^ must be 'checked', 'free', 'chk' or 'fre' (case-insensitive). +:: Possible codes: 6 +set ERR_NoTarget=Target directory must contain a SOURCES or DIRS file. +:: Possible codes: 7, 8 +set ERR_NoDir=The ^ parameter must be a valid directory. +:: Possible codes: 9 +set ERR_SetEnvFailed=The SETENV script failed. + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: Clear the error code variable +set OSR_ERRCODE=0 +set prefast_build=0 + +:: Turn on tracing, use %OSR_TRACE% instead of ECHO +if /i "%OSR_DEBUG%" == "on" (set OSR_TRACE=%OSR_ECHO% [TRACE]) else (set OSR_TRACE=rem) +:: Turn on echoing of current line if %OSR_DEBUG% is set to "on" +@echo %OSR_DEBUG% + +:: Output version string +@echo %OSR_VERSTR% +%OSR_TRACE% ^(Current module: ^"%~f0^"^) +@echo. + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: Set the target platform variable +set OSR_TARGET=%~1 +:: Remove any dashes in the variable +if not "%OSR_TARGET%" == "" set OSR_TARGET=%OSR_TARGET:-=% +:: Show help if the target parameter is empty after removal of the dashes +if "%OSR_TARGET%" == "" goto :USAGE + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: In the build directory check for this script and call it if it exists. +:: This allows to override any global system variable setting, if desired. +if not "%3" == "" call :GetCustomEnvironment "%~f3" +if not "%OSR_ERRCODE%" == "0" goto :USAGE +:: Additional error handling for better usability +:: These subroutines will also attempt to locate the requested DDK!!! +set OSR_ERRCODE=3 +%OSR_TRACE% Checking whether the environment variable for the build type was set +:: Calling as a subroutine has 2 advantages: +:: 1. the script does not quit if the label was not found +:: 2. we return to the line after the call and can check variables there +call :%OSR_TARGET%Check > NUL 2>&1 +:: If the BASEDIROS/BASEDIRVAR variable is not defined, it means the subroutine did not exist! +if not DEFINED BASEDIROS call :ShowErrorMsg 1 "%ERR_UnknownBuildType% (BASEDIROS)" & goto :USAGE +if not DEFINED BASEDIRVAR call :ShowErrorMsg 1 "%ERR_UnknownBuildType% (BASEDIRVAR)" & goto :USAGE +if not "%OSR_ERRCODE%" == "0" call :ShowErrorMsg %OSR_ERRCODE% "%ERR_BaseDirNotSet%" & goto :USAGE + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +set BASEDIR=%%%BASEDIRVAR%%% +call :ResolveVar BASEDIR +call :MakeShort BASEDIR "%BASEDIR%" +:: Check for existing %BASEDIR% +if "%BASEDIR%" == "" call :ShowErrorMsg 4 "%ERR_NoBASEDIR%" & goto :USAGE +set PATH=%BASEDIR%\bin;%PATH% +%OSR_TRACE% Now jump to the initialization of the commandline +:: Calling as a subroutine has 2 advantages: +:: 1. the script does not quit if the label was not found +:: 2. we return to the line after the call and can check variables there +call :%OSR_TARGET%Build + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +%OSR_TRACE% We returned from the variable initialization +if not DEFINED OSR_CMDLINE call :ShowErrorMsg 1 "%ERR_UnknownBuildType% (OSR_CMDLINE)" & goto :USAGE + +%OSR_TRACE% Hurrah, all the variables have been initialized, continuing +:: Proceed with common build steps +goto :CommonBuild + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: Check whether the parameter makes sense and try to +:: correct it if possible +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: These labels are for compatibility with the respective +:: modes supported by another flavor of DDKBUILD. +:WLH64Check +:WLHA64Check +:WLHXP64Check +:WLHNET64Check +:WLHNETA64Check +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:WLHCheck +:WLHX64Check +:WLHI64Check +:WLHNETX64Check +:WLHNETI64Check +:WLHXPCheck +:WLH2KCheck +:WLHNETCheck +set BASEDIROS=Windows Vista/Windows 2008 Server +set BASEDIRVAR=WLHBASE +:: Compatibility between BUILD and VS ... prevent pipes from being used +%OSR_ECHO% Clearing %%VS_UNICODE_OUTPUT%% ... +set VS_UNICODE_OUTPUT= +:: Return to caller if the BASEDIR is already defined (either customized or global) +if DEFINED %BASEDIRVAR% goto :CommonCheckNoErrorWithReturn +call :DetectBaseDirTemp "6001.18000 6000" +if DEFINED BASEDIRTEMP if exist "%BASEDIRTEMP%" goto :CommonCheckSetVarWithReturn +goto :CommonCheckErrorNotSupportedWithReturn + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: These labels are for compatibility with the respective +:: modes supported by another flavor of DDKBUILD. +:WNETW2KCheck +:WNETA64Check +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:WNET2KCheck +:WNETXPCheck +:WNETWXPCheck +:WNETXP64Check +:WNET64Check +:WNETI64Check +:WNETAMD64Check +:WNETX64Check +:WNETCheck +set BASEDIROS=Windows 2003 Server +set BASEDIRVAR=WNETBASE +:: Return to caller if the BASEDIR is already defined (either customized or global) +if DEFINED %BASEDIRVAR% goto :CommonCheckNoErrorWithReturn +call :DetectBaseDirTemp "3790.1830 3790.1218 3790" +if DEFINED BASEDIRTEMP if exist "%BASEDIRTEMP%" goto :CommonCheckSetVarWithReturn +goto :CommonCheckErrorNotDetectedWithReturn + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: These labels are for compatibility with the respective +:: modes supported by another flavor of DDKBUILD. +:XPCheck +:XP64Check +:XPW2KCheck +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:WXP64Check +:WXPI64Check +:WXPCheck +:WXP2KCheck +set BASEDIROS=Windows XP +set BASEDIRVAR=WXPBASE +:: Other flavor of DDKBUILD +if not DEFINED WXPBASE if DEFINED XPBASE set BASEDIRVAR=XPBASE +:: Return to caller if the BASEDIR is already defined (either customized or global) +if DEFINED %BASEDIRVAR% goto :CommonCheckNoErrorWithReturn +call :DetectBaseDirTemp "2600.1106 2600" +if DEFINED BASEDIRTEMP if exist "%BASEDIRTEMP%" goto :CommonCheckSetVarWithReturn +goto :CommonCheckErrorNotDetectedWithReturn + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:W2K64Check +:W2KI64Check +:W2KCheck +set BASEDIROS=Windows 2000 +set BASEDIRVAR=W2KBASE +:: Return to caller +if DEFINED %BASEDIRVAR% goto :CommonCheckNoErrorWithReturn +call :CommonCheckMsg2 +goto :CommonCheckErrorNotSupportedWithReturn + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:NT4Check +set BASEDIROS=Windows NT4 +set BASEDIRVAR=NT4BASE +:: Return to caller +if DEFINED %BASEDIRVAR% goto :CommonCheckNoErrorWithReturn +call :CommonCheckMsg2 +goto :CommonCheckErrorNotSupportedWithReturn + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:CommonCheckMsg1 +echo. +%OSR_ECHO% WARNING: %%%BASEDIRVAR%%% NOT SET! +%OSR_ECHO% Attempting to auto-detect the installation folder and set %%%BASEDIRVAR%%%. +%OSR_ECHO% (If this fails *you* will have to set it!) +goto :EOF + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:CommonCheckMsg2 +echo. +%OSR_ECHO% WARNING: +%OSR_ECHO% Auto-detection of the folder settings is not supported for the requested DDK. +%OSR_ECHO% Please set %%%BASEDIRVAR%%% yourself! +goto :EOF + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:CommonCheckSetVarWithReturn +%OSR_ECHO% Found! +echo. +set %BASEDIRVAR%=%BASEDIRTEMP% +set BASEDIRTEMP= +:: Tell the caller it was successful +:CommonCheckNoErrorWithReturn +set OSR_ERRCODE=0 +goto :EOF + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:CommonCheckErrorNotDetectedWithReturn +echo. +%OSR_ECHO% None of the usual default paths works. Set %%%BASEDIRVAR%%% manually! +:CommonCheckErrorNotSupportedWithReturn +goto :EOF + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: Initialize variables specific to the respective platform +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: +:: Valid parameters for setenv in different DDKs/WDKs: +:: +:: 2600 - "setenv [fre|chk] [64] [hal]" +:: 2600.1106 - "setenv [fre|chk] [64] [hal] [WXP|W2K]" +:: 3790 - "setenv [fre|chk] [64|AMD64] [hal] [WXP|WNET|W2K]" +:: 3790.1830 - "setenv [fre|chk] [64|AMD64] [hal] [WXP|WNET|W2K] [no_prefast] [bscmake]" +:: 6000 - "setenv [fre|chk] [64|AMD64] [hal] [WLH|WXP|WNET|W2K] [bscmake]" +:: 6001.18000 - "setenv [fre|chk] [64|x64] [hal] [WLH|WXP|WNET|W2K] [bscmake]" + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: NT 4.0 build using NT4 DDK +:NT4Build +set OSR_CMDLINE="%%BASEDIR%%\bin\setenv.bat" %%BASEDIR%% %%BuildMode%% "%%MSDEVDIR%%" +goto :EOF + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: W2K build for 32bit using WXP DDK +:XPW2KBuild +:WXP2KBuild +set OSR_CMDLINE="%%BASEDIR%%\bin\w2k\set2k.bat" %%BASEDIR%% %%BuildMode%% +goto :EOF + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: W2K build for 64bit (Intel) using W2K DDK +:W2K64Build +:W2KI64Build +set OSR_CMDLINE="%%BASEDIR%%\bin\setenv64.bat" %%BASEDIR%% %%BuildMode%% +goto :EOF + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: W2K build for 32bit using W2K DDK +:W2KBuild +set OSR_CMDLINE="%%BASEDIR%%\bin\setenv.bat" %%BASEDIR%% %%BuildMode%% +goto :EOF + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: WXP build for 64bit (Intel) using WXP DDK +:XP64Build +:WXP64Build +:WXPI64Build +set OSR_CMDLINE="%%BASEDIR%%\bin\setenv.bat" %%BASEDIR%% %%BuildMode%% 64 +goto :EOF + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: WXP build for 32bit using WXP DDK +:XPBuild +:WXPBuild +set OSR_CMDLINE="%%BASEDIR%%\bin\setenv.bat" %%BASEDIR%% %%BuildMode%% +goto :EOF + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: W2K build for 32bit using WNET DDK +:WNETW2KBuild +:WNET2KBuild +set OSR_CMDLINE="%%BASEDIR%%\bin\setenv.bat" %%BASEDIR%% W2K %%BuildMode%% +goto :EOF + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: WXP build for 32bit using WNET DDK +:WNETXPBuild +:WNETWXPBuild +set OSR_CMDLINE="%%BASEDIR%%\bin\setenv.bat" %%BASEDIR%% %%BuildMode%% WXP +goto :EOF + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: WXP build for 64bit using WNET DDK +:WNETXP64Build +set OSR_CMDLINE="%%BASEDIR%%\bin\setenv.bat" %%BASEDIR%% %%BuildMode%% 64 WXP +goto :EOF + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: WNET build for 64bit (Intel) using WNET DDK +:WNET64Build +:WNETI64Build +set OSR_CMDLINE="%%BASEDIR%%\bin\setenv.bat" %%BASEDIR%% %%BuildMode%% 64 WNET +goto :EOF + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: WNET build for 64bit (AMD) using WNET DDK +:WNETA64Build +:WNETAMD64Build +:WNETX64Build +set OSR_CMDLINE="%%BASEDIR%%\bin\setenv.bat" %%BASEDIR%% %%BuildMode%% AMD64 WNET +goto :EOF + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: WNET build for 32bit using WNET DDK +:WNETBuild +set OSR_CMDLINE="%%BASEDIR%%\bin\setenv.bat" %%BASEDIR%% %%BuildMode%% +goto :EOF + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: WLH build for 32bit using WLH DDK +:WLHBuild +set OSR_CMDLINE="%%BASEDIR%%\bin\setenv.bat" %%BASEDIR%% %%BuildMode%% WLH +goto :EOF + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: WLH build for 64bit (AMD) using WLH DDK +:WLHA64Build +:WLHX64Build +call :DetectVistaWDK +set OSR_CMDLINE="%%BASEDIR%%\bin\setenv.bat" %%BASEDIR%% %%BuildMode%% %OSR_AMD64FLAG% WLH +goto :EOF + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: WLH build for 64bit (Intel) using WLH DDK +:WLH64Build +:WLHI64Build +set OSR_CMDLINE="%%BASEDIR%%\bin\setenv.bat" %%BASEDIR%% %%BuildMode%% 64 WLH +goto :EOF + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: WNET build for 64bit (AMD) using WLH DDK +:WLHNETA64Build +:WLHNETX64Build +call :DetectVistaWDK +set OSR_CMDLINE="%%BASEDIR%%\bin\setenv.bat" %%BASEDIR%% %%BuildMode%% %OSR_AMD64FLAG% WNET +goto :EOF + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: WNET build for 64bit (Intel) using WLH DDK +:WLHNET64Build +:WLHNETI64Build +set OSR_CMDLINE="%%BASEDIR%%\bin\setenv.bat" %%BASEDIR%% %%BuildMode%% 64 WNET +goto :EOF + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: WXP build for 32bit using WLH DDK +:WLHXPBuild +set OSR_CMDLINE="%%BASEDIR%%\bin\setenv.bat" %%BASEDIR%% %%BuildMode%% WXP +goto :EOF + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: WXP build for 64bit (Intel) using WLH DDK +:WLHXP64Build +set OSR_CMDLINE="%%BASEDIR%%\bin\setenv.bat" %%BASEDIR%% %%BuildMode%% 64 WXP +goto :EOF + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: W2K build for 32bit using WLH DDK +:WLH2KBuild +set OSR_CMDLINE="%%BASEDIR%%\bin\setenv.bat" %%BASEDIR%% %%BuildMode%% W2K +goto :EOF + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: WNET build for 32bit using WLH DDK +:WLHNETBuild +set OSR_CMDLINE="%%BASEDIR%%\bin\setenv.bat" %%BASEDIR%% %%BuildMode%% WNET +goto :EOF + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: All builds go here for the rest of the procedure. Now, +:: we are getting ready to call build. The big problem +:: here is to figure our the name of the buildxxx files +:: being generated for the different platforms. +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +:CommonBuild +:: Remove first command line arg +shift +call :SetMode %1 +if not "%OSR_ERRCODE%" == "0" call :ShowErrorMsg %OSR_ERRCODE% "%ERR_BadMode%" & goto :USAGE +set OSR_BUILDNAME=%OSR_TARGET% (%BuildMode%) using the %BASEDIROS% DDK and %%%BASEDIRVAR%%% + +call :CheckTargets %2 +if "%OSR_ERRCODE%" == "6" call :ShowErrorMsg %OSR_ERRCODE% "%ERR_NoTarget%" & goto :USAGE +if not "%OSR_ERRCODE%" == "0" call :ShowErrorMsg %OSR_ERRCODE% "%ERR_NoDir%" & goto :USAGE + +:: Resolve any variables in the command line string +call :ResolveVar OSR_CMDLINE + +pushd . +set ERRORLEVEL=0 +:: This external script prepares the build environment (e.g. setenv.bat) +call %OSR_CMDLINE% +:: Will only work with newer SETENV.BAT versions, but will be helpful in this case. +if not "%ERRORLEVEL%" == "0" call :ShowErrorMsg 9 "%ERR_SetEnvFailed%" & goto :USAGE +popd + +:: ---------------------------------------------------------------------------- +:: Setting global variables for the scope of this CMD session +set NO_BROWSER_FILE= +set NO_BINPLACE= +set buildDirectory=%~fs2 +call :MakeShort buildDirectory "%buildDirectory%" +set buildDirectory_raw=%2 +set buildDirectory_fname=%~n2 +%OSR_TRACE% buildDirectory == %buildDirectory% +%OSR_TRACE% buildDirectory_raw == %buildDirectory_raw% +%OSR_TRACE% buildDirectory_fname == %buildDirectory_fname% + +set mpFlag=-M +if "%BUILD_ALT_DIR%" == "" goto :NT4 + +:: W2K sets this! +set OSR_EXT=%BUILD_ALT_DIR% +set mpFlag=-MI + +:NT4 +if "%NUMBER_OF_PROCESSORS%" == "" set mpFlag= +if "%NUMBER_OF_PROCESSORS%" == "1" set mpFlag= + +:: Set additional variables at this point or do whatever you please +@if exist "%buildDirectory%\%OSR_PREBUILD_SCRIPT%" @( + %OSR_ECHO% ^>^> Performing pre-build steps [%OSR_PREBUILD_SCRIPT%] ... + pushd "%buildDirectory%" + call "%OSR_PREBUILD_SCRIPT%" > "%TEMP%\%OSR_PREBUILD_SCRIPT%.tmp" + for /f "tokens=*" %%x in ('type "%TEMP%\%OSR_PREBUILD_SCRIPT%.tmp"') do @( + %OSR_ECHO% %%x + ) + if exist "%TEMP%\%OSR_PREBUILD_SCRIPT%.tmp" del /f /q "%TEMP%\%OSR_PREBUILD_SCRIPT%.tmp" + popd + %OSR_ECHO% ^<^< Finished pre-build steps [%OSR_PREBUILD_SCRIPT%] ... +) +:: Save the current directory (before changing into the build directory!) +:: AFTERPREBUILD +pushd . + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: Determine the settings of flags, WDF and PREFAST in +:: other words what was set for %3 and beyond.... +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +%OSR_ECHO% %OSR_BUILDNAME% +set OSR_ARGS= + argument(s): +if not "%3" == "" set OSR_ARGS=%OSR_ARGS% %3 +if not "%4" == "" set OSR_ARGS=%OSR_ARGS% %4 +if not "%5" == "" set OSR_ARGS=%OSR_ARGS% %5 +if /i "%OSR_ARGS%" == " + argument(s):" set OSR_ARGS= +%OSR_ECHO% Directory: %buildDirectory%%OSR_ARGS% +%OSR_ECHO% %BASEDIRVAR%: %BASEDIR% + +cd /D %~s2 +set bFlags=-Ze +set bscFlags= + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:ContinueParsing +if "%3" == "" goto :DONE +if "%3" == "/a" goto :RebuildallFound +if /i "%3" == "-WDF" goto :WDFFound +if /i "%3" == "-PREFAST" goto :PrefastFound +set bscFlags=/n +set bFlags=%bFlags% %3 +:: Remove next arg +shift +goto :ContinueParsing + +:WDFFound +shift +:: Note, that the setwdf.bat is called from setenv.bat in the WDK, +:: therefore we skip it. +if /i "%BASEDIRVAR%" == "WLHBASE" goto :WDFOkay +if "%WDF_ROOT%" == "" call :ShowErrorMsg 2 "%ERR_NoWdfRoot%" & goto :USAGE +pushd . +if exist "%WDF_ROOT%\set_wdf_env.cmd" call "%WDF_ROOT%\set_wdf_env.cmd" +popd +:WDFOkay +goto :ContinueParsing + +:PrefastFound +shift +set prefast_build=1 +goto :ContinueParsing + +:RebuildallFound +shift +set bscFlags=/n +set bFlags=%bFlags:-Ze=-cfeZ% +set bFlags=%bFlags: -cZ=% +goto :ContinueParsing +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +:DONE +for %%x in (build%OSR_EXT%.err build%OSR_EXT%.wrn build%OSR_EXT%.log prefast%OSR_EXT%.log) do @( + if exist "%%x" del /f /q "%%x" +) + +if not "%prefast_build%" == "0" goto :RunPrefastBuild +%OSR_ECHO% Run build %mpFlag% %bFlags% for %BuildMode% version in %buildDirectory_raw% +pushd . +build %mpFlag% %bFlags% +popd +goto :BuildComplete + +:RunPrefastBuild +%OSR_ECHO% Run prefast build %mpFlag% %bFlags% for %BuildMode% version in %buildDirectory_raw% +setlocal ENABLEEXTENSIONS & pushd . +set PREFASTLOG=PREfast_defects_%OSR_EXT%.xml +prefast /log=%PREFASTLOG% /reset build %mpFlag% %bFlags% > NUL 2>&1 +if "%errorlevel%" GTR "0" set OSR_ERRCODE=%errorlevel% +prefast /log=%PREFASTLOG% list > prefast%OSR_EXT%.log +%OSR_ECHO% The PREfast logfile is ^"%prefastlog%^"! +popd & endlocal + +:BuildComplete +if not "%errorlevel%" == "0" set OSR_ERRCODE=%errorlevel% + +@echo %OSR_DEBUG% +:: Assume that the onscreen errors are complete! +setlocal +set WARNING_FILE_COUNT=0 +if exist "build%OSR_EXT%.log" for /f "tokens=*" %%x in ('findstr "warning[^.][DRCLU][0-9][0-9]* error[^.][DRCLU][0-9][0-9]*" "build%OSR_EXT%.log"') do @( + set /a WARNING_FILE_COUNT=%WARNING_FILE_COUNT%+1 +) +if not "%WARNING_FILE_COUNT%" == "0" ( + %OSR_ECHO% ================ Build warnings ======================= + if exist "build%OSR_EXT%.log" for /f "tokens=*" %%x in ('findstr "warning[^.][DRCLU][0-9][0-9]* error[^.][DRCLU][0-9][0-9]*" "build%OSR_EXT%.log"') do @( + @echo %%x + ) +) +set WARNING_FILE_COUNT_PRE=0 +if exist "prefast%OSR_EXT%.log" for /f "tokens=*" %%x in ('findstr "warning[^.][CLU]*" "prefast%OSR_EXT%.log"') do @( + set /a WARNING_FILE_COUNT_PRE=%WARNING_FILE_COUNT_PRE%+1 +) +:: Reset if this is no PREfast build +if "%prefast_build%" == "0" set WARNING_FILE_COUNT_PRE=0 +if not "%WARNING_FILE_COUNT_PRE%" == "0" ( + %OSR_ECHO% =============== PREfast warnings ====================== + if exist "prefast%OSR_EXT%.log" for /f "tokens=*" %%x in ('findstr "warning[^.][CLU]*" "prefast%OSR_EXT%.log"') do @( + @echo %%x + ) +) +set /a WARNING_FILE_COUNT=%WARNING_FILE_COUNT%+%WARNING_FILE_COUNT_PRE% +if not "%WARNING_FILE_COUNT%" == "0" ( + %OSR_ECHO% ======================================================= +) +endlocal +@echo. +%OSR_ECHO% Build complete +%OSR_ECHO% Building browse information files +if exist "buildbrowse.cmd" call "buildbrowse.cmd" & goto :postBuildSteps +set sbrlist=sbrList.txt +if not exist sbrList%CPU%.txt goto :sbrDefault +set sbrlist=sbrList%CPU%.txt + +:sbrDefault +if not exist %sbrlist% goto :postBuildSteps +:: Prepend blank space +if not "%bscFlags%" == "" set bscFlags= %bscFlags% +:: bscmake%bscFlags% prevents a double blank space ... +bscmake%bscFlags% @%sbrlist% + +:: Perform whatever post-build steps +:postBuildSteps +:: Restore the current directory (after changing into the build directory!) +:: Search upwards for "AFTERPREBUILD" to find the corresponding PUSHD +popd +@if exist "%buildDirectory%\%OSR_POSTBUILD_SCRIPT%" @( + %OSR_ECHO% ^>^> Performing post-build steps [%OSR_POSTBUILD_SCRIPT%] ... + pushd "%buildDirectory%" + call "%OSR_POSTBUILD_SCRIPT%" > "%TEMP%\%OSR_POSTBUILD_SCRIPT%.tmp" + for /f "tokens=*" %%x in ('type "%TEMP%\%OSR_POSTBUILD_SCRIPT%.tmp"') do @( + %OSR_ECHO% %%x + ) + if exist "%TEMP%\%OSR_POSTBUILD_SCRIPT%.tmp" del /f /q "%TEMP%\%OSR_POSTBUILD_SCRIPT%.tmp" + popd + %OSR_ECHO% ^<^< Finished post-build steps [%OSR_POSTBUILD_SCRIPT%] ... +) +goto :END +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: \ MAIN function of the script +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: / GetCustomEnvironment +:: First parameter is the "directory" that supposedly contains the SOURCES +:: or DIRS file (and the build scripts) +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:GetCustomEnvironment +pushd . +call :CheckTargets "%~f1" +@if not "%OSR_ERRCODE%" == "0" @( + echo. + %OSR_ECHO% The target directory seemed to not contain a DIRS or SOURCES file + %OSR_ECHO% when trying to set a custom environment! Quitting. + set buildDirectory=%~f1 + if "%OSR_ERRCODE%" == "6" call :ShowErrorMsg %OSR_ERRCODE% "%ERR_NoTarget%" & goto :GetCustomEnvironment_ret + call :ShowErrorMsg %OSR_ERRCODE% "%ERR_NoDir%" & goto :GetCustomEnvironment_ret + goto :GetCustomEnvironment_ret +) +:: If the user provided a script to customize the environment, execute it. +@if exist "%~f1\%OSR_SETENV_SCRIPT%" @( + %OSR_ECHO% ^>^> Setting custom environment variables [%OSR_SETENV_SCRIPT%] ... + pushd "%~f1" + call "%OSR_SETENV_SCRIPT%" > "%TEMP%\%OSR_SETENV_SCRIPT%.tmp" + for /f "tokens=*" %%x in ('type "%TEMP%\%OSR_SETENV_SCRIPT%.tmp"') do @( + %OSR_ECHO% %%x + ) + if exist "%TEMP%\%OSR_SETENV_SCRIPT%.tmp" del /f /q "%TEMP%\%OSR_SETENV_SCRIPT%.tmp" + popd + %OSR_ECHO% ^<^< Finished setting custom environment variables [%OSR_SETENV_SCRIPT%] ... +) +:GetCustomEnvironment_ret +popd +goto :EOF +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: \ GetCustomEnvironment +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: / SetMode +:: Subroutine to validate the mode of the build passed in. It must be free, +:: FREE, fre, FRE or checked, CHECKED, chk, CHK. Anything else is an error. +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:SetMode +set BuildMode= +if /i "%OSR_TARGET%" == "WLH2K" goto :SetModeWLH2K +for %%f in (free fre) do if /i "%%f" == "%1" set BuildMode=free +for %%f in (checked chk) do if /i "%%f" == "%1" set BuildMode=checked +goto :SetModeCommonEnd +:SetModeWLH2K +for %%f in (free fre) do if /i "%%f" == "%1" set BuildMode=f +for %%f in (checked chk) do if /i "%%f" == "%1" set BuildMode=c +:SetModeCommonEnd +%OSR_TRACE% Mode set to ^"%BuildMode%^" +if "%BuildMode%" == "" set OSR_ERRCODE=5 +goto :EOF +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: \ SetMode +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: / CheckTargets subroutine +:: Subroutine to validate that the target directory exists and that there is +:: either a DIRS or SOURCES and MakeFile in it. +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:CheckTargets +:: Building "stack frame" +setlocal & pushd . & set OSR_ERRCODE=0 +set lTarget=%~1 +if not "%lTarget%" == "" goto :CheckTargets1 +set OSR_ERRCODE=7 +goto :CheckTargets_ret +:CheckTargets1 +if exist "%lTarget%" goto :CheckTargets2 +set OSR_ERRCODE=8 +goto :CheckTargets_ret +:CheckTargets2 +if not exist "%lTarget%\DIRS" goto :CheckTargets3 +set OSR_ERRCODE=0 +goto :CheckTargets_ret +:CheckTargets3 +if exist "%lTarget%\SOURCES" goto :CheckTargets4 +set OSR_ERRCODE=6 +goto :CheckTargets_ret +:CheckTargets4 +if exist "%lTarget%\MAKEFILE" goto :CheckTargets5 +set OSR_ERRCODE=6 +goto :CheckTargets_ret +:CheckTargets5 +set OSR_ERRCODE=0 +:CheckTargets_ret +:: Cleaning "stack frame" and returning error code into global scope +popd & endlocal & set OSR_ERRCODE=%OSR_ERRCODE% +goto :EOF +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: \ CheckTargets subroutine +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: / ResolveVar subroutine +:: There is only one parameter, the name of the variable to be resolved! +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:ResolveVar +:: Get the name of the variable we are working with +setlocal ENABLEEXTENSIONS & set VAR_NAME=%1 +set VAR_TEMPRET2=%%%VAR_NAME%%% +:ResolveVarLoop +set VAR_TEMPRET1=%VAR_TEMPRET2% +set VAR_TEMPRET2=%VAR_TEMPRET1% +for /f "tokens=*" %%i in ('echo %VAR_TEMPRET1%') do ( + set VAR_TEMPRET2=%%i +) +if not "%VAR_TEMPRET1%" == "%VAR_TEMPRET2%" goto :ResolveVarLoop +:: Re-export the variable out of the local scope +endlocal & set %VAR_NAME%=%VAR_TEMPRET1% +goto :EOF +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: \ ResolveVar subroutine +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: / MakeShort subroutine +:: Two parameters. First parameter is the variable name, second is the path +:: to convert into a short filename. +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:MakeShort +setlocal ENABLEEXTENSIONS +:: Get the name of the variable we are working with and the path to convert +set VAR_NAME=%~1 +set PATH_SHORT=%~dpns2 +set PATH_EXTSHORT=%~xs2 +if not "" == "%PATH_EXTSHORT%" set PATH_EXTSHORT=%PATH_EXTSHORT:~0,4% +set PATH_SHORT=%PATH_SHORT%%PATH_EXTSHORT% +endlocal & set %VAR_NAME%=%PATH_SHORT% +goto :EOF +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: \ MakeShort subroutine +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: / ErrorWithUsage subroutine +:: This one will take the passed in parameters and build a nice error +:: message which is returned to the user along with the usage hints. +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:ShowErrorMsg +@set OSR_ERRCODE=%~1 +@set OSR_ERRMSG=%~2 +@set OSR_ERRMSG=%OSR_ERRMSG:'="% +@set OSR_ERRMSG=ERROR #%OSR_ERRCODE%: %OSR_ERRMSG% +@echo. +%OSR_ECHO% %OSR_ERRMSG% +if DEFINED buildDirectory %OSR_ECHO% -^> Target directory: %buildDirectory% +goto :EOF +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: \ ErrorWithUsage subroutine +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: / SetVar subroutine +:: Param1 == name of the variable, Param2 == value to be set for the variable +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:SetVar +:: Get the name of the variable we are working with +setlocal ENABLEEXTENSIONS & set VAR_NAME=%1 +endlocal & set %VAR_NAME%=%~2 +goto :EOF +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: \ SetVar subroutine +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: / DetectVistaWDK subroutine +:: No parameters expected +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:DetectVistaWDK +setlocal ENABLEEXTENSIONS +:: Newer flag (starting with W2K8) is default +set OSR_AMD64FLAG=x64 +:: The Vista WDK accepted *only* "AMD64", the newer W2K8 WDK accepts only "x64" +:: We detect the older one by checking the setenv.bat for a certain string +findstr /C:"Windows Server Longhorn" "%BASEDIR%\bin\setenv.bat" > NUL 2>&1 && set OSR_AMD64FLAG=AMD64 +endlocal & set OSR_AMD64FLAG=%OSR_AMD64FLAG% +goto :EOF +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: \ DetectVistaWDK subroutine +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: / DetectBaseDirTemp subroutine +:: The first parameter is the list of directory names to check, separated by +:: blank spaces. +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:DetectBaseDirTemp +:: Get the name of the variable we are working with +if "%~1" == "" goto :EOF +setlocal ENABLEEXTENSIONS +call :CommonCheckMsg1 +:: Try to find an installed DDK/WDK from the registry keys +if DEFINED OSR_REGAVAILABLE if not "%OSR_REGAVAILABLE%" == "0" ( + for %%i in (%~1) do @( + call :RegTryBaseDirTemp "%%i" + ) +) +:: Try all the "default" locations +if not DEFINED BASEDIRTEMP ( + for %%i in (%~1) do @( + for %%a in (WINDDK DDK) do @( + call :BruteTryBaseDirTemp "%SystemDrive%\%%a\%%i" + call :BruteTryBaseDirTemp "%ProgramFiles%\%%a\%%i" + ) + ) +) +endlocal & set BASEDIRTEMP=%BASEDIRTEMP% +goto :EOF +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: \ DetectBaseDirTemp subroutine +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: / RegTryBaseDirTemp subroutine +:: Attempt to find the install key in the registry. +:: This functions tests old-style DDKs and new-style WDKs. +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:RegTryBaseDirTemp +if DEFINED BASEDIRTEMP if exist "%BASEDIRTEMP%" goto :EOF +setlocal ENABLEEXTENSIONS +call :RegTryBaseDirTempSingle "%~1" "LFNDirectory" BASEDIRTEMP +if DEFINED BASEDIRTEMP if exist "%BASEDIRTEMP%" goto :RegTryBaseDirTemp_EOF +call :RegTryBaseDirTempSingle "%~1\Setup" "BUILD" BASEDIRTEMP +if DEFINED BASEDIRTEMP if exist "%BASEDIRTEMP%" goto :RegTryBaseDirTemp_EOF +if not DEFINED BASEDIRTEMP (endlocal & goto :EOF) +:RegTryBaseDirTemp_EOF +%OSR_ECHO% Found directory (%BASEDIRTEMP%) from install key +endlocal & set BASEDIRTEMP=%BASEDIRTEMP% & goto :EOF +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: \ RegTryBaseDirTemp subroutine +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: / RegTryBaseDirTempSingle subroutine +:: Attempt to find the install key in the registry. +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:RegTryBaseDirTempSingle +setlocal ENABLEEXTENSIONS +set REGSUBKEY=%~1 +set REGVALUE=%~2 +set VARIABLETOSET=%~3 +set REGMAINKEY=HKLM\SOFTWARE\Microsoft\WINDDK +:: Test whether we can read the value below this key +reg query "%REGMAINKEY%\%REGSUBKEY%" /v "%REGVALUE%" > NUL 2>&1 || goto :RegTryBaseDirTempSingle_WOW64 +for /f "tokens=2*" %%i in ('reg query "%REGMAINKEY%\%REGSUBKEY%" /v "%REGVALUE%"^|findstr /C:"%REGVALUE%"') do @( + call :SetVar _SETVARIABLE "%%j" +) +endlocal & set %VARIABLETOSET%=%_SETVARIABLE% +:RegTryBaseDirTempSingle_WOW64 +set REGMAINKEY=HKLM\SOFTWARE\Wow6432Node\Microsoft\WINDDK +:: Test whether we can read the value below this key +reg query "%REGMAINKEY%\%REGSUBKEY%" /v "%REGVALUE%" > NUL 2>&1 || goto :RegTryBaseDirTempSingle_EOF +for /f "tokens=2*" %%i in ('reg query "%REGMAINKEY%\%REGSUBKEY%" /v "%REGVALUE%"^|findstr /C:"%REGVALUE%"') do @( + call :SetVar _SETVARIABLE "%%j" +) +endlocal & set %VARIABLETOSET%=%_SETVARIABLE% +:RegTryBaseDirTempSingle_EOF +endlocal +goto :EOF +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: \ RegTryBaseDirTempSingle subroutine +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: / BruteTryBaseDirTemp subroutine +:: Brute-force test the given directory. +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:BruteTryBaseDirTemp +if DEFINED BASEDIRTEMP if exist "%BASEDIRTEMP%" goto :EOF +setlocal ENABLEEXTENSIONS +:: We will not overwrite BASETEMPDIR if it has been set and is valid +:: Just try +set BASEDIRTEMP=%~1 +%OSR_ECHO% Trying %BASEDIRTEMP% ... +if not exist "%BASEDIRTEMP%" (endlocal & goto :EOF) +endlocal & set BASEDIRTEMP=%BASEDIRTEMP% & goto :EOF +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: \ BruteTryBaseDirTemp subroutine +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: Usage output +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:USAGE +@echo. +@echo USAGE: +@echo ====== +@echo %~n0 ^ ^ ^ [flags] [-WDF] [-PREFAST] +@echo. +@echo Values for ^: +@echo -------------------------------------------------------------------------- +@echo Target platform and OS ^| Miscellaneous +@echo --------------------------^|----------------------------------------------- +@echo Target ^| Windows ^| CPU ^| Base directory ^| Target alias(es) +@echo ------------^|-------------^|---------^|----------------^|-------------------- +@echo -W2K ^| 2000 ^| x86 ^| %%W2KBASE%% ^| +@echo -W2K64 ^| 2000 ^| Itanium ^| %%W2KBASE%% ^| -W2KI64 +@echo -WXP ^| XP ^| x86 ^| %%WXPBASE%% ^| -XP +@echo -WXP64 ^| XP ^| Itanium ^| %%WXPBASE%% ^| -WXPI64, -XP64 +@echo -WXP2K ^| 2000 ^| x86 ^| %%WXPBASE%% ^| -XPW2K +@echo -WNET ^| 2003 ^| x86 ^| %%WNETBASE%% ^| +@echo -WNET64 ^| 2003 ^| Itanium ^| %%WNETBASE%% ^| -WNETI64 +@echo -WNETXP ^| XP ^| x86 ^| %%WNETBASE%% ^| +@echo -WNETXP64 ^| XP ^| Itanium ^| %%WNETBASE%% ^| +@echo -WNETAMD64 ^| 2003/XP x64 ^| x64 ^| %%WNETBASE%% ^| -WNETX64, -WNETA64 +@echo -WNET2K ^| 2000 SP3 ^| x86 ^| %%WNETBASE%% ^| -WNETW2K +@echo -WLH ^| Vista/2008 ^| x86 ^| %%WLHBASE%% ^| +@echo -WLH2K ^| 2000 SP4 ^| x86 ^| %%WLHBASE%% ^| +@echo -WLHXP ^| XP ^| x86 ^| %%WLHBASE%% ^| +@echo -WLHXP64 ^| XP ^| Itanium ^| %%WLHBASE%% ^| +@echo -WLHNET ^| 2003 ^| x86 ^| %%WLHBASE%% ^| +@echo -WLHNETI64 ^| 2003 ^| Itanium ^| %%WLHBASE%% ^| -WLHNET64 +@echo -WLHNETX64 ^| 2003/XP x64 ^| x64 ^| %%WLHBASE%% ^| -WLHNETA64 +@echo -WLHI64 ^| Vista/2008 ^| Itanium ^| %%WLHBASE%% ^| -WLH64 +@echo -WLHX64 ^| Vista/2008 ^| x64 ^| %%WLHBASE%% ^| -WLHA64 +@echo -NT4 ^| NT 4.0 ^| x86 ^| %%NT4BASE%% ^| +@echo -------------------------------------------------------------------------- +@echo Support for NT4 and W2K DDKs is deprecated and not checked anymore +@echo in new versions. It may or may not work properly. +@echo -------------------------------------------------------------------------- +@echo. +@echo Values for ^: +@echo checked, chk indicates a checked build +@echo free, fre indicates a free build +@echo. +@echo Remaining parameters ("opt!" = optional parameter): +@echo ^ path to build directory, try . (current directory) +@echo [flags] opt! any flags you think should be passed to build (try /a +@echo for clean) +@echo -WDF opt! performs a WDF build +@echo -PREFAST opt! performs a PREFAST build +@echo. +@echo Special files: +@echo The build target directory (where the DIRS or SOURCES file resides) can +@echo contain the following files: +@echo - %OSR_PREBUILD_SCRIPT% +@echo Allows to include a step before the BUILD tool from the DDK is called +@echo but after the environment for the respective DDK has been set! +@echo - %OSR_POSTBUILD_SCRIPT% +@echo Allows to include a step after the BUILD tool from the DDK is called, +@echo so the environment is still available to the script. +@echo - %OSR_SETENV_SCRIPT% +@echo Allows to set (or override) _any_ environment variables that may exist +@echo in the global environment. Thus you can set the base directory for the +@echo DDK from inside this script, making your project more self-contained. +@echo. +@echo DDKBUILD will only handle those files which exist, so you may choose to +@echo use none, one or multiple of these script files. +@echo (All scripts execute inside their current directory. Consider this!) +@echo. +@echo Examples: +@echo ^"%~n0 -NT4 checked .^" (for NT4 BUILD) +@echo ^"%~n0 -WXP64 chk .^" +@echo ^"%~n0 -WXP chk c:\projects\myproject^" +@echo ^"%~n0 -WNET64 chk .^" (IA64 build) +@echo ^"%~n0 -WNETAMD64 chk .^" (AMD64/EM64T build) +@echo ^"%~n0 -WNETXP chk . -cZ -WDF^" +@echo ^"%~n0 -WNETXP chk . -cZ -PREFAST^" +@echo. +@echo In order for this procedure to work correctly for each platform, it +@echo requires an environment variable to be set up for certain platforms. +@echo There is an auto-detection mechanism in this script, which will work best +@echo if the DDK/WDK was installed using the normal installer (i.e. not just +@echo copied). The auto-detection is based on the DDK/WDK for which you request +@echo a build. Whenever you set the variable explicitly, this will take +@echo precedence over the auto-detected path! +@echo The environment variables are as follows: +@echo. +@echo %%NT4BASE%% - Set this up for ^"-NT4^" builds +@echo %%W2KBASE%% - Set this up for ^"-W2K^" and ^"-W2K64^" builds +@echo %%WXPBASE%% - Set this up for ^"-WXP^", ^"-WXP64^", ^"-WXP2K^" builds +@echo %%WNETBASE%% - Set this up for ^"-WNET*^" builds +@echo %%WLHBASE%% - Set this up for ^"-WLH*^" builds +@echo. +@echo %%WDF_ROOT%% must be set if attempting to do a WDF Build previous to the +@echo Vista WDK (in later DDKs there is no need to set WDF_ROOT). +@echo. +@echo Path to this script: +@echo %~f0 +@echo. +@echo %OSR_VERSTR% +@echo -^> report any problems to ^ or ^ +@echo. + +:END +popd & endlocal & exit /b %OSR_ERRCODE% \ No newline at end of file diff --git a/Register/RegisterManagerDrv/makefile b/Register/RegisterManagerDrv/makefile new file mode 100644 index 0000000..98801a4 --- /dev/null +++ b/Register/RegisterManagerDrv/makefile @@ -0,0 +1,6 @@ +# +# DO NOT EDIT THIS FILE!!! Edit .\sources. if you want to add a new source +# file to this component. This file merely indirects to the real make file +# that is shared by all the components of NT OS/2 +# +!INCLUDE $(NTMAKEENV)\makefile.def \ No newline at end of file diff --git a/Register/RegisterManagerDrv/mybuild.bat b/Register/RegisterManagerDrv/mybuild.bat new file mode 100644 index 0000000..ecb14fe --- /dev/null +++ b/Register/RegisterManagerDrv/mybuild.bat @@ -0,0 +1,3 @@ +set WLHBASE=C:\WINDDK\7600.16385.0 +set WDF_ROOT=C:\WINDDK\7600.16385.0 +ddkbuild.cmd -WLH chk . -cZ -WDF \ No newline at end of file diff --git a/Register/RegisterManagerDrv/readme.txt b/Register/RegisterManagerDrv/readme.txt new file mode 100644 index 0000000..f2b78db --- /dev/null +++ b/Register/RegisterManagerDrv/readme.txt @@ -0,0 +1,157 @@ +----------------------- +ithurricane [http://hi.baidu.com/ithurricane] +2010/02/04 +----------------------- +support WDK7/VS2008 +fix Privilege Problem +modify register source + +----------------------- +bobo 2009/05/21 +----------------------- +޸bug: VC6 + DDK2003 -> vc6.dsp --> # PROP Cmd_Line "ddkbuild -WNETWXP free ." + ޸: ddkbuild.cmd,DDk2003ûWNETWXPWNETWXPЧͬWNETXP + +----------------------- +bobo 2009/05/08 +----------------------- +exe: + 1.TestAppUnicodeΪMulti-Byte(Ϊʡ,ַƴ,עдMulti-Byte), + TestApp.vcprojCharacterSet="1" ΪCharacterSet="2" + 2.TestAppغжsys(modify from MyZwDriverControl.c) òƽ́E + a.app,load driver + b.appǿƹصEʱûunload driver + c.app,ʱٴload driver(˵ûloadʧ),һʹdriver + d.˳app,unload driver + + ps: MyZwDriverControl ӁEclass LoadNTDriver(copy from 0ginr.com), + MyZwDriverControlloadunload,ע,ɾׁE + class LoadNTDriverloadע᱁Eunloadɾע᱁E + MyZwDriverControlLockXxxDatabase. + 3.غжsysclass LoadNTDriver, ELoadNTDriver.h" + +sys: + DriverEntryEӡע޷ + default uIoControlCode 䳁EIoCode + кӷҳǷҳÁE#pragma alloc_text(PAGE, DispatchXX)) + +----------------------- +bobo 2009/04/27 +----------------------- +1.target osEֻѡһos +2.DDK汾OSѡԁE +3.fix bug : "mybuild.bat" ڵ PROJECT_MYBUILD_CMD_LINE (DDK + OS)д + DDK·Ĭϵģٸд鷳 + + DDK 2000 --- C:\\NTDDK + DDK XP --- C:\\WINDDK\\2600 + DDK 2003 --- C:\\WINDDK\\3790.1830 + WDK 6001.18002 --- C:\\WINDDK\\6001.18002 + +4.֧WDK + win2008 +// todo : 5.check freeѡԁE(mybuild.batűEҁE "chk ." ӁE"fre .") + +6.һEasySysʱԶ趨û(WXPBASE,WNETBASE...) + Ǹע᱁EHKEY_LOCAL_MACHINE -- SOFTWARE\\Microsoft\\WINDDK 趨DDK·ġ + (һûװ˶DDKټӸWDK·Ҫж) + + "mybuild.bat"ҲsetEʵûˡ + +7.űÁE忴 "ddkbuild.cmd":: Usage output + +----------------------- +bobo 2009/04/23 +----------------------- +1.MS sampleʽ޸"sources" + +-----------------------. +bobo 2009/04/18 +----------------------- +1. common.h, ڶexesysĹͨIOCTL +2. console APP (for VS2005), ڲsys. ĸhello world. + (ֻҪDriverMonitorͿԲ) +// todo : 3. dsp_proj.htm(VC6)EcleanҁE,VC6ʹclean.bat +// todo : 4. MFC APP,ڲsys +5. ޸ע +6.޸print꣬Ӧcheckfree汾build + #if DBG + #define dprintf DbgPrint + #else + #define dprintf + #endif + +ԽдԽˣeasy..... + +----------------------- +bobo 2009/04/16 +----------------------- +1.OnInitDialog()EOnChangeAuthor() +2.޸OnChangeAuthor()ַ +3.޸hfile.htm,cfile.htmӦԼϰ +----------------------- + +bobo 2009/04/10 +----------------------- +1.GenerateRandomStrings()new ûͷţ + ΪֲׁEֲ̫,64С) +2.OnInitDialog()EOnSelectIdeType(),ʼIdeType + OnSelchangeDdkVersion(),ʼDDK type +3.ddkbuild.cmd EΪ VERSION=V7.3 +4.VC6ddkbuild.batΪddkbuild.cmd +5.޸OnSelchangeDdkVersion()ڵDDK2000߼ж +6.VC6dsp.htmstruct.h + +----------------------- +ChiChou [http://hi.baidu.com/517826104] +2009/02/03 +----------------------- + +ChiChou sudami޸İEׁE + +* BUG + 1.dzصBUG˳ʱûƳͼ꣬ijЩ˳ʱ +ҵĵсE- -! + + 2.ԭDDK·ʱȡע޷дˣ޷ DDK +PathòƴֱԼҵDDK·֮δе㡣 + + 3.ԭûмE鹤E氁EǷַôĿ¼ʱE +ͻʱӶԷǷַcheckܡE/\|"<>*?: + + 4.һBUGû޸ڹE硰project..ʱ +Ҳļʴ󡣵ûаE޸ַжеѶȡ +ˮƽӡ(- -...) + +* ÁE + 1.ѴŪ XPBUTTON ȥ...ͼҁEٶȡ + 2.ȻPűͼ棬ÿ~~ + 3.ϰԵ XP Manifest ¡ + +* ޸ģE + 1.ݸϲôEĸʽ޸~ + 2.˳ѡ́EҹE濴ijжϷûȻE +ͬ豸˽ȥ + +* ́Eƹ + 1.sudamiе鷳˳Ҫֱ̡˳ +ť + 2.̴֮EasySYSûôˣˡ́Eɺ˳ѡ + 3.ɹ̺ԴEڡߵϢ + 4.ɹ̺IJҲǿѡġѡԶ򿪹ļĿ¼ + 5.Clean~~~ +----------------------- + + +----------------------- +sudami [sudami@163.com] +2008/08/13 +----------------------- + + VS 2005дVC 6.0ܶEöEasySYS汾(Include DIY)ֻ +֧VC 6.0.VBGOOD̳IceBoyСͬѧVBд˸֧vs 2005 +demo.,ҲдԼĹ,ԺEٵĿЁE + + ,ҪǷԼдcode,ɵcodeǰԼԸ +... + +----------------------- diff --git a/Register/RegisterManagerDrv/sources b/Register/RegisterManagerDrv/sources new file mode 100644 index 0000000..cbc6aaf --- /dev/null +++ b/Register/RegisterManagerDrv/sources @@ -0,0 +1,9 @@ +TARGETNAME=RegisterManagerDrv +#TARGETPATH=$(BASEDIR)\lib +TARGETPATH=obj +TARGETTYPE=DRIVER + +INCLUDES=.\ + +SOURCES=RegisterManagerDrv.c +