24 wprintf(
L"shlextdbg /clsid={clsid} [/dll=dllname] /IShellExtInit=filename |shlextype| |waitoptions|\n");
25 wprintf(
L" {clsid}: The CLSID or ProgID of the object to create\n");
26 wprintf(
L" dll: Optional dllname to create the object from, instead of CoCreateInstance\n");
27 wprintf(
L" filename: The filename to pass to IShellExtInit->Initialze\n");
28 wprintf(
L" shlextype: The type of shell extention to run:\n");
29 wprintf(
L" /IShellPropSheetExt to create a property sheet\n");
30 wprintf(
L" /IContextMenu=verb to activate the specified verb\n");
31 wprintf(
L" waitoptions: Specify how to wait:\n");
32 wprintf(
L" /explorerinstance: Wait for SHGetInstanceExplorer (Default)\n");
33 wprintf(
L" /infinite: Keep on waiting infinitely\n");
34 wprintf(
L" /openwindows: Wait for all windows from the current application to close\n");
35 wprintf(
L" /input: Wait for input\n");
39 wprintf(
L" Call SHGetFileInfo. Prefix path with $ to parse as a pidl.\n");
41 wprintf(
L"shlextdbg /assocq <[{bhid}]path> <string|data|key> <type> <initflags> <queryflags> <initstring> [extra] [maxsize]\n");
42 wprintf(
L" Uses the default implementation from AssocCreate if path is empty.\n");
44 wprintf(
L"shlextdbg /shellexec=path [/see] [verb] [class]\n");
46 wprintf(
L"shlextdbg /dumpmenu=[{clsid}]path [/cmf]\n");
108 static const QITAB c_tab[] =
113 return ::QISearch(
this, c_tab,
riid,
ppv);
120 WCHAR szCls[42], szIid[42];
161 IQueryAssociations* pQA;
173 info.dwAttributes = 0;
175 if (
info.dwAttributes & SFGAO_FOLDER)
179 else if (
info.dwAttributes & SFGAO_BROWSABLE)
228 bool recurse = Indent !=
UINT(-1);
250 for (
UINT j = 0;
j < Indent && recurse; ++
j)
290 info.dwAttributes = 0;
333 hr = si->BindToHandler(
NULL, pclsid ? *pclsid : BHID_AssociationArray,
IID_PPV_ARG(IQueryAssociations, &qa));
335 hr = si->BindToHandler(
NULL, BHID_SFUIObject,
IID_PPV_ARG(IQueryAssociations, &qa));
447 wprintf(
L"Failed to bind to parent: 0x%x\n",
hr);
453 wprintf(
L"Failed to query IDataObject: 0x%x\n",
hr);
482 tDllGetClassObject DllGet = (tDllGetClassObject)
GetProcAddress(
mod,
"DllGetClassObject");
492 wprintf(
L"Failed to create IClassFactory: 0x%x\n",
hr);
498 wprintf(
L"Failed to Request IShellExtInit from IClassFactory: 0x%x\n",
hr);
511 hr = spShellExtInit->Initialize(pidl, spDataObject,
hKey);
516 wprintf(
L"IShellExtInit->Initialize failed: 0x%x\n",
hr);
519 hr = spShellExtInit->QueryInterface(
riid,
ppv);
559 wprintf(
L"All windows closed (ignoring console window)\n");
570 static const QITAB rgqit[] = { { 0 } };
576 wprintf(
L"INFO: SHGetInstanceExplorer\n");
582 wprintf(
L"INFO: Release ExplorerInstance\n");
606 LPCWSTR nag =
L"(Please use SHGetInstanceExplorer in your code instead)";
621 wprintf(
L"Press any key to continue... %s\n", nag);
636 wprintf(
L"Propsheet failed to pass lParam, got: 0x%Ix\n",
lParam);
648 if (*
cmd ==
':' || *
cmd ==
'=')
678 bool failArgs =
false;
682 if (
cmd[0] ==
'-' ||
cmd[0] ==
'/')
694 if (
argc - (
n + 1) >= 6 &&
argc - (
n + 1) <= 8)
725 sei.
fMask |= 0x00001000;
727 sei.
fMask |= 0x00002000;
730 sei.
fMask |= 0x08000000;
776 UINT cmf = 0, nosub = 0, fakeinit = 0;
782 cmf |= CMF_DEFAULTONLY;
784 cmf |= CMF_NODEFAULT;
786 cmf |= CMF_DONOTPICKDEFAULT;
788 cmf |= CMF_EXTENDEDVERBS;
790 cmf |= CMF_SYNCCASCADEMENU;
794 cmf |= CMF_VERBSONLY;
798 cmf |= CMF_DISABLEDVERBS;
800 cmf |= CMF_OPTIMIZEFORINVOKE;
802 cmf |= CMF_CANRENAME;
811 hr = cm->QueryContextMenu(hMenu, 0,
first,
last, cmf);
881 CLSID EmptyCLSID = { 0 };
905 wprintf(
L"IShellPropSheetExt->AddPages failed: 0x%x\n",
hr);
917 psh.
nStartPage = ActivePage ? (ActivePage-1) : 0;
920 wprintf(
L"PropertySheetW returned: 0x%x\n",
hr);
931 CMINVOKECOMMANDINFO cm = {
sizeof(cm), 0 };
934 hr = spContextMenu->InvokeCommand(&cm);
938 wprintf(
L"IContextMenu->InvokeCommand failed: 0x%x\n",
hr);
941 wprintf(
L"IContextMenu->InvokeCommand returned: 0x%x\n",
hr);
EXTERN_C HRESULT WINAPI SHCreateShellItem(PCIDLIST_ABSOLUTE pidlParent, IShellFolder *psfParent, PCUITEMID_CHILD pidl, IShellItem **ppsi)
std::map< E_MODULE, HMODULE > mod
PRTL_UNICODE_STRING_BUFFER Path
#define InterlockedIncrement
#define InterlockedDecrement
#define UlongToHandle(ul)
#define STDMETHODCALLTYPE
#define RegCloseKey(hKey)
bool IsEmpty() const noexcept
PXSTR GetString() noexcept
BOOL WINAPI InitCommonControlsEx(const INITCOMMONCONTROLSEX *lpInitCtrls)
#define ERROR_INSUFFICIENT_BUFFER
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
INT_PTR WINAPI PropertySheetW(LPCPROPSHEETHEADERW lppsh)
#define ERROR_INVALID_PARAMETER
#define GetProcAddress(x, y)
static const WCHAR *const ext[]
HWND WINAPI GetConsoleWindow(void)
HRESULT WINAPI QISearch(void *base, const QITAB *table, REFIID riid, void **obj)
LPWSTR WINAPI PathFindExtensionW(const WCHAR *path)
HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID iid, LPVOID *ppv)
HRESULT WINAPI CoInitialize(LPVOID lpReserved)
HRESULT WINAPI CLSIDFromString(LPCOLESTR idstr, LPCLSID id)
INT WINAPI StringFromGUID2(REFGUID id, LPOLESTR str, INT cmax)
void WINAPI SHFree(LPVOID pv)
HRESULT WINAPI AssocCreate(CLSID clsid, REFIID refiid, void **lpInterface)
DWORD WINAPI SHGetValueW(HKEY hKey, LPCWSTR lpszSubKey, LPCWSTR lpszValue, LPDWORD pwType, LPVOID pvData, LPDWORD pcbData)
HRESULT WINAPI StrRetToBufW(LPSTRRET src, const ITEMIDLIST *pidl, LPWSTR dest, UINT len)
#define check(expected, result)
GLdouble GLdouble GLdouble r
GLenum GLuint GLenum GLsizei const GLchar * buf
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
_Check_return_opt_ _CRTIMP int __cdecl _putws(_In_z_ const wchar_t *_Str)
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
#define ERROR_FILE_NOT_FOUND
static DWORD DWORD void LPSTR DWORD cch
static HMODULE MODULEINFO DWORD cb
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
struct _PSP * HPROPSHEETPAGE
const GUID IID_IDataObject
HRESULT WINAPI SHParseDisplayName(LPCWSTR pszName, IBindCtx *pbc, LPITEMIDLIST *ppidl, SFGAOF sfgaoIn, SFGAOF *psfgaoOut)
HRESULT WINAPI SHBindToParent(LPCITEMIDLIST pidl, REFIID riid, LPVOID *ppv, LPCITEMIDLIST *ppidlLast)
#define ICC_STANDARD_CLASSES
HRESULT WINAPI SHForwardContextMenuMsg(IUnknown *pUnk, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *pResult, BOOL useIContextMenu2)
_Check_return_ long __cdecl wcstol(_In_z_ const wchar_t *_Str, _Out_opt_ _Deref_post_z_ wchar_t **_EndPtr, _In_ int _Radix)
_Check_return_ _CRTIMP int __cdecl _wcsicmp(_In_z_ const wchar_t *_Str1, _In_z_ const wchar_t *_Str2)
_Check_return_ _CRTIMP int __cdecl _wcsnicmp(_In_reads_or_z_(_MaxCount) const wchar_t *_Str1, _In_reads_or_z_(_MaxCount) const wchar_t *_Str2, _In_ size_t _MaxCount)
DWORD_PTR WINAPI SHGetFileInfoW(LPCWSTR path, DWORD dwFileAttributes, SHFILEINFOW *psfi, UINT sizeofpsfi, UINT flags)
#define SHGFI_SYSICONINDEX
#define SHGFI_ICONLOCATION
#define SHGFI_DISPLAYNAME
#define SHGFI_USEFILEATTRIBUTES
#define SEE_MASK_CLASSNAME
#define SEE_MASK_INVOKEIDLIST
#define SEE_MASK_FLAG_NO_UI
#define SEE_MASK_NO_CONSOLE
VOID WINAPI SHSetInstanceExplorer(LPUNKNOWN lpUnknown)
BOOL WINAPI DECLSPEC_HOTPATCH ShellExecuteExW(LPSHELLEXECUTEINFOW sei)
static BOOL CALLBACK cb_AddPage(HPROPSHEETPAGE page, LPARAM lParam)
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
static IServiceProvider * GetLoggingServiceProvider()
static void GetAssocClass(LPCWSTR Path, LPCITEMIDLIST pidl, HKEY &hKey)
static HRESULT GetCommandString(IContextMenu &CM, UINT Id, UINT Type, LPWSTR buf, UINT cchMax)
static bool isCmdWithArg(int argc, WCHAR **argv, int &n, PCWSTR check, PCWSTR &arg)
static void DumpMenu(HMENU hMenu, UINT IdOffset, IContextMenu *pCM, BOOL FakeInit, UINT Indent)
static HRESULT GetUIObjectOfAbsolute(LPCITEMIDLIST pidl, REFIID riid, void **ppv)
CSimpleArray< HWND > g_Windows
static bool CLSIDPrefix(T &String, CLSID &Clsid)
static bool isCmd(int argc, WCHAR **argv, int n, PCWSTR check)
static LONG StrToNum(PCWSTR in)
HRESULT LoadAndInitialize(REFIID riid, LPVOID *ppv)
static void DumpBytes(const void *Data, SIZE_T cb)
bool g_bIShellPropSheetExt
static HRESULT CreateShellItemFromParse(PCWSTR Path, IShellItem **ppSI)
HRESULT CreateIDataObject(CComHeapPtr< ITEMIDLIST > &pidl, CComPtr< IDataObject > &dataObject, PCWSTR FileName)
CSimpleArray< HPROPSHEETPAGE > g_Pages
static int SHGFI(PCWSTR Path)
static int ErrMsg(int Error)
static HRESULT AssocQ(int argc, WCHAR **argv)
@ ASSOCSTR_FRIENDLYDOCNAME
#define QITABENT(Cthis, Ifoo)
const ITEMID_CHILD UNALIGNED * PCUITEMID_CHILD
const ITEMIDLIST UNALIGNED * LPCITEMIDLIST
ULONG WINAPI AddRef() override
HRESULT WINAPI QueryInterface(REFIID riid, void **ppv) override
HRESULT WINAPI QueryService(REFGUID rcls, REFIID riid, void **ppv) override
ULONG WINAPI Release() override
virtual ULONG STDMETHODCALLTYPE AddRef()
virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppv)
virtual ULONG STDMETHODCALLTYPE Release()
VOID WINAPI DECLSPEC_HOTPATCH Sleep(IN DWORD dwMilliseconds)
TW_UINT32 TW_UINT16 TW_UINT16 MSG
#define FIELD_OFFSET(t, f)
#define INVALID_FILE_ATTRIBUTES
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFSTRING String
DWORD WINAPI GetLastError(void)
#define GetFileAttributes
#define FORMAT_MESSAGE_IGNORE_INSERTS
DWORD WINAPI GetCurrentProcessId(void)
DWORD WINAPI GetWindowThreadProcessId(HWND hWnd, PDWORD lpdwProcessId)
#define FORMAT_MESSAGE_FROM_SYSTEM
_In_ ULONG_PTR _In_ ULONG _Out_ ULONG_PTR * pid
#define HRESULT_FROM_WIN32(x)
#define HKEY_CLASSES_ROOT
HMENU WINAPI CreatePopupMenu(void)
UINT WINAPI GetMenuDefaultItem(_In_ HMENU hMenu, _In_ UINT fByPos, _In_ UINT gmdiFlags)
BOOL WINAPI EnumWindows(_In_ WNDENUMPROC lpEnumFunc, _In_ LPARAM lParam)
BOOL WINAPI DestroyMenu(_In_ HMENU)
#define SW_SHOWMINNOACTIVE
#define IID_PPV_ARG(Itype, ppType)