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");
115 static const QITAB c_tab[] =
120 return ::QISearch(
this, c_tab,
riid,
ppv);
127 WCHAR szCls[42], szIid[42];
171 IQueryAssociations* pQA;
183 info.dwAttributes = 0;
185 if (
info.dwAttributes & SFGAO_FOLDER)
189 else if (
info.dwAttributes & SFGAO_BROWSABLE)
219 return Ch <= 255 && isprint(static_cast<BYTE>(
Ch)) ? (
BYTE)
Ch :
'.';
224 UINT cbPerLine = 16, cbLine;
227 cbLine =
min(cbPerLine,
cb -
i);
229 for (
j = 0;
j < cbPerLine - cbLine; ++
j)
wprintf(
L" ");
231 for (
j = 0;
j < cbPerLine - cbLine; ++
j)
wprintf(
L" ");
257 bool recurse = Indent !=
UINT(-1);
279 for (
UINT j = 0;
j < Indent && recurse; ++
j)
319 info.dwAttributes = 0;
356 if (!
p->mkid.cb &&
p > pidl)
359 const WORD save = pNext ? pNext->mkid.cb : 0;
367 static const SHCOLUMNID pkey_descriptionid = { FMTID_ShellDetails,
PID_DESCRIPTIONID };
394 pNext->mkid.cb = save;
413 wprintf(
L"Could not bind to IShellFolder2\n");
417 ULONG columns, defSort, defDisp;
418 for (columns = 0; ; ++columns)
427 if (
FAILED(sf->GetDefaultColumnState(columns, &
flags)))
433 if (
SUCCEEDED(sf->GetDefaultColumn(0, &defSort, &defDisp)))
434 wprintf(
L"%lu is the default sort column and %lu is the default display column.\n", defSort, defDisp);
443 SHCOLUMNID scid = {};
449 SHCOLUMNID scid = {};
450 if (
FAILED(sf->MapColumnToSCID(
i, &scid)))
483 hr =
si->BindToHandler(
NULL, pclsid ? *pclsid : BHID_AssociationArray,
IID_PPV_ARG(IQueryAssociations, &qa));
597 wprintf(
L"Failed to bind to parent: 0x%x\n",
hr);
603 wprintf(
L"Failed to query IDataObject: 0x%x\n",
hr);
632 tDllGetClassObject DllGet = (tDllGetClassObject)
GetProcAddress(
mod,
"DllGetClassObject");
642 wprintf(
L"Failed to create IClassFactory: 0x%x\n",
hr);
648 wprintf(
L"Failed to Request IShellExtInit from IClassFactory: 0x%x\n",
hr);
661 hr = spShellExtInit->Initialize(pidl, spDataObject,
hKey);
666 wprintf(
L"IShellExtInit->Initialize failed: 0x%x\n",
hr);
669 hr = spShellExtInit->QueryInterface(
riid,
ppv);
709 wprintf(
L"All windows closed (ignoring console window)\n");
720 static const QITAB rgqit[] = { { 0 } };
726 wprintf(
L"INFO: SHGetInstanceExplorer\n");
732 wprintf(
L"INFO: Release ExplorerInstance\n");
756 LPCWSTR nag =
L"(Please use SHGetInstanceExplorer in your code instead)";
771 wprintf(
L"Press any key to continue... %s\n", nag);
786 wprintf(
L"Propsheet failed to pass lParam, got: 0x%Ix\n",
lParam);
798 if (*
cmd ==
':' || *
cmd ==
'=')
828 bool failArgs =
false;
832 if (
cmd[0] ==
'-' ||
cmd[0] ==
'/')
844 if (
argc - (
n + 1) >= 6 &&
argc - (
n + 1) <= 8)
875 sei.
fMask |= 0x00001000;
877 sei.
fMask |= 0x00002000;
880 sei.
fMask |= 0x08000000;
926 UINT cmf = 0, nosub = 0, fakeinit = 0;
932 cmf |= CMF_DEFAULTONLY;
934 cmf |= CMF_NODEFAULT;
936 cmf |= CMF_DONOTPICKDEFAULT;
938 cmf |= CMF_EXTENDEDVERBS;
940 cmf |= CMF_SYNCCASCADEMENU;
944 cmf |= CMF_VERBSONLY;
948 cmf |= CMF_DISABLEDVERBS;
950 cmf |= CMF_OPTIMIZEFORINVOKE;
952 cmf |= CMF_CANRENAME;
961 hr = cm->QueryContextMenu(hMenu, 0,
first,
last, cmf);
1039 CLSID EmptyCLSID = { 0 };
1063 wprintf(
L"IShellPropSheetExt->AddPages failed: 0x%x\n",
hr);
1070 psh.
dwSize =
sizeof(psh);
1075 psh.
nStartPage = ActivePage ? (ActivePage-1) : 0;
1078 wprintf(
L"PropertySheetW returned: 0x%x\n",
hr);
1089 CMINVOKECOMMANDINFO cm = {
sizeof(cm), 0 };
1092 hr = spContextMenu->InvokeCommand(&cm);
1096 wprintf(
L"IContextMenu->InvokeCommand failed: 0x%x\n",
hr);
1099 wprintf(
L"IContextMenu->InvokeCommand returned: 0x%x\n",
hr);
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)