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");
47 wprintf(
L"shlextdbg /dumpfoldercolumns=folder\n");
48 wprintf(
L"shlextdbg /dumppidl=path\n");
112 static const QITAB c_tab[] =
117 return ::QISearch(
this, c_tab,
riid,
ppv);
124 WCHAR szCls[42], szIid[42];
168 IQueryAssociations* pQA;
180 info.dwAttributes = 0;
182 if (
info.dwAttributes & SFGAO_FOLDER)
186 else if (
info.dwAttributes & SFGAO_BROWSABLE)
216 return Ch <= 255 && isprint(static_cast<BYTE>(
Ch)) ? (
BYTE)
Ch :
'.';
221 UINT cbPerLine = 16, cbLine;
224 cbLine =
min(cbPerLine,
cb -
i);
226 for (
j = 0;
j < cbPerLine - cbLine; ++
j)
wprintf(
L" ");
228 for (
j = 0;
j < cbPerLine - cbLine; ++
j)
wprintf(
L" ");
254 bool recurse = Indent !=
UINT(-1);
276 for (
UINT j = 0;
j < Indent && recurse; ++
j)
316 info.dwAttributes = 0;
353 if (!
p->mkid.cb &&
p > pidl)
356 const WORD save = pNext ? pNext->mkid.cb : 0;
364 static const SHCOLUMNID pkey_descriptionid = { FMTID_ShellDetails,
PID_DESCRIPTIONID };
391 pNext->mkid.cb = save;
410 wprintf(
L"Could not bind to IShellFolder2\n");
414 ULONG columns, defSort, defDisp;
415 for (columns = 0; ; ++columns)
424 if (
FAILED(sf->GetDefaultColumnState(columns, &
flags)))
430 if (
SUCCEEDED(sf->GetDefaultColumn(0, &defSort, &defDisp)))
431 wprintf(
L"%lu is the default sort column and %lu is the default display column.\n", defSort, defDisp);
440 SHCOLUMNID scid = {};
446 SHCOLUMNID scid = {};
447 if (
FAILED(sf->MapColumnToSCID(
i, &scid)))
480 hr =
si->BindToHandler(
NULL, pclsid ? *pclsid : BHID_AssociationArray,
IID_PPV_ARG(IQueryAssociations, &qa));
594 wprintf(
L"Failed to bind to parent: 0x%x\n",
hr);
600 wprintf(
L"Failed to query IDataObject: 0x%x\n",
hr);
629 tDllGetClassObject DllGet = (tDllGetClassObject)
GetProcAddress(
mod,
"DllGetClassObject");
639 wprintf(
L"Failed to create IClassFactory: 0x%x\n",
hr);
645 wprintf(
L"Failed to Request IShellExtInit from IClassFactory: 0x%x\n",
hr);
658 hr = spShellExtInit->Initialize(pidl, spDataObject,
hKey);
663 wprintf(
L"IShellExtInit->Initialize failed: 0x%x\n",
hr);
666 hr = spShellExtInit->QueryInterface(
riid,
ppv);
706 wprintf(
L"All windows closed (ignoring console window)\n");
717 static const QITAB rgqit[] = { { 0 } };
723 wprintf(
L"INFO: SHGetInstanceExplorer\n");
729 wprintf(
L"INFO: Release ExplorerInstance\n");
753 LPCWSTR nag =
L"(Please use SHGetInstanceExplorer in your code instead)";
768 wprintf(
L"Press any key to continue... %s\n", nag);
783 wprintf(
L"Propsheet failed to pass lParam, got: 0x%Ix\n",
lParam);
795 if (*
cmd ==
':' || *
cmd ==
'=')
825 bool failArgs =
false;
829 if (
cmd[0] ==
'-' ||
cmd[0] ==
'/')
841 if (
argc - (
n + 1) >= 6 &&
argc - (
n + 1) <= 8)
872 sei.
fMask |= 0x00001000;
874 sei.
fMask |= 0x00002000;
877 sei.
fMask |= 0x08000000;
923 UINT cmf = 0, nosub = 0, fakeinit = 0;
929 cmf |= CMF_DEFAULTONLY;
931 cmf |= CMF_NODEFAULT;
933 cmf |= CMF_DONOTPICKDEFAULT;
935 cmf |= CMF_EXTENDEDVERBS;
937 cmf |= CMF_SYNCCASCADEMENU;
941 cmf |= CMF_VERBSONLY;
945 cmf |= CMF_DISABLEDVERBS;
947 cmf |= CMF_OPTIMIZEFORINVOKE;
949 cmf |= CMF_CANRENAME;
958 hr = cm->QueryContextMenu(hMenu, 0,
first,
last, cmf);
1036 CLSID EmptyCLSID = { 0 };
1060 wprintf(
L"IShellPropSheetExt->AddPages failed: 0x%x\n",
hr);
1067 psh.
dwSize =
sizeof(psh);
1072 psh.
nStartPage = ActivePage ? (ActivePage-1) : 0;
1075 wprintf(
L"PropertySheetW returned: 0x%x\n",
hr);
1086 CMINVOKECOMMANDINFO cm = {
sizeof(cm), 0 };
1089 hr = spContextMenu->InvokeCommand(&cm);
1093 wprintf(
L"IContextMenu->InvokeCommand failed: 0x%x\n",
hr);
1096 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)
HRESULT WINAPI PropVariantClear(PROPVARIANT *pvar)
INT WINAPI StringFromGUID2(REFGUID guid, LPOLESTR str, INT cmax)
HRESULT WINAPI CLSIDFromString(LPCOLESTR str, LPCLSID clsid)
HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstance(REFCLSID rclsid, IUnknown *outer, DWORD cls_context, REFIID riid, void **obj)
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)
int CDECL _putws(const wchar_t *s)
_ACRTIMP __msvcrt_long __cdecl wcstol(const wchar_t *, wchar_t **, int)
_ACRTIMP int __cdecl _wcsicmp(const wchar_t *, const wchar_t *)
_ACRTIMP size_t __cdecl wcslen(const wchar_t *)
_ACRTIMP int __cdecl _wcsnicmp(const wchar_t *, const wchar_t *, size_t)
HRESULT WINAPI CoInitialize(LPVOID lpReserved)
DWORD WINAPI SHGetValueW(HKEY hkey, const WCHAR *subkey, const WCHAR *value, DWORD *type, void *data, DWORD *data_len)
void WINAPI SHFree(LPVOID pv)
HRESULT WINAPI AssocCreate(CLSID clsid, REFIID refiid, void **lpInterface)
HRESULT WINAPI StrRetToBufW(LPSTRRET src, const ITEMIDLIST *pidl, LPWSTR dest, UINT len)
HRESULT WINAPI StrRetToStrW(LPSTRRET lpStrRet, const ITEMIDLIST *pidl, LPWSTR *ppszName)
#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
#define ERROR_FILE_NOT_FOUND
static const LARGE_INTEGER *static const HANDLE const LARGE_INTEGER *static PSLIST_ENTRY PSLIST_ENTRY last
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)
LPITEMIDLIST WINAPI ILGetNext(LPCITEMIDLIST pidl)
#define ICC_STANDARD_CLASSES
@ ASSOCSTR_FRIENDLYDOCNAME
#define QITABENT(Cthis, Ifoo)
HRESULT WINAPI SHForwardContextMenuMsg(IUnknown *pUnk, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *pResult, BOOL useIContextMenu2)
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 void DumpHexBytes(LPCVOID Buffer, SIZE_T cb)
static BOOL CALLBACK cb_AddPage(HPROPSHEETPAGE page, LPARAM lParam)
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
static IServiceProvider * GetLoggingServiceProvider()
static HRESULT DumpPidl(PCWSTR Path)
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 CreateShellItemFromParse(PCWSTR Path, IShellItem **ppSI, PIDLIST_ABSOLUTE *ppidl=NULL)
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)
static CHAR SafeDumpChar(UINT Ch)
HRESULT LoadAndInitialize(REFIID riid, LPVOID *ppv)
static void DumpBytes(const void *Data, SIZE_T cb)
bool g_bIShellPropSheetExt
HRESULT CreateIDataObject(CComHeapPtr< ITEMIDLIST > &pidl, CComPtr< IDataObject > &dataObject, PCWSTR FileName)
CSimpleArray< HPROPSHEETPAGE > g_Pages
static HRESULT DumpFolderColumns(PCWSTR Path)
static int SHGFI(PCWSTR Path)
static int ErrMsg(int Error)
static HRESULT AssocQ(int argc, WCHAR **argv)
#define PID_DESCRIPTIONID
#define SHDID_FS_DIRECTORY
#define SHDID_COMPUTER_FIXED
#define SHDID_ROOT_REGITEM
ITEMID_CHILD UNALIGNED * PUITEMID_CHILD
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
static HRESULT HRESULT_FROM_WIN32(unsigned int 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)