22#define strcasecmp _stricmp
25#define SW_SHOWNORMAL 1
26#define SW_SHOWMINNOACTIVE 7
27#define CSIDL_WINDOWS 0x24
28#define CSIDL_SYSTEM 0x25
43#define DEFINE_GUID2(name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) const GUID name = { l,w1,w2,{ b1,b2,b3,b4,b5,b6,b7,b8 } }
44DEFINE_GUID2(CLSID_ShellLink,0x00021401L,0,0,0xC0,0,0,0,0,0,0,0x46);
45DEFINE_GUID2(CLSID_MyComputer,0x20D04FE0,0x3AEA,0x1069,0xA2,0xD8,0x08,0x00,0x2B,0x30,0x30,0x9D);
47#define LINK_ID_LIST 0x01
49#define LINK_DESCRIPTION 0x04
50#define LINK_RELATIVE_PATH 0x08
51#define LINK_WORKING_DIR 0x10
52#define LINK_CMD_LINE_ARGS 0x20
54#define LINK_UNICODE 0x80
56#define LOCATOR_LOCAL 0x1
57#define LOCATOR_NETWORK 0x2
102#define PT_DRIVE1 0x2F
103#define PT_FOLDER 0x31
134#define EXP_SPECIAL_FOLDER_SIG 0xA0000005
153 return c ==
'\\' ||
c ==
'/';
160 buf[
sizeof(
"shell:") - 1] =
'\0';
164 target +=
sizeof(
"shell:") - 1;
165 for (
unsigned long i = 0;; ++
i)
182 const char *pszOutputPath =
"shortcut.lnk";
183 const char *pszTarget =
NULL;
184 const char *pszDescription =
NULL;
185 const char *pszWorkingDir =
NULL;
186 const char *pszCmdLineArgs =
NULL;
187 const char *pszIcon =
NULL;
188 char targetpath[260];
191 int bHelp = 0, bMinimized = 0;
205 pszOutputPath =
argv[++
i];
207 pszDescription =
argv[++
i];
209 pszWorkingDir =
argv[++
i];
211 pszCmdLineArgs =
argv[++
i];
222 unsigned Data4Tmp[8],
j;
224 sscanf(
argv[++
i],
"{%8x-%4hx-%4hx-%2x%2x-%2x%2x%2x%2x%2x%2x}",
226 &Data4Tmp[0], &Data4Tmp[1], &Data4Tmp[2], &Data4Tmp[3],
227 &Data4Tmp[4], &Data4Tmp[5], &Data4Tmp[6], &Data4Tmp[7]);
228 for (
j = 0;
j < 8; ++
j)
235 if (!pszTarget || bHelp)
237 printf(
"Usage: %s [-o path][-d descr][-w path][-c cmd_line_args][-i icon_path [nr]][-h][-g guid] target\n"
238 "-o path\tSets output path\n"
239 "-d descr\tSets shortcut description\n"
240 "-w path\tSets working directory for executable\n"
241 "-c cmd_line_args\tSets command line arguments passed to program\n"
242 "-i icon_path [nr]\tSets icon file and optionally icon index\n"
243 "-m\tStart minimized\n"
244 "-g guid\tSets GUID to which target path is relative. Default value is MyComputer GUID.\n"
245 "target\tAbsolute or relative to guid specified with -g option path\n",
argv[0]);
252 printf(
"Failed to open %s\n", pszOutputPath);
259 Header.Guid = CLSID_ShellLink;
279 const char *pszName = pszTarget;
280 int index = 1, specialindex = -1;
288 Header.Flags &= ~LINK_RELATIVE_PATH;
289 CsidlBlock.
cbSize =
sizeof(CsidlBlock);
293 sprintf(targetpath,
"x:\\reactos\\%s", pszTarget +
sizeof(
"shell:") +
strlen(special->
name));
294 pszName = pszTarget = targetpath;
297 if (pszName[0] && pszName[0] !=
':' && pszName[1] ==
':')
300 cbListSize +=
sizeof(IdListDrive);
302 while (*pszName ==
'\\' || *pszName ==
'/')
312 if (
cchName != 1 || pszName[0] !=
'.')
313 cbListSize +=
sizeof(IdListFile) + 2 * (
cchName + 1);
315 if (++
index == specialindex)
318 pCsidlBlock = &CsidlBlock;
322 while (*pszName ==
'\\' || *pszName ==
'/')
329 IdListGuid.
Size =
sizeof(IdListGuid);
331 IdListGuid.
dummy = 0x50;
337 if (
isalpha(pszName[0]) && pszName[1] ==
':')
339 memset(&IdListDrive, 0,
sizeof(IdListDrive));
340 IdListDrive.
Size =
sizeof(IdListDrive);
343 fwrite(&IdListDrive,
sizeof(IdListDrive), 1,
pFile);
345 while(*pszName ==
'\\' || *pszName ==
'/')
355 if (
cchName != 1 || pszName[0] !=
'.')
357 memset(&IdListFile, 0,
sizeof(IdListFile));
358 IdListFile.
Size =
sizeof(IdListFile) + 2 * (
cchName + 1);
371 while (*pszName ==
'\\' || *pszName ==
'/')
382 uhTmp =
strlen(pszDescription);
390 uhTmp =
strlen(pszTarget);
398 uhTmp =
strlen(pszWorkingDir);
406 uhTmp =
strlen(pszCmdLineArgs);
421 fwrite(pCsidlBlock,
sizeof(*pCsidlBlock), 1,
pFile);
int strcmp(const char *String1, const char *String2)
ACPI_SIZE strlen(const char *String)
unsigned short int uint16_t
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 fputs(_In_z_ const char *_Str, _Inout_ FILE *_File)
_Check_return_ _CRTIMP FILE *__cdecl fopen(_In_z_ const char *_Filename, _In_z_ const char *_Mode)
_Check_return_opt_ _CRTIMP int __cdecl fputc(_In_ int _Ch, _Inout_ FILE *_File)
_Check_return_opt_ _CRTIMP int __cdecl fclose(_Inout_ FILE *_File)
_Check_return_opt_ _CRTIMP size_t __cdecl fwrite(_In_reads_bytes_(_Size *_Count) const void *_Str, _In_ size_t _Size, _In_ size_t _Count, _Inout_ FILE *_File)
_Check_return_ _CRTIMP int __cdecl sscanf(_In_z_ const char *_Src, _In_z_ _Scanf_format_string_ const char *_Format,...)
_Check_return_ int __cdecl atoi(_In_z_ const char *_Str)
static const struct SPECIALFOLDER * get_special_folder(const char *target)
struct _ID_LIST_GUID ID_LIST_GUID
static unsigned int is_path_separator(unsigned int c)
struct _LNK_HEADER LNK_HEADER
struct _LNK_LOCATOR_INFO LNK_LOCATOR_INFO
#define LINK_RELATIVE_PATH
static const struct SPECIALFOLDER g_specialfolders[]
struct _EXP_SPECIAL_FOLDER EXP_SPECIAL_FOLDER
#define LINK_CMD_LINE_ARGS
struct _FILETIME * PFILETIME
struct _FILETIME FILETIME
#define EXP_SPECIAL_FOLDER_SIG
struct _ID_LIST_FILE ID_LIST_FILE
struct _LNK_LOCAL_VOLUME_INFO LNK_LOCAL_VOLUME_INFO
#define SW_SHOWMINNOACTIVE
struct _ID_LIST_DRIVE ID_LIST_DRIVE
#define DEFINE_GUID2(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8)
#define sprintf(buf, format,...)
uint32_t VolumeNameOffset
uint32_t LocalBasePathnameOffset
uint32_t LocalVolumeInfoOffset
uint32_t RemainingPathnameOffset
uint32_t NetworkVolumeInfoOffset
_Must_inspect_result_ _In_ WDFOBJECT _In_ CONST GUID * Guid
_In_ PSID _Out_writes_to_opt_ cchName LPSTR _Inout_ LPDWORD cchName