Search code examples
c++cwindowswinapiwindows-explorer

Hook ishellfolder enumobjects


I am trying to hook the function enumobjects in Ishellfolder . I am doing it because I want to display the user non existing files in explorer. I was success to hook FindNextFile and FindFirstFile but unfortunately this function not always call by explorer according to this question Which APIs are used by explorer.exe in Windows 7 to list files?

Now I try to hook IShellFolder::EnumObjects so I hook

MyCoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID riid, LPVOID *ppv)

And inside this function I have the following code:

if (IsEqualCLSID(rclsid, (REFGUID) __uuidof (IShellFolder)) || 
    IsEqualCLSID(rclsid, (REFGUID) __uuidof (IShellFolder2)) ||
    IsEqualCLSID(rclsid, (REFGUID) CLSID_ShellDesktop) ||
    IsEqualCLSID(rclsid, (REFGUID) IID_IShellFolder) )
{

    PDEBUG(L"IID_IShellFolder.2");
    IShellFolderCast *shellFolder = (IShellFolderCast *) *ppv;

    orig_EnumObjects = (type_EnumObjects) GetInterfaceMethod(shellFolder->lpVtbl, 4);
    if (!Mhook_SetHook((void **) &orig_EnumObjects, MyEnumObjects))
    {
        PDEBUG(L". CoCreateInstance. Failed to set EnumObjects!");
    }else
    {
        PDEBUG(L". CoCreateInstance. success to set EnumObjects!");
    }
}

but it never go inside that if anyone know why?


Solution

  • Just change to

    if (IsEqualCLSID(rclsid, (REFGUID) CLSID_ShellFSFolder) )
    

    and now it works