33 PWSTR tmpField = strField;
38 cChar = *strFieldSource;
39 while (cChar ==
L' ' || cChar ==
L'\t' || cChar ==
L'\n' || cChar ==
L'\r')
41 strFieldSource =
CharNextW(strFieldSource);
42 cChar = *strFieldSource;
45 while (cChar && cChar !=
L'=' && cChar !=
L',')
50 if (inQuote && strFieldSource[1] ==
L'"')
52 if (lenField < cchField)
69 if (inQuote || (cChar !=
L'=' && cChar !=
L','))
71 if (lenField < cchField)
74 *(tmpField++) = cChar;
80 strFieldSource =
CharNextW(strFieldSource);
81 cChar = *strFieldSource;
85 while (tmpField > strField)
89 if (cChar !=
L' ' && cChar !=
L'\t' && cChar !=
L'\n' && cChar !=
L'\r')
104 PCWSTR strFieldSource = *pstrFieldSource;
105 WCHAR cChar = *strFieldSource;
110 if (!inQuote && (cChar ==
L'=' || cChar ==
L','))
116 strFieldSource =
CharNextW(strFieldSource);
117 cChar = *strFieldSource;
122 *pstrFieldSource = strFieldSource;
126 *pstrFieldSource =
CharNextW(strFieldSource);
135 PCWSTR tmpArgs = strFieldSource;
136 WCHAR cChar = *tmpArgs;
153 if (*tmpArgs ==
L'=' && !inQuote)
155 strFieldSource = ++tmpArgs;
156 TRACE(
"Skipped content before the first '=', remainder=%S\n", strFieldSource);
159 return strFieldSource;
176 if (*strField !=
L':')
211 WCHAR guid [] =
L"::{450d8fba-ad25-11d0-98a8-0800361b1103}";
244 if (!pInfo->pidlPath)
263 TRACE(
"CmdLine Parser: Parsed %S flag. dwFlags=%08lx\n", strField, pInfo->dwFlags);
268 TRACE(
"CmdLine Parser: Parsed %S flag. dwFlags=%08lx\n", strField, pInfo->dwFlags);
273 TRACE(
"CmdLine Parser: Parsed %S flag. dwFlags=%08lx\n", strField, pInfo->dwFlags);
275 else if (!
StrCmpIW(strField,
L"/SELECT"))
278 TRACE(
"CmdLine Parser: Parsed %S flag. dwFlags=%08lx\n", strField, pInfo->dwFlags);
283 TRACE(
"CmdLine Parser: Parsed %S flag. dwFlags=%08lx\n", strField, pInfo->dwFlags);
285 else if (!
StrCmpIW(strField,
L"-embedding"))
288 TRACE(
"CmdLine Parser: Parsed %S flag. dwFlags=%08lx\n", strField, pInfo->dwFlags);
290 else if (!
StrCmpIW(strField,
L"/SEPARATE"))
293 TRACE(
"CmdLine Parser: Parsed %S flag. dwFlags=%08lx\n", strField, pInfo->dwFlags);
295 else if (!
StrCmpIW(strField,
L"/INPROC"))
299 TRACE(
"CmdLine Parser: Found %S flag\n", strField);
311 TRACE(
"CmdLine Parser: Parsed /INPROC flag. dwFlags=%08lx, guidInproc=%S\n", pInfo->dwFlags, strField);
319 TRACE(
"CmdLine Parser: Found %S flag\n", strField);
341 pInfo->pidlRoot = pidlRoot;
347 pInfo->pidlRoot =
NULL;
352 TRACE(
"CmdLine Parser: Parsed /ROOT flag. dwFlags=%08lx, pidlRoot=%p\n", pInfo->dwFlags, pInfo->pidlRoot);
357 TRACE(
"CmdLine Parser: Found target path %S\n", strField);
374 pInfo->pidlPath = pidlArg;
376 TRACE(
"CmdLine Parser: Parsed target path. dwFlags=%08lx, pidlPath=%p\n", pInfo->dwFlags, pInfo->pidlPath);
393 pInfo->pidlPath = pidlPath;
398 TRACE(
"CmdLine Parser: Parsed target path. dwFlags=%08lx, pidlPath=%p\n", pInfo->dwFlags, pInfo->pidlPath);
407 pInfo->strPath =
field;
411 TRACE(
"CmdLine Parser: Parsed target path. dwFlags=%08lx, strPath=%S\n", pInfo->dwFlags,
field);
HRESULT WINAPI SHGetDesktopFolder(IShellFolder **psf)
#define SH_EXPLORER_CMDLINE_FLAG_EMBED
#define SH_EXPLORER_CMDLINE_FLAG_NEWWND
#define SH_EXPLORER_CMDLINE_FLAG_IDLIST
#define SH_EXPLORER_CMDLINE_FLAG_NOUI
#define SH_EXPLORER_CMDLINE_FLAG_INPROC
#define SH_EXPLORER_CMDLINE_FLAG_STRING
#define SH_EXPLORER_CMDLINE_FLAG_NOREUSE
#define SH_EXPLORER_CMDLINE_FLAG_SEPARATE
#define SH_EXPLORER_CMDLINE_FLAG_E
#define SH_EXPLORER_CMDLINE_FLAG_SELECT
#define SH_EXPLORER_CMDLINE_FLAG_S
INT WINAPI StrToIntW(LPCWSTR lpString)
LPWSTR WINAPI StrChrW(LPCWSTR lpszStr, WCHAR ch)
DWORD WINAPI GetFullPathNameW(IN LPCWSTR lpFileName, IN DWORD nBufferLength, OUT LPWSTR lpBuffer, OUT LPWSTR *lpFilePart)
UINT WINAPI GetWindowsDirectoryW(OUT LPWSTR lpBuffer, IN UINT uSize)
BOOL WINAPI PathStripToRootW(WCHAR *path)
WCHAR *WINAPI PathGetArgsW(const WCHAR *path)
BOOL WINAPI PathFileExistsW(const WCHAR *path)
LPWSTR WINAPI GetCommandLineW(void)
LPWSTR WINAPI CharPrevW(const WCHAR *start, const WCHAR *x)
LPWSTR WINAPI CharNextW(const WCHAR *x)
int WINAPI StrCmpIW(const WCHAR *str, const WCHAR *comp)
HRESULT WINAPI SHGetSpecialFolderLocation(HWND hwndOwner, INT nFolder, LPITEMIDLIST *ppidl)
PVOID WINAPI SHLockShared(HANDLE hShared, DWORD dwProcId)
BOOL WINAPI SHFreeShared(HANDLE hShared, DWORD dwProcId)
BOOL WINAPI SHUnlockShared(LPVOID lpView)
BOOL WINAPI PathIsDirectoryW(LPCWSTR lpszPath)
HRESULT WINAPI SHStrDupW(LPCWSTR src, LPWSTR *dest)
unsigned __int3264 UINT_PTR
UINT_PTR WINAPI SHExplorerParseCmdLine(_Out_ PEXPLORER_CMDLINE_PARSE_RESULTS pInfo)
static LPITEMIDLIST _ILReadFromSharedMemory(PCWSTR strField)
static HRESULT _ParsePathToPidl(PWSTR strPath, LPITEMIDLIST *pidl)
BOOL WINAPI GUIDFromStringW(_In_ PCWSTR psz, _Out_ LPGUID pguid)
static LPITEMIDLIST _GetDocumentsPidl()
static BOOL _FindNextArg(PCWSTR *pstrFieldSource)
static PCWSTR _FindFirstField(PCWSTR strFieldSource)
static BOOL _ReadNextArg(PCWSTR *pstrFieldSource, PWSTR strField, size_t cchField)
static BOOL _CopyAndUnquoteText(LPCWSTR strFieldSource, LPWSTR strField, size_t cchField)
LPITEMIDLIST WINAPI ILClone(LPCITEMIDLIST pidl)
void WINAPI ILFree(LPITEMIDLIST pidl)
LPITEMIDLIST WINAPI ILCreateFromPathW(LPCWSTR path)
#define CSIDL_MYDOCUMENTS
ITEMIDLIST UNALIGNED * LPITEMIDLIST
const ITEMIDLIST UNALIGNED * LPCITEMIDLIST
STRSAFEAPI StringCchCopyW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszSrc)
_In_ ULONG_PTR _In_ ULONG _Out_ ULONG_PTR * pid