ReactOS 0.4.16-dev-122-g325d74c
CShellLink.cpp File Reference
#include "precomp.h"
#include <appmgmt.h>
#include "pshpack1.h"
#include "poppack.h"
Include dependency graph for CShellLink.cpp:

Go to the source code of this file.

Classes

struct  LOCATION_INFO
 
struct  LOCAL_VOLUME_INFO
 
struct  volume_info
 

Macros

#define ICON_LINK_WINDOWS_COMPAT
 
#define SHLINK_LOCAL   0
 
#define SHLINK_REMOTE   1
 

Functions

 WINE_DEFAULT_DEBUG_CHANNEL (shell)
 
static HRESULT ShellLink_UpdatePath (LPCWSTR sPathRel, LPCWSTR path, LPCWSTR sWorkDir, LPWSTR *psPath)
 
static LPWSTR __inline HEAP_strdupAtoW (HANDLE heap, DWORD flags, LPCSTR str)
 
static LPWSTR __inline strdupW (LPCWSTR src)
 
static HRESULT Stream_LoadString (IStream *stm, BOOL unicode, LPWSTR *pstr)
 
static BOOL ShellLink_GetVolumeInfo (LPCWSTR path, CShellLink::volume_info *volume)
 
static HRESULT Stream_ReadChunk (IStream *stm, LPVOID *data)
 
static BOOL Stream_LoadVolume (LOCAL_VOLUME_INFO *vol, CShellLink::volume_info *volume)
 
static LPWSTR Stream_LoadPath (LPCSTR p, DWORD maxlen)
 
static HRESULT Stream_LoadLocation (IStream *stm, CShellLink::volume_info *volume, LPWSTR *path)
 
static HRESULT Stream_WriteString (IStream *stm, LPCWSTR str)
 
static HRESULT Stream_WriteLocationInfo (IStream *stm, LPCWSTR path, CShellLink::volume_info *volume)
 
static BOOL SHELL_ExistsFileW (LPCWSTR path)
 
static LPWSTR shelllink_get_msi_component_path (LPWSTR component)
 
static HRESULT SHELL_PidlGetIconLocationW (PCIDLIST_ABSOLUTE pidl, UINT uFlags, PWSTR pszIconFile, UINT cchMax, int *piIndex, UINT *pwFlags)
 
static LPWSTR GetAdvertisedArg (LPCWSTR str)
 
INT_PTR CALLBACK ExtendedShortcutProc (HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
 
static void GetTypeDescriptionByPath (PCWSTR pszFullPath, DWORD fAttributes, PWSTR szBuf, UINT cchBuf)
 
HRESULT WINAPI IShellLink_ConstructFromPath (WCHAR *path, REFIID riid, LPVOID *ppv)
 
HRESULT WINAPI IShellLink_ConstructFromFile (IShellFolder *psf, LPCITEMIDLIST pidl, REFIID riid, LPVOID *ppv)
 

Macro Definition Documentation

◆ ICON_LINK_WINDOWS_COMPAT

#define ICON_LINK_WINDOWS_COMPAT

Definition at line 152 of file CShellLink.cpp.

◆ SHLINK_LOCAL

#define SHLINK_LOCAL   0

Definition at line 154 of file CShellLink.cpp.

◆ SHLINK_REMOTE

#define SHLINK_REMOTE   1

Definition at line 155 of file CShellLink.cpp.

Function Documentation

◆ ExtendedShortcutProc()

INT_PTR CALLBACK ExtendedShortcutProc ( HWND  hwndDlg,
UINT  uMsg,
WPARAM  wParam,
LPARAM  lParam 
)

Definition at line 2686 of file CShellLink.cpp.

2688{
2689 switch(uMsg)
2690 {
2691 case WM_INITDIALOG:
2692 if (lParam)
2693 {
2694 HWND hDlgCtrl = GetDlgItem(hwndDlg, IDC_SHORTEX_RUN_DIFFERENT);
2695 SendMessage(hDlgCtrl, BM_SETCHECK, BST_CHECKED, 0);
2696 }
2697 return TRUE;
2698 case WM_COMMAND:
2699 {
2700 HWND hDlgCtrl = GetDlgItem(hwndDlg, IDC_SHORTEX_RUN_DIFFERENT);
2701 if (LOWORD(wParam) == IDOK)
2702 {
2703 if (SendMessage(hDlgCtrl, BM_GETCHECK, 0, 0) == BST_CHECKED)
2704 EndDialog(hwndDlg, 1);
2705 else
2706 EndDialog(hwndDlg, 0);
2707 }
2708 else if (LOWORD(wParam) == IDCANCEL)
2709 {
2710 EndDialog(hwndDlg, -1);
2711 }
2713 {
2714 if (SendMessage(hDlgCtrl, BM_GETCHECK, 0, 0) == BST_CHECKED)
2715 SendMessage(hDlgCtrl, BM_SETCHECK, BST_UNCHECKED, 0);
2716 else
2717 SendMessage(hDlgCtrl, BM_SETCHECK, BST_CHECKED, 0);
2718 }
2719 }
2720 }
2721 return FALSE;
2722}
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define LOWORD(l)
Definition: pedump.c:82
#define IDC_SHORTEX_RUN_DIFFERENT
Definition: shresdef.h:482
#define IDCANCEL
Definition: winuser.h:834
#define BST_UNCHECKED
Definition: winuser.h:199
#define WM_COMMAND
Definition: winuser.h:1743
#define WM_INITDIALOG
Definition: winuser.h:1742
HWND WINAPI GetDlgItem(_In_opt_ HWND, _In_ int)
#define IDOK
Definition: winuser.h:833
#define BM_SETCHECK
Definition: winuser.h:1924
#define SendMessage
Definition: winuser.h:5855
#define BST_CHECKED
Definition: winuser.h:197
#define BM_GETCHECK
Definition: winuser.h:1921
BOOL WINAPI EndDialog(_In_ HWND, _In_ INT_PTR)

Referenced by CShellLink::OnCommand().

◆ GetAdvertisedArg()

static LPWSTR GetAdvertisedArg ( LPCWSTR  str)
static

Definition at line 2051 of file CShellLink.cpp.

2052{
2053 if (!str)
2054 return NULL;
2055
2056 LPCWSTR p = wcschr(str, L':');
2057 if (!p)
2058 return NULL;
2059
2060 DWORD len = p - str;
2061 LPWSTR ret = (LPWSTR)HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR) * (len + 1));
2062 if (!ret)
2063 return ret;
2064
2065 memcpy(ret, str, sizeof(WCHAR)*len);
2066 ret[len] = 0;
2067 return ret;
2068}
#define NULL
Definition: types.h:112
#define wcschr
Definition: compat.h:17
#define GetProcessHeap()
Definition: compat.h:736
#define HeapAlloc
Definition: compat.h:733
unsigned long DWORD
Definition: ntddk_ex.h:95
GLfloat GLfloat p
Definition: glext.h:8902
GLenum GLsizei len
Definition: glext.h:6722
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
#define L(x)
Definition: ntvdm.h:50
const WCHAR * str
int ret
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185

Referenced by CShellLink::SetAdvertiseInfo().

◆ GetTypeDescriptionByPath()

static void GetTypeDescriptionByPath ( PCWSTR  pszFullPath,
DWORD  fAttributes,
PWSTR  szBuf,
UINT  cchBuf 
)
static

Definition at line 2724 of file CShellLink.cpp.

2725{
2726 if (fAttributes == INVALID_FILE_ATTRIBUTES && !PathFileExistsAndAttributesW(pszFullPath, &fAttributes))
2727 fAttributes = 0;
2728
2729 SHFILEINFOW fi;
2730 if (!SHGetFileInfoW(pszFullPath, fAttributes, &fi, sizeof(fi), SHGFI_TYPENAME | SHGFI_USEFILEATTRIBUTES))
2731 {
2732 ERR("SHGetFileInfoW failed for %ls (%lu)\n", pszFullPath, GetLastError());
2733 fi.szTypeName[0] = UNICODE_NULL;
2734 }
2735
2736 BOOL fFolder = (fAttributes & FILE_ATTRIBUTE_DIRECTORY);
2737 LPCWSTR pwszExt = fFolder ? L"" : PathFindExtensionW(pszFullPath);
2738 if (pwszExt[0])
2739 {
2740 if (!fi.szTypeName[0])
2741 StringCchPrintfW(szBuf, cchBuf, L"%s", pwszExt + 1);
2742 else
2743 StringCchPrintfW(szBuf, cchBuf, L"%s (%s)", fi.szTypeName, pwszExt);
2744 }
2745 else
2746 {
2747 StringCchPrintfW(szBuf, cchBuf, L"%s", fi.szTypeName);
2748 }
2749}
#define ERR(fmt,...)
Definition: precomp.h:57
LPWSTR WINAPI PathFindExtensionW(LPCWSTR lpszPath)
Definition: path.c:447
BOOL WINAPI PathFileExistsAndAttributesW(LPCWSTR lpszPath, DWORD *dwAttr)
Definition: path.c:1832
unsigned int BOOL
Definition: ntddk_ex.h:94
#define FILE_ATTRIBUTE_DIRECTORY
Definition: nt_native.h:705
#define UNICODE_NULL
DWORD_PTR WINAPI SHGetFileInfoW(LPCWSTR path, DWORD dwFileAttributes, SHFILEINFOW *psfi, UINT sizeofpsfi, UINT flags)
Definition: shell32_main.c:414
#define SHGFI_TYPENAME
Definition: shellapi.h:167
#define SHGFI_USEFILEATTRIBUTES
Definition: shellapi.h:181
STRSAFEAPI StringCchPrintfW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszFormat,...)
Definition: strsafe.h:530
WCHAR szTypeName[80]
Definition: shellapi.h:376
#define INVALID_FILE_ATTRIBUTES
Definition: vfdcmd.c:23
DWORD WINAPI GetLastError(void)
Definition: except.c:1042

Referenced by CShellLink::OnInitDialog().

◆ HEAP_strdupAtoW()

static LPWSTR __inline HEAP_strdupAtoW ( HANDLE  heap,
DWORD  flags,
LPCSTR  str 
)
static

Definition at line 194 of file CShellLink.cpp.

195{
196 INT len;
197 LPWSTR p;
198
199 assert(str);
200
201 len = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0);
202 p = (LPWSTR)HeapAlloc(heap, flags, len * sizeof(WCHAR));
203 if (!p)
204 return p;
206 return p;
207}
#define CP_ACP
Definition: compat.h:109
#define MultiByteToWideChar
Definition: compat.h:110
#define assert(x)
Definition: debug.h:53
GLbitfield flags
Definition: glext.h:7161
static HANDLE heap
Definition: heap.c:65
int32_t INT
Definition: typedefs.h:58

Referenced by CShellLink::Extract(), CShellLink::SetArguments(), CShellLink::SetDescription(), CShellLink::SetIconLocation(), CShellLink::SetPath(), CShellLink::SetRelativePath(), and CShellLink::SetWorkingDirectory().

◆ IShellLink_ConstructFromFile()

HRESULT WINAPI IShellLink_ConstructFromFile ( IShellFolder psf,
LPCITEMIDLIST  pidl,
REFIID  riid,
LPVOID ppv 
)

Definition at line 3206 of file CShellLink.cpp.

3207{
3209 if (!ILGetDisplayNameExW(psf, pidl, path, 0))
3210 return E_FAIL;
3211
3213}
#define E_FAIL
Definition: ddrawi.h:102
#define MAX_PATH
Definition: compat.h:34
REFIID riid
Definition: atlbase.h:39
REFIID LPVOID * ppv
Definition: atlbase.h:39
BOOL ILGetDisplayNameExW(LPSHELLFOLDER psf, LPCITEMIDLIST pidl, LPWSTR path, DWORD type)
Definition: pidl.c:100

◆ IShellLink_ConstructFromPath()

HRESULT WINAPI IShellLink_ConstructFromPath ( WCHAR path,
REFIID  riid,
LPVOID ppv 
)

Definition at line 3192 of file CShellLink.cpp.

3193{
3195 HRESULT hr = CShellLink::_CreatorClass::CreateInstance(NULL, IID_PPV_ARG(IPersistFile, &ppf));
3196 if (FAILED(hr))
3197 return hr;
3198
3199 hr = ppf->Load(path, 0);
3200 if (FAILED(hr))
3201 return hr;
3202
3203 return ppf->QueryInterface(riid, ppv);
3204}
#define FAILED(hr)
Definition: intsafe.h:51
HRESULT hr
Definition: shlfolder.c:183
#define IID_PPV_ARG(Itype, ppType)

Referenced by CFSDropTarget::_DoDrop(), IShellLink_ConstructFromFile(), and SHAddToRecentDocs().

◆ SHELL_ExistsFileW()

static BOOL SHELL_ExistsFileW ( LPCWSTR  path)
static

Definition at line 1039 of file CShellLink.cpp.

1040{
1042 return FALSE;
1043
1044 return TRUE;
1045}
DWORD WINAPI GetFileAttributesW(LPCWSTR lpFileName)
Definition: fileinfo.c:652

Referenced by ShellLink_UpdatePath().

◆ SHELL_PidlGetIconLocationW()

static HRESULT SHELL_PidlGetIconLocationW ( PCIDLIST_ABSOLUTE  pidl,
UINT  uFlags,
PWSTR  pszIconFile,
UINT  cchMax,
int piIndex,
UINT pwFlags 
)
static

Definition at line 1729 of file CShellLink.cpp.

1731{
1732 LPCITEMIDLIST pidlLast;
1734
1735 HRESULT hr = SHBindToParent(pidl, IID_PPV_ARG(IShellFolder, &psf), &pidlLast);
1737 return hr;
1738
1740 hr = psf->GetUIObjectOf(0, 1, &pidlLast, IID_NULL_PPV_ARG(IExtractIconW, &pei));
1742 return hr;
1743
1744 hr = pei->GetIconLocation(uFlags, pszIconFile, cchMax, piIndex, pwFlags);
1746 return hr;
1747
1748 return S_OK;
1749}
UINT cchMax
UINT uFlags
Definition: api.c:59
#define FAILED_UNEXPECTEDLY(hr)
Definition: precomp.h:121
#define S_OK
Definition: intsafe.h:52
HRESULT WINAPI SHBindToParent(LPCITEMIDLIST pidl, REFIID riid, LPVOID *ppv, LPCITEMIDLIST *ppidlLast)
Definition: pidl.c:1356
const ITEMIDLIST UNALIGNED * LPCITEMIDLIST
Definition: shtypes.idl:42
#define IID_NULL_PPV_ARG(Itype, ppType)

Referenced by CShellLink::GetIconLocation().

◆ shelllink_get_msi_component_path()

static LPWSTR shelllink_get_msi_component_path ( LPWSTR  component)
static

Definition at line 1407 of file CShellLink.cpp.

1408{
1409 DWORD Result, sz = 0;
1410
1411 Result = CommandLineFromMsiDescriptor(component, NULL, &sz);
1412 if (Result != ERROR_SUCCESS)
1413 return NULL;
1414
1415 sz++;
1416 LPWSTR path = (LPWSTR)HeapAlloc(GetProcessHeap(), 0, sz * sizeof(WCHAR));
1417 Result = CommandLineFromMsiDescriptor(component, path, &sz);
1418 if (Result != ERROR_SUCCESS)
1419 {
1421 path = NULL;
1422 }
1423
1424 TRACE("returning %s\n", debugstr_w(path));
1425
1426 return path;
1427}
#define ERROR_SUCCESS
Definition: deptool.c:10
DWORD WINAPI CommandLineFromMsiDescriptor(WCHAR *szDescriptor, WCHAR *szCommandLine, DWORD *pcchCommandLine)
Definition: msi.c:22
#define HeapFree(x, y, z)
Definition: compat.h:735
#define debugstr_w
Definition: kernel32.h:32
#define TRACE(s)
Definition: solgame.cpp:4
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO
Definition: wsk.h:409

Referenced by CShellLink::Resolve().

◆ ShellLink_GetVolumeInfo()

static BOOL ShellLink_GetVolumeInfo ( LPCWSTR  path,
CShellLink::volume_info volume 
)
static

Definition at line 473 of file CShellLink.cpp.

474{
475 WCHAR drive[4] = { path[0], ':', '\\', 0 };
476
477 volume->type = GetDriveTypeW(drive);
478 BOOL bRet = GetVolumeInformationW(drive, volume->label, _countof(volume->label), &volume->serial, NULL, NULL, NULL, 0);
479 TRACE("ret = %d type %d serial %08x name %s\n", bRet,
480 volume->type, volume->serial, debugstr_w(volume->label));
481 return bRet;
482}
UINT WINAPI GetDriveTypeW(IN LPCWSTR lpRootPathName)
Definition: disk.c:497
BOOL WINAPI GetVolumeInformationW(IN LPCWSTR lpRootPathName, IN LPWSTR lpVolumeNameBuffer, IN DWORD nVolumeNameSize, OUT LPDWORD lpVolumeSerialNumber OPTIONAL, OUT LPDWORD lpMaximumComponentLength OPTIONAL, OUT LPDWORD lpFileSystemFlags OPTIONAL, OUT LPWSTR lpFileSystemNameBuffer OPTIONAL, IN DWORD nFileSystemNameSize)
Definition: volume.c:226
#define _countof(array)
Definition: sndvol32.h:70

Referenced by CShellLink::SetTargetFromPIDLOrPath().

◆ ShellLink_UpdatePath()

static HRESULT ShellLink_UpdatePath ( LPCWSTR  sPathRel,
LPCWSTR  path,
LPCWSTR  sWorkDir,
LPWSTR psPath 
)
static

Definition at line 1051 of file CShellLink.cpp.

1052{
1053 if (!path || !psPath)
1054 return E_INVALIDARG;
1055
1056 if (!*psPath && sPathRel)
1057 {
1058 WCHAR buffer[2*MAX_PATH], abs_path[2*MAX_PATH];
1059 LPWSTR final = NULL;
1060
1061 /* first try if [directory of link file] + [relative path] finds an existing file */
1062
1063 GetFullPathNameW(path, MAX_PATH * 2, buffer, &final);
1064 if (!final)
1065 final = buffer;
1066 wcscpy(final, sPathRel);
1067
1068 *abs_path = '\0';
1069
1071 {
1072 if (!GetFullPathNameW(buffer, MAX_PATH, abs_path, &final))
1073 wcscpy(abs_path, buffer);
1074 }
1075 else
1076 {
1077 /* try if [working directory] + [relative path] finds an existing file */
1078 if (sWorkDir)
1079 {
1080 wcscpy(buffer, sWorkDir);
1081 wcscpy(PathAddBackslashW(buffer), sPathRel);
1082
1084 if (!GetFullPathNameW(buffer, MAX_PATH, abs_path, &final))
1085 wcscpy(abs_path, buffer);
1086 }
1087 }
1088
1089 /* FIXME: This is even not enough - not all shell links can be resolved using this algorithm. */
1090 if (!*abs_path)
1091 wcscpy(abs_path, sPathRel);
1092
1093 *psPath = strdupW(abs_path);
1094 if (!*psPath)
1095 return E_OUTOFMEMORY;
1096 }
1097
1098 return S_OK;
1099}
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_INVALIDARG
Definition: ddrawi.h:101
DWORD WINAPI GetFullPathNameW(IN LPCWSTR lpFileName, IN DWORD nBufferLength, OUT LPWSTR lpBuffer, OUT LPWSTR *lpFilePart)
Definition: path.c:1106
GLuint buffer
Definition: glext.h:5915
#define PathAddBackslashW
Definition: pathcch.h:301
_CRTIMP wchar_t *__cdecl wcscpy(_Out_writes_z_(_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)

Referenced by CShellLink::Load(), and CShellLink::SetRelativePath().

◆ strdupW()

static LPWSTR __inline strdupW ( LPCWSTR  src)
static

Definition at line 209 of file CShellLink.cpp.

210{
211 LPWSTR dest;
212 if (!src) return NULL;
213 dest = (LPWSTR)HeapAlloc(GetProcessHeap(), 0, (wcslen(src) + 1) * sizeof(WCHAR));
214 if (dest)
215 wcscpy(dest, src);
216 return dest;
217}
GLenum src
Definition: glext.h:6340
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
static char * dest
Definition: rtl.c:135

Referenced by ShellLink_UpdatePath().

◆ Stream_LoadLocation()

static HRESULT Stream_LoadLocation ( IStream stm,
CShellLink::volume_info volume,
LPWSTR path 
)
static

Definition at line 554 of file CShellLink.cpp.

556{
557 char *p = NULL;
558 HRESULT hr = Stream_ReadChunk(stm, (LPVOID*) &p);
559 if (FAILED(hr))
560 return hr;
561
562 LOCATION_INFO *loc = reinterpret_cast<LOCATION_INFO *>(p);
563 if (loc->dwTotalSize < sizeof(LOCATION_INFO))
564 {
566 return E_FAIL;
567 }
568
569 /* if there's valid local volume information, load it */
570 if (loc->dwVolTableOfs &&
571 ((loc->dwVolTableOfs + sizeof(LOCAL_VOLUME_INFO)) <= loc->dwTotalSize))
572 {
574
577 }
578
579 /* if there's a local path, load it */
580 DWORD n = loc->dwLocalPathOfs;
581 if (n && n < loc->dwTotalSize)
582 *path = Stream_LoadPath(&p[n], loc->dwTotalSize - n);
583
584 TRACE("type %d serial %08x name %s path %s\n", volume->type,
585 volume->serial, debugstr_w(volume->label), debugstr_w(*path));
586
588 return S_OK;
589}
GLdouble n
Definition: glext.h:7729
DWORD dwLocalPathOfs
Definition: CShellLink.cpp:167
DWORD dwVolTableOfs
Definition: CShellLink.cpp:166

Referenced by CShellLink::Load().

◆ Stream_LoadPath()

static LPWSTR Stream_LoadPath ( LPCSTR  p,
DWORD  maxlen 
)
static

Definition at line 537 of file CShellLink.cpp.

538{
539 UINT len = 0;
540
541 while (len < maxlen && p[len])
542 len++;
543
544 UINT wlen = MultiByteToWideChar(CP_ACP, 0, p, len, NULL, 0);
545 LPWSTR path = (LPWSTR)HeapAlloc(GetProcessHeap(), 0, (wlen + 1) * sizeof(WCHAR));
546 if (!path)
547 return NULL;
548 MultiByteToWideChar(CP_ACP, 0, p, len, path, wlen);
549 path[wlen] = 0;
550
551 return path;
552}
unsigned int UINT
Definition: ndis.h:50

Referenced by Stream_LoadLocation().

◆ Stream_LoadString()

static HRESULT Stream_LoadString ( IStream stm,
BOOL  unicode,
LPWSTR pstr 
)
static

Definition at line 416 of file CShellLink.cpp.

417{
418 TRACE("%p\n", stm);
419
420 USHORT len;
421 DWORD count = 0;
422 HRESULT hr = stm->Read(&len, sizeof(len), &count);
423 if (FAILED(hr) || count != sizeof(len))
424 return E_FAIL;
425
426 if (unicode)
427 len *= sizeof(WCHAR);
428
429 TRACE("reading %d\n", len);
430 LPSTR temp = (LPSTR)HeapAlloc(GetProcessHeap(), 0, len + sizeof(WCHAR));
431 if (!temp)
432 return E_OUTOFMEMORY;
433 count = 0;
434 hr = stm->Read(temp, len, &count);
435 if (FAILED(hr) || count != len)
436 {
438 return E_FAIL;
439 }
440
441 TRACE("read %s\n", debugstr_an(temp, len));
442
443 /* convert to unicode if necessary */
444 LPWSTR str;
445 if (!unicode)
446 {
448 str = (LPWSTR)HeapAlloc(GetProcessHeap(), 0, (count + 1) * sizeof(WCHAR));
449 if (!str)
450 {
452 return E_OUTOFMEMORY;
453 }
456 }
457 else
458 {
459 count /= sizeof(WCHAR);
460 str = (LPWSTR)temp;
461 }
462 str[count] = 0;
463
464 *pstr = str;
465
466 return S_OK;
467}
static __inline const char * debugstr_an(const char *s, int n)
Definition: compat.h:55
GLuint GLuint GLsizei count
Definition: gl.h:1545
HRESULT Read([out, size_is(cb), length_is(*pcbRead)] void *pv, [in] ULONG cb, [out] ULONG *pcbRead)
unsigned short USHORT
Definition: pedump.c:61
static calc_node_t temp
Definition: rpn_ieee.c:38
char * LPSTR
Definition: xmlstorage.h:182

Referenced by CShellLink::Load().

◆ Stream_LoadVolume()

static BOOL Stream_LoadVolume ( LOCAL_VOLUME_INFO vol,
CShellLink::volume_info volume 
)
static

Definition at line 519 of file CShellLink.cpp.

520{
521 volume->serial = vol->dwVolSerial;
522 volume->type = vol->dwType;
523
524 if (!vol->dwVolLabelOfs)
525 return FALSE;
526 if (vol->dwSize <= vol->dwVolLabelOfs)
527 return FALSE;
528 INT len = vol->dwSize - vol->dwVolLabelOfs;
529
530 LPSTR label = (LPSTR)vol;
531 label += vol->dwVolLabelOfs;
533
534 return TRUE;
535}
static const WCHAR label[]
Definition: itemdlg.c:1546

Referenced by Stream_LoadLocation().

◆ Stream_ReadChunk()

static HRESULT Stream_ReadChunk ( IStream stm,
LPVOID data 
)
static

Definition at line 484 of file CShellLink.cpp.

485{
486 struct sized_chunk
487 {
488 DWORD size;
489 unsigned char data[1];
490 } *chunk;
491
492 TRACE("%p\n", stm);
493
494 DWORD size;
495 ULONG count;
496 HRESULT hr = stm->Read(&size, sizeof(size), &count);
497 if (FAILED(hr) || count != sizeof(size))
498 return E_FAIL;
499
500 chunk = static_cast<sized_chunk *>(HeapAlloc(GetProcessHeap(), 0, size));
501 if (!chunk)
502 return E_OUTOFMEMORY;
503
504 chunk->size = size;
505 hr = stm->Read(chunk->data, size - sizeof(size), &count);
506 if (FAILED(hr) || count != (size - sizeof(size)))
507 {
509 return E_FAIL;
510 }
511
512 TRACE("Read %d bytes\n", chunk->size);
513
514 *data = chunk;
515
516 return S_OK;
517}
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
GLsizeiptr size
Definition: glext.h:5919
uint16_t size
Definition: btrfs_drv.h:563
uint32_t ULONG
Definition: typedefs.h:59

Referenced by Stream_LoadLocation().

◆ Stream_WriteLocationInfo()

static HRESULT Stream_WriteLocationInfo ( IStream stm,
LPCWSTR  path,
CShellLink::volume_info volume 
)
static

Definition at line 836 of file CShellLink.cpp.

838{
840 LOCATION_INFO *loc;
841
842 TRACE("%p %s %p\n", stm, debugstr_w(path), volume);
843
844 /* figure out the size of everything */
845 DWORD label_size = WideCharToMultiByte(CP_ACP, 0, volume->label, -1,
846 NULL, 0, NULL, NULL);
847 DWORD path_size = WideCharToMultiByte(CP_ACP, 0, path, -1,
848 NULL, 0, NULL, NULL);
849 DWORD volume_info_size = sizeof(*vol) + label_size;
850 DWORD final_path_size = 1;
851 DWORD total_size = sizeof(*loc) + volume_info_size + path_size + final_path_size;
852
853 /* create pointers to everything */
854 loc = static_cast<LOCATION_INFO *>(HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, total_size));
855 vol = (LOCAL_VOLUME_INFO*) &loc[1];
856 LPSTR szLabel = (LPSTR) &vol[1];
857 LPSTR szPath = &szLabel[label_size];
858 LPSTR szFinalPath = &szPath[path_size];
859
860 /* fill in the location information header */
861 loc->dwTotalSize = total_size;
862 loc->dwHeaderSize = sizeof(*loc);
863 loc->dwFlags = 1;
864 loc->dwVolTableOfs = sizeof(*loc);
865 loc->dwLocalPathOfs = sizeof(*loc) + volume_info_size;
866 loc->dwNetworkVolTableOfs = 0;
867 loc->dwFinalPathOfs = sizeof(*loc) + volume_info_size + path_size;
868
869 /* fill in the volume information */
870 vol->dwSize = volume_info_size;
871 vol->dwType = volume->type;
872 vol->dwVolSerial = volume->serial;
873 vol->dwVolLabelOfs = sizeof(*vol);
874
875 /* copy in the strings */
876 WideCharToMultiByte(CP_ACP, 0, volume->label, -1,
877 szLabel, label_size, NULL, NULL);
879 szPath, path_size, NULL, NULL);
880 *szFinalPath = 0;
881
882 ULONG count = 0;
883 HRESULT hr = stm->Write(loc, total_size, &count);
884 HeapFree(GetProcessHeap(), 0, loc);
885
886 return hr;
887}
#define WideCharToMultiByte
Definition: compat.h:111
#define HEAP_ZERO_MEMORY
Definition: compat.h:134
HRESULT Write([in, size_is(cb)] const void *pv, [in] ULONG cb, [out] ULONG *pcbWritten)
LPCWSTR szPath
Definition: env.c:37
DWORD dwHeaderSize
Definition: CShellLink.cpp:164
DWORD dwFinalPathOfs
Definition: CShellLink.cpp:169
DWORD dwNetworkVolTableOfs
Definition: CShellLink.cpp:168

Referenced by CShellLink::Save().

◆ Stream_WriteString()

static HRESULT Stream_WriteString ( IStream stm,
LPCWSTR  str 
)
static

Definition at line 801 of file CShellLink.cpp.

802{
804 USHORT len;
805 DWORD count;
806
807 length = wcslen(str) + 1;
808 if (length > MAXUSHORT)
809 {
810 return E_INVALIDARG;
811 }
812
813 len = (USHORT)length;
814 HRESULT hr = stm->Write(&len, sizeof(len), &count);
815 if (FAILED(hr))
816 return hr;
817
818 length *= sizeof(WCHAR);
819
820 hr = stm->Write(str, (ULONG)length, &count);
821 if (FAILED(hr))
822 return hr;
823
824 return S_OK;
825}
GLuint GLsizei GLsizei * length
Definition: glext.h:6040
ULONG_PTR SIZE_T
Definition: typedefs.h:80
#define MAXUSHORT
Definition: typedefs.h:83

Referenced by CShellLink::Save().

◆ WINE_DEFAULT_DEBUG_CHANNEL()

WINE_DEFAULT_DEBUG_CHANNEL ( shell  )