Changeset 715


Ignore:
Timestamp:
12/05/08 04:37:43 (6 years ago)
Author:
lowjoel
Message:

Defined a GetHKeyPath function which translates the HKEY parameter from IShellExtInit::Initialize to a registry key name. This marks the beginning of us allowing our shell extension to be integrated into the Explorer Recycle Bin context menu (okay, it's a little hackish, but let's see how it plays out. All that I needed was a debugger into the shell extension, no other hacks :P)

Location:
branches/eraser6/ShellExt
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • branches/eraser6/ShellExt/CtxMenu.cpp

    r711 r715  
    2525#include <sstream> 
    2626 
     27extern "C" 
     28{ 
     29    typedef LONG NTSTATUS; 
     30    enum KEY_INFORMATION_CLASS 
     31    { 
     32        KeyBasicInformation, 
     33        KeyNodeInformation, 
     34        KeyFullInformation, 
     35        KeyNameInformation, 
     36        KeyCachedInformation, 
     37        KeyVirtualizationInformation 
     38    }; 
     39 
     40    struct KEY_BASIC_INFORMATION 
     41    { 
     42        LARGE_INTEGER LastWriteTime; 
     43        ULONG TitleIndex; 
     44        ULONG NameLength; 
     45        WCHAR Name[1]; 
     46    }; 
     47 
     48    typedef NTSTATUS (*pZwQueryKey)(HANDLE KeyHandle, KEY_INFORMATION_CLASS KeyInformationClass, 
     49        PVOID KeyInformation, ULONG Length, PULONG ResultLength); 
     50    pZwQueryKey ZwQueryKey; 
     51} 
     52 
    2753template<typename handleType> class Handle 
    2854{ 
     
    5177 
    5278    HRESULT CCtxMenu::Initialize(LPCITEMIDLIST pidlFolder, LPDATAOBJECT pDataObj, 
    53                                  HKEY /*hProgID*/) 
    54     { 
    55         m_itemID      = 0; 
    56         FORMATETC fmt = { CF_HDROP, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }; 
    57         STGMEDIUM stg = { TYMED_HGLOBAL }; 
    58         HDROP     hDrop; 
    59  
    60         //Check pidlFolder for the drop path, if it exists. 
    61         if (pidlFolder != NULL) 
    62         { 
     79                                 HKEY hProgID) 
     80    { 
     81        //Initialise member variables. 
     82        m_itemID = 0; 
     83         
     84        //Determine where the shell extension was invoked from. 
     85        if (GetHKeyPath(hProgID) == L"{645FF040-5081-101B-9F08-00AA002F954E}") 
     86        { 
     87            InvokeReason = INVOKEREASON_RECYCLEBIN; 
     88 
     89            //We can't do much other processing: the LPDATAOBJECT parameter contains 
     90            //data that is a private type so we don't know how to query for it. 
     91            return S_OK; 
     92        } 
     93 
     94        //Check pidlFolder for the drop path, if it exists. This is for drag-and-drop 
     95        //context menus. 
     96        else if (pidlFolder != NULL) 
     97        { 
     98            InvokeReason = INVOKEREASON_DRAGDROP; 
     99 
    63100            //Translate the drop path to a location on the filesystem. 
    64101            wchar_t dropTargetPath[MAX_PATH]; 
     
    69106        } 
    70107 
     108        //Okay, everything else is a simple context menu for a set of selected files/ 
     109        //folders/drives. 
     110        else 
     111            InvokeReason = INVOKEREASON_FILEFOLDER; 
     112 
    71113        //Look for CF_HDROP data in the data object. 
     114        FORMATETC fmt = { CF_HDROP, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }; 
     115        STGMEDIUM stg = { TYMED_HGLOBAL }; 
    72116        if (FAILED(pDataObj->GetData(&fmt, &stg))) 
    73117            //Nope! Return an "invalid argument" error back to Explorer. 
    74             return E_INVALIDARG; 
     118            return S_OK; 
    75119 
    76120        //Get a pointer to the actual data. 
    77         hDrop = static_cast<HDROP>(GlobalLock(stg.hGlobal)); 
    78  
    79         //Make sure it worked. 
     121        HDROP hDrop = static_cast<HDROP>(GlobalLock(stg.hGlobal)); 
    80122        if (hDrop == NULL) 
    81123            return E_INVALIDARG; 
     
    90132        } 
    91133 
     134        //Collect all the files which have been selected. 
    92135        HRESULT hr = S_OK; 
    93136        WCHAR buffer[MAX_PATH] = {0}; 
     
    104147        } 
    105148 
     149        //Clean up. 
    106150        GlobalUnlock(stg.hGlobal); 
    107151        ReleaseStgMedium(&stg); 
    108152        return hr; 
    109153    } 
    110     /* 
    111     +-------------------+ 
    112     |                   | 
    113     |                   | 
    114     |                   | 
    115     |                   | 
    116     +-------------------+    +-------------------+ 
    117     |(ICON) Eraser v6 > |    | Erase selected    | //--> erase the files immediately using defaults 
    118     +-------------------+    | Schedule Selected | //--> open the scheduler menu, with files/folders filled in 
    119     |                   |    +-------------------+ 
    120     |                   |    | Secure move       | //--> secure move the files 
    121     |                   |    +-------------------+ // Eraser.Manager Algorithms popup 
    122     |                   |    |(*) Customise      | // set algorithm for this query only 
    123     +-------------------+    +-------------------+ 
    124     */ 
    125154 
    126155    HRESULT CCtxMenu::QueryContextMenu(HMENU hmenu, UINT uMenuIndex, UINT uidFirstCmd, 
     
    534563    } 
    535564 
     565    std::wstring CCtxMenu::GetHKeyPath(HKEY handle) 
     566    { 
     567        ZwQueryKey = reinterpret_cast<pZwQueryKey>(GetProcAddress( 
     568            LoadLibrary(L"Ntdll.dll"), "ZwQueryKey")); 
     569        ULONG keyInfoSize = sizeof(KEY_BASIC_INFORMATION); 
     570        KEY_BASIC_INFORMATION* keyInfo = NULL; 
     571        NTSTATUS queryResult = ERROR_MORE_DATA; 
     572 
     573        while (queryResult == ERROR_MORE_DATA) 
     574        { 
     575            delete[] keyInfo; 
     576            keyInfo = reinterpret_cast<KEY_BASIC_INFORMATION*>( 
     577                new char[keyInfoSize += 512]); 
     578            ::ZeroMemory(keyInfo, keyInfoSize); 
     579            queryResult = ZwQueryKey(handle, KeyBasicInformation, keyInfo, 
     580                keyInfoSize, &keyInfoSize); 
     581        } 
     582 
     583        std::wstring result(keyInfo->Name, keyInfoSize - 
     584            sizeof(KEY_BASIC_INFORMATION) + 1); 
     585        delete[] keyInfo; 
     586        return result; 
     587    } 
     588 
    536589    MENUITEMINFO* CCtxMenu::GetSeparator() 
    537590    { 
  • branches/eraser6/ShellExt/CtxMenu.h

    r711 r715  
    4949        } 
    5050 
     51        /// The place where the context menu extension was invoked. 
     52        enum InvokeReasons 
     53        { 
     54            INVOKEREASON_FILEFOLDER, 
     55            INVOKEREASON_DRAGDROP, 
     56            INVOKEREASON_RECYCLEBIN 
     57        }; 
     58 
    5159        enum CEraserLPVERBS 
    5260        { 
     
    7583        CEraserLPVERBS GetApplicableActions(); 
    7684 
     85        static std::wstring GetHKeyPath(HKEY handle); 
    7786        static MENUITEMINFO* GetSeparator(); 
    7887        static HICON GetMenuIcon(); 
     
    8190 
    8291    protected: 
     92        InvokeReasons InvokeReason; 
     93 
    8394        UINT        m_itemID; 
    8495        string_list m_szSelectedFiles; 
  • branches/eraser6/ShellExt/ShellExt_i.c

    r712 r715  
    77 
    88 /* File created by MIDL compiler version 7.00.0500 */ 
    9 /* at Tue Dec 02 22:04:21 2008 
     9/* at Fri Dec 05 11:15:23 2008 
    1010 */ 
    1111/* Compiler settings for .\DllMain.idl: 
    12     Oicf, W1, Zp8, env=Win64 (32b run) 
     12    Oicf, W1, Zp8, env=Win32 (32b run) 
    1313    protocol : dce , ms_ext, c_ext, robust 
    14     error checks: allocation ref bounds_check enum stub_data  
     14    error checks: stub_data  
    1515    VC __declspec() decoration level:  
    1616         __declspec(uuid()), __declspec(selectany), __declspec(novtable) 
  • branches/eraser6/ShellExt/ShellExt_i.h

    r712 r715  
    55 
    66 /* File created by MIDL compiler version 7.00.0500 */ 
    7 /* at Tue Dec 02 22:04:21 2008 
     7/* at Fri Dec 05 11:15:23 2008 
    88 */ 
    99/* Compiler settings for .\DllMain.idl: 
    10     Oicf, W1, Zp8, env=Win64 (32b run) 
     10    Oicf, W1, Zp8, env=Win32 (32b run) 
    1111    protocol : dce , ms_ext, c_ext, robust 
    12     error checks: allocation ref bounds_check enum stub_data  
     12    error checks: stub_data  
    1313    VC __declspec() decoration level:  
    1414         __declspec(uuid()), __declspec(selectany), __declspec(novtable) 
Note: See TracChangeset for help on using the changeset viewer.