- Implement MKLINK command.

- Remove unused library shell32 from cmd.rbuild.

svn path=/trunk/; revision=40082
This commit is contained in:
Jeffrey Morlan 2009-03-17 22:27:33 +00:00
parent 9fdb6d5596
commit ef4415728b
19 changed files with 376 additions and 1 deletions

View file

@ -320,6 +320,10 @@ extern UINT OutputCodePage;
INT CommandMemory (LPTSTR); INT CommandMemory (LPTSTR);
/* Prototypes for MKLINK.C */
INT cmd_mklink(LPTSTR);
/* Prototypes for MISC.C */ /* Prototypes for MISC.C */
INT GetRootPath(TCHAR *InPath,TCHAR *OutPath,INT size); INT GetRootPath(TCHAR *InPath,TCHAR *OutPath,INT size);
BOOL SetRootPath(TCHAR *InPath); BOOL SetRootPath(TCHAR *InPath);

View file

@ -9,7 +9,6 @@
<library>wine</library> <library>wine</library>
<library>kernel32</library> <library>kernel32</library>
<library>advapi32</library> <library>advapi32</library>
<library>shell32</library>
<library>user32</library> <library>user32</library>
<file>cmd.rc</file> <file>cmd.rc</file>
<file>main.c</file> <file>main.c</file>
@ -49,6 +48,7 @@
<file>locale.c</file> <file>locale.c</file>
<file>memory.c</file> <file>memory.c</file>
<file>misc.c</file> <file>misc.c</file>
<file>mklink.c</file>
<file>move.c</file> <file>move.c</file>
<file>msgbox.c</file> <file>msgbox.c</file>
<file>parser.c</file> <file>parser.c</file>

View file

@ -139,6 +139,10 @@ COMMAND cmds[] =
{_T("mkdir"), CMD_SPECIAL, cmd_mkdir}, {_T("mkdir"), CMD_SPECIAL, cmd_mkdir},
#endif #endif
#ifdef INCLUDE_CMD_MKLINK
{_T("mklink"), 0, cmd_mklink},
#endif
#ifdef INCLUDE_CMD_MOVE #ifdef INCLUDE_CMD_MOVE
{_T("move"), 0, cmd_move}, {_T("move"), 0, cmd_move},
#endif #endif

View file

@ -66,6 +66,7 @@
#define INCLUDE_CMD_LABEL #define INCLUDE_CMD_LABEL
#define INCLUDE_CMD_MEMORY #define INCLUDE_CMD_MEMORY
#define INCLUDE_CMD_MKDIR #define INCLUDE_CMD_MKDIR
#define INCLUDE_CMD_MKLINK
#define INCLUDE_CMD_MOVE #define INCLUDE_CMD_MOVE
#ifdef NT4_INTERNAL_COMMANDS #ifdef NT4_INTERNAL_COMMANDS
#define INCLUDE_CMD_MSGBOX #define INCLUDE_CMD_MSGBOX

View file

@ -294,6 +294,13 @@ STRING_LOCALE_HELP1, "Aktuelle Zeit: "
STRING_MKDIR_HELP, "Erzeugt ein Verzeichnis.\n\n\ STRING_MKDIR_HELP, "Erzeugt ein Verzeichnis.\n\n\
MKDIR [Laufwerk:]Pfad\nMD [Laufwerk:]Pfad" MKDIR [Laufwerk:]Pfad\nMD [Laufwerk:]Pfad"
STRING_MKLINK_HELP, "Creates a filesystem link object.\n\n\
MKLINK [/D | /H | /J] linkname target\n\n\
/D Indicates that the symbolic link target is a directory.\n\
/H Create a hard link.\n\
/J Create a directory junction.\n\n\
If neither /H or /J is specified, a symbolic link is created."
STRING_MEMMORY_HELP1, "Zeigt die Größe des Systemspeicher an.\n\nMEMORY" STRING_MEMMORY_HELP1, "Zeigt die Größe des Systemspeicher an.\n\nMEMORY"
STRING_MEMMORY_HELP2, "\n %12s%% Speicher geladen.\n\n\ STRING_MEMMORY_HELP2, "\n %12s%% Speicher geladen.\n\n\
@ -576,6 +583,7 @@ IF Verarbeitet Ausdr
LABEL Erstellt, ändert oder löscht die Bezeichnung eines Volumes.\n\ LABEL Erstellt, ändert oder löscht die Bezeichnung eines Volumes.\n\
MD Erstellt ein Verzeichnis.\n\ MD Erstellt ein Verzeichnis.\n\
MKDIR Erstellt ein Verzeichnis.\n\ MKDIR Erstellt ein Verzeichnis.\n\
MKLINK Creates a filesystem link object.\n\
MOVE Verschiebt eine oder mehrere Dateien von einem Verzeichnis in\n\ MOVE Verschiebt eine oder mehrere Dateien von einem Verzeichnis in\n\
ein anderes.\n\ ein anderes.\n\
PATH Legt den Suchpfad für ausführbare Dateien fest oder zeigt diesen an.\n\ PATH Legt den Suchpfad für ausführbare Dateien fest oder zeigt diesen an.\n\
@ -680,6 +688,9 @@ STRING_FOR_ERROR, "ung
STRING_SCREEN_COL, "ungültige Spalten-Angabe" STRING_SCREEN_COL, "ungültige Spalten-Angabe"
STRING_SCREEN_ROW, "ungültige Zeilen-Angabe" STRING_SCREEN_ROW, "ungültige Zeilen-Angabe"
STRING_TIMER_TIME "Timer %d ist %s: " STRING_TIMER_TIME "Timer %d ist %s: "
STRING_MKLINK_CREATED_SYMBOLIC, "Symbolic link created for %s <<===>> %s\n"
STRING_MKLINK_CREATED_HARD, "Hard link created for %s <<===>> %s\n"
STRING_MKLINK_CREATED_JUNCTION, "Junction created for %s <<===>> %s\n"
STRING_INVALID_OPERAND, "Ungültiger Operand." STRING_INVALID_OPERAND, "Ungültiger Operand."
STRING_EXPECTED_CLOSE_PAREN, "Erwartet ')'." STRING_EXPECTED_CLOSE_PAREN, "Erwartet ')'."
STRING_EXPECTED_NUMBER_OR_VARIABLE,"Erwartet Nummer oder Variablennamen." STRING_EXPECTED_NUMBER_OR_VARIABLE,"Erwartet Nummer oder Variablennamen."

View file

@ -301,6 +301,13 @@ STRING_LOCALE_HELP1, "Current time is"
STRING_MKDIR_HELP, "Creates a directory.\n\n\ STRING_MKDIR_HELP, "Creates a directory.\n\n\
MKDIR [drive:]path\nMD [drive:]path" MKDIR [drive:]path\nMD [drive:]path"
STRING_MKLINK_HELP, "Creates a filesystem link object.\n\n\
MKLINK [/D | /H | /J] linkname target\n\n\
/D Indicates that the symbolic link target is a directory.\n\
/H Create a hard link.\n\
/J Create a directory junction.\n\n\
If neither /H or /J is specified, a symbolic link is created."
STRING_MEMMORY_HELP1, "Displays the amount of system memory.\n\nMEMORY" STRING_MEMMORY_HELP1, "Displays the amount of system memory.\n\nMEMORY"
STRING_MEMMORY_HELP2, "\n %12s%% memory load.\n\n\ STRING_MEMMORY_HELP2, "\n %12s%% memory load.\n\n\
@ -583,6 +590,7 @@ IF
LABEL Δημιουργεί, αλλάζει ή διαγράφει την ετικέτα τόμου ενός δίσκου.\n\ LABEL Δημιουργεί, αλλάζει ή διαγράφει την ετικέτα τόμου ενός δίσκου.\n\
MD Δημιουργεί έναν κατάλογο.\n\ MD Δημιουργεί έναν κατάλογο.\n\
MKDIR Δημιουργεί έναν κατάλογο.\n\ MKDIR Δημιουργεί έναν κατάλογο.\n\
MKLINK Creates a filesystem link object.\n\
MOVE Μετακινεί ένα ή περισσότερα αρχεία από έναν κατάλογο σε έναν άλλο.\n\ MOVE Μετακινεί ένα ή περισσότερα αρχεία από έναν κατάλογο σε έναν άλλο.\n\
PATH Εμφανίζει ή ορίζει μια διαδρομή αναζήτησης για εκτελέσιμα αρχεία.\n\ PATH Εμφανίζει ή ορίζει μια διαδρομή αναζήτησης για εκτελέσιμα αρχεία.\n\
PAUSE Αναστέλλει την εκτέλεση ενός προγράμματος δέσμης και εμφανίζει ένα μήνυμα.\n\ PAUSE Αναστέλλει την εκτέλεση ενός προγράμματος δέσμης και εμφανίζει ένα μήνυμα.\n\
@ -697,6 +705,9 @@ STRING_FOR_ERROR, "bad variable specification."
STRING_SCREEN_COL, "invalid value for col" STRING_SCREEN_COL, "invalid value for col"
STRING_SCREEN_ROW, "invalid value for row" STRING_SCREEN_ROW, "invalid value for row"
STRING_TIMER_TIME "Timer %d is %s: " STRING_TIMER_TIME "Timer %d is %s: "
STRING_MKLINK_CREATED_SYMBOLIC, "Symbolic link created for %s <<===>> %s\n"
STRING_MKLINK_CREATED_HARD, "Hard link created for %s <<===>> %s\n"
STRING_MKLINK_CREATED_JUNCTION, "Junction created for %s <<===>> %s\n"
STRING_INVALID_OPERAND, "Invalid operand." STRING_INVALID_OPERAND, "Invalid operand."
STRING_EXPECTED_CLOSE_PAREN, "Αναμενόταν ')'." STRING_EXPECTED_CLOSE_PAREN, "Αναμενόταν ')'."

View file

@ -302,6 +302,13 @@ STRING_LOCALE_HELP1, "Current time is"
STRING_MKDIR_HELP, "Creates a directory.\n\n\ STRING_MKDIR_HELP, "Creates a directory.\n\n\
MKDIR [drive:]path\nMD [drive:]path" MKDIR [drive:]path\nMD [drive:]path"
STRING_MKLINK_HELP, "Creates a filesystem link object.\n\n\
MKLINK [/D | /H | /J] linkname target\n\n\
/D Indicates that symbolic link target is a directory.\n\
/H Create a hard link.\n\
/J Create a directory junction.\n\n\
If neither /H or /J is specified, a symbolic link is created."
STRING_MEMMORY_HELP1, "Displays the amount of system memory.\n\nMEMORY" STRING_MEMMORY_HELP1, "Displays the amount of system memory.\n\nMEMORY"
STRING_MEMMORY_HELP2, "\n %12s%% memory load.\n\n\ STRING_MEMMORY_HELP2, "\n %12s%% memory load.\n\n\
@ -584,6 +591,7 @@ IF Performs conditional processing in batch programs.\n\
LABEL Creates, changes, or deletes the volume label of a disk.\n\ LABEL Creates, changes, or deletes the volume label of a disk.\n\
MD Creates a directory.\n\ MD Creates a directory.\n\
MKDIR Creates a directory.\n\ MKDIR Creates a directory.\n\
MKLINK Creates a filesystem link object.\n\
MOVE Moves one or more files from one directory to another\n\ MOVE Moves one or more files from one directory to another\n\
directory.\n\ directory.\n\
PATH Displays or sets a search path for executable files.\n\ PATH Displays or sets a search path for executable files.\n\
@ -701,6 +709,9 @@ STRING_FOR_ERROR, "bad variable specification."
STRING_SCREEN_COL, "invalid value for col" STRING_SCREEN_COL, "invalid value for col"
STRING_SCREEN_ROW, "invalid value for row" STRING_SCREEN_ROW, "invalid value for row"
STRING_TIMER_TIME "Timer %d is %s: " STRING_TIMER_TIME "Timer %d is %s: "
STRING_MKLINK_CREATED_SYMBOLIC, "Symbolic link created for %s <<===>> %s\n"
STRING_MKLINK_CREATED_HARD, "Hard link created for %s <<===>> %s\n"
STRING_MKLINK_CREATED_JUNCTION, "Junction created for %s <<===>> %s\n"
STRING_INVALID_OPERAND, "Invalid operand." STRING_INVALID_OPERAND, "Invalid operand."
STRING_EXPECTED_CLOSE_PAREN, "Expected ')'." STRING_EXPECTED_CLOSE_PAREN, "Expected ')'."

View file

@ -300,6 +300,13 @@ STRING_LOCALE_HELP1, "La hora actual es"
STRING_MKDIR_HELP, "Crea un directorio.\n\n\ STRING_MKDIR_HELP, "Crea un directorio.\n\n\
MKDIR [unidad:]ruta\nMD [unidad:]ruta" MKDIR [unidad:]ruta\nMD [unidad:]ruta"
STRING_MKLINK_HELP, "Creates a filesystem link object.\n\n\
MKLINK [/D | /H | /J] linkname target\n\n\
/D Indicates that the symbolic link target is a directory.\n\
/H Create a hard link.\n\
/J Create a directory junction.\n\n\
If neither /H or /J is specified, a symbolic link is created."
STRING_MEMMORY_HELP1, "Muestra la cantidad de memoria del sistema.\n\nMEMORY" STRING_MEMMORY_HELP1, "Muestra la cantidad de memoria del sistema.\n\nMEMORY"
STRING_MEMMORY_HELP2, "\n %12s%% carga de memoria.\n\n\ STRING_MEMMORY_HELP2, "\n %12s%% carga de memoria.\n\n\
@ -543,6 +550,7 @@ IF Realiza un proceso condicional en un archivo por lotes.\n\
LABEL Crea, cambia, o borra la etiqueta de volumen de un disco.\n\ LABEL Crea, cambia, o borra la etiqueta de volumen de un disco.\n\
MD Crea un directorio.\n\ MD Crea un directorio.\n\
MKDIR Crea un directorio.\n\ MKDIR Crea un directorio.\n\
MKLINK Creates a filesystem link object.\n\
MOVE Mueve uno o más archivos de un directorio a otro.\n\ MOVE Mueve uno o más archivos de un directorio a otro.\n\
PATH Muestra o configura las rutas de búsqueda para archivos ejecutables.\n\ PATH Muestra o configura las rutas de búsqueda para archivos ejecutables.\n\
PAUSE Suspende el procesamiento de un archivo por lotes y muestra un mensaje.\n\ PAUSE Suspende el procesamiento de un archivo por lotes y muestra un mensaje.\n\
@ -649,6 +657,9 @@ STRING_FOR_ERROR, "Especici
STRING_SCREEN_COL, "Valor inválido de columna" STRING_SCREEN_COL, "Valor inválido de columna"
STRING_SCREEN_ROW, "Valor inválido de fila" STRING_SCREEN_ROW, "Valor inválido de fila"
STRING_TIMER_TIME "El temporizador %d es %s: " STRING_TIMER_TIME "El temporizador %d es %s: "
STRING_MKLINK_CREATED_SYMBOLIC, "Symbolic link created for %s <<===>> %s\n"
STRING_MKLINK_CREATED_HARD, "Hard link created for %s <<===>> %s\n"
STRING_MKLINK_CREATED_JUNCTION, "Junction created for %s <<===>> %s\n"
STRING_INVALID_OPERAND, "Operador erróneo.\n" STRING_INVALID_OPERAND, "Operador erróneo.\n"
STRING_EXPECTED_CLOSE_PAREN, "Se esperaba ')'.\n" STRING_EXPECTED_CLOSE_PAREN, "Se esperaba ')'.\n"

View file

@ -313,6 +313,13 @@ STRING_LOCALE_HELP1, "L'heure actuelle est "
STRING_MKDIR_HELP, "Crée un répertoire.\n\n\ STRING_MKDIR_HELP, "Crée un répertoire.\n\n\
MKDIR [lecteur:]chemin\nMD [lecteur:]chemin" MKDIR [lecteur:]chemin\nMD [lecteur:]chemin"
STRING_MKLINK_HELP, "Creates a filesystem link object.\n\n\
MKLINK [/D | /H | /J] linkname target\n\n\
/D Indicates that the symbolic link target is a directory.\n\
/H Create a hard link.\n\
/J Create a directory junction.\n\n\
If neither /H or /J is specified, a symbolic link is created."
STRING_MEMMORY_HELP1, "Affiche la quantité de mémoire système.\n\nMEMORY" STRING_MEMMORY_HELP1, "Affiche la quantité de mémoire système.\n\nMEMORY"
STRING_MEMMORY_HELP2, "\n %12s%% de charge mémoire.\n\n\ STRING_MEMMORY_HELP2, "\n %12s%% de charge mémoire.\n\n\
@ -597,6 +604,7 @@ IF Ex
LABEL Créé, change, ou supprime le nom de volume d'un disque.\n\ LABEL Créé, change, ou supprime le nom de volume d'un disque.\n\
MD Créé un répertoire.\n\ MD Créé un répertoire.\n\
MKDIR Créé un répertoire.\n\ MKDIR Créé un répertoire.\n\
MKLINK Creates a filesystem link object.\n\
MOVE Déplace un ou plusieurs fichiers d'un répertoire vers un autre\n\ MOVE Déplace un ou plusieurs fichiers d'un répertoire vers un autre\n\
répertoire.\n\ répertoire.\n\
PATH Affiche ou défini un chemin de recherche pour les fichiers exécutables.\n\ PATH Affiche ou défini un chemin de recherche pour les fichiers exécutables.\n\
@ -715,6 +723,9 @@ STRING_FOR_ERROR, "mauvaise variable sp
STRING_SCREEN_COL, "valeur invalide pour col" STRING_SCREEN_COL, "valeur invalide pour col"
STRING_SCREEN_ROW, "valeur invalide pour lig" STRING_SCREEN_ROW, "valeur invalide pour lig"
STRING_TIMER_TIME "Le timer n°%d est %s : " STRING_TIMER_TIME "Le timer n°%d est %s : "
STRING_MKLINK_CREATED_SYMBOLIC, "Symbolic link created for %s <<===>> %s\n"
STRING_MKLINK_CREATED_HARD, "Hard link created for %s <<===>> %s\n"
STRING_MKLINK_CREATED_JUNCTION, "Junction created for %s <<===>> %s\n"
STRING_INVALID_OPERAND, "Opérande invalide." STRING_INVALID_OPERAND, "Opérande invalide."
STRING_EXPECTED_CLOSE_PAREN, "Attendu ')'." STRING_EXPECTED_CLOSE_PAREN, "Attendu ')'."

View file

@ -289,6 +289,13 @@ STRING_LOCALE_HELP1, "Az aktu
STRING_MKDIR_HELP, "Létrehoz egy új mappát.\n\n\ STRING_MKDIR_HELP, "Létrehoz egy új mappát.\n\n\
MKDIR [meghajtó:]path\nMD [meghajtó:]path" MKDIR [meghajtó:]path\nMD [meghajtó:]path"
STRING_MKLINK_HELP, "Creates a filesystem link object.\n\n\
MKLINK [/D | /H | /J] linkname target\n\n\
/D Indicates that the symbolic link target is a directory.\n\
/H Create a hard link.\n\
/J Create a directory junction.\n\n\
If neither /H or /J is specified, a symbolic link is created."
STRING_MEMMORY_HELP1, "Megjeleníti a memória statisztikát.\n\nMEMORY" STRING_MEMMORY_HELP1, "Megjeleníti a memória statisztikát.\n\nMEMORY"
STRING_MEMMORY_HELP2, "\n A memória %12s%%-a foglalt.\n\n\ STRING_MEMMORY_HELP2, "\n A memória %12s%%-a foglalt.\n\n\
@ -526,6 +533,7 @@ IF Felt
LABEL Beállítja egy kötet címkéjét.\n\ LABEL Beállítja egy kötet címkéjét.\n\
MD Létrehoz egy új mappát.\n\ MD Létrehoz egy új mappát.\n\
MKDIR Létrehoz egy új mappát.\n\ MKDIR Létrehoz egy új mappát.\n\
MKLINK Creates a filesystem link object.\n\
MOVE Áthelyez egy vagy több állományt az egyik mappából a másikba.\n\ MOVE Áthelyez egy vagy több állományt az egyik mappából a másikba.\n\
PATH Megjeleníti vagy beállítja a keresési útvonalakat.\n\ PATH Megjeleníti vagy beállítja a keresési útvonalakat.\n\
PAUSE Felfüggeszti a futást, és vár a felhasználóra.\n\ PAUSE Felfüggeszti a futást, és vár a felhasználóra.\n\
@ -629,4 +637,7 @@ STRING_FOR_ERROR, "Hib
STRING_SCREEN_COL, "Érvénytelen érték oszlopnak" STRING_SCREEN_COL, "Érvénytelen érték oszlopnak"
STRING_SCREEN_ROW, "Érvénytelen érték sornak" STRING_SCREEN_ROW, "Érvénytelen érték sornak"
STRING_TIMER_TIME "Időzítő %d értéke %s: " STRING_TIMER_TIME "Időzítő %d értéke %s: "
STRING_MKLINK_CREATED_SYMBOLIC, "Symbolic link created for %s <<===>> %s\n"
STRING_MKLINK_CREATED_HARD, "Hard link created for %s <<===>> %s\n"
STRING_MKLINK_CREATED_JUNCTION, "Junction created for %s <<===>> %s\n"
END END

View file

@ -302,6 +302,13 @@ STRING_LOCALE_HELP1, "Waktu saat ini"
STRING_MKDIR_HELP, "Membuat direktori.\n\n\ STRING_MKDIR_HELP, "Membuat direktori.\n\n\
MKDIR [drive:]path\nMD [drive:]path" MKDIR [drive:]path\nMD [drive:]path"
STRING_MKLINK_HELP, "Creates a filesystem link object.\n\n\
MKLINK [/D | /H | /J] linkname target\n\n\
/D Indicates that the symbolic link target is a directory.\n\
/H Create a hard link.\n\
/J Create a directory junction.\n\n\
If neither /H or /J is specified, a symbolic link is created."
STRING_MEMMORY_HELP1, "Menampilkan jumlah memori sistem.\n\nMEMORY" STRING_MEMMORY_HELP1, "Menampilkan jumlah memori sistem.\n\nMEMORY"
STRING_MEMMORY_HELP2, "\n %12s%% beban memori.\n\n\ STRING_MEMMORY_HELP2, "\n %12s%% beban memori.\n\n\
@ -542,6 +549,7 @@ IF Melakukan pemrosesan kondisional dalam program batch.\n\
LABEL Membuat, mengubah, atau menghapus label volume disk.\n\ LABEL Membuat, mengubah, atau menghapus label volume disk.\n\
MD Membuat sebuah direktori.\n\ MD Membuat sebuah direktori.\n\
MKDIR Membuat sebuah direktori.\n\ MKDIR Membuat sebuah direktori.\n\
MKLINK Creates a filesystem link object.\n\
MOVE Memindahkan satu atau lebih file dari satu direktori ke yang lainnya\n\ MOVE Memindahkan satu atau lebih file dari satu direktori ke yang lainnya\n\
directory.\n\ directory.\n\
PATH Menampilkan atau menyetel path pencarian untuk file executable.\n\ PATH Menampilkan atau menyetel path pencarian untuk file executable.\n\
@ -651,6 +659,9 @@ STRING_FOR_ERROR, "spesifikasi variabel tidak baik."
STRING_SCREEN_COL, "Nilai untuk kolom tidak benar" STRING_SCREEN_COL, "Nilai untuk kolom tidak benar"
STRING_SCREEN_ROW, "Nilai untuk baris tidak benar" STRING_SCREEN_ROW, "Nilai untuk baris tidak benar"
STRING_TIMER_TIME "Timer %d adalah %s: " STRING_TIMER_TIME "Timer %d adalah %s: "
STRING_MKLINK_CREATED_SYMBOLIC, "Symbolic link created for %s <<===>> %s\n"
STRING_MKLINK_CREATED_HARD, "Hard link created for %s <<===>> %s\n"
STRING_MKLINK_CREATED_JUNCTION, "Junction created for %s <<===>> %s\n"
STRING_INVALID_OPERAND, "Operand tidak benar." STRING_INVALID_OPERAND, "Operand tidak benar."
STRING_EXPECTED_CLOSE_PAREN, "Diharapkan ')'." STRING_EXPECTED_CLOSE_PAREN, "Diharapkan ')'."

View file

@ -301,6 +301,13 @@ STRING_LOCALE_HELP1, "L'ora attuale
STRING_MKDIR_HELP, "Crea una cartella.\n\n\ STRING_MKDIR_HELP, "Crea una cartella.\n\n\
MKDIR [disco:]percorso\nMD [disco:]percorso" MKDIR [disco:]percorso\nMD [disco:]percorso"
STRING_MKLINK_HELP, "Creates a filesystem link object.\n\n\
MKLINK [/D | /H | /J] linkname target\n\n\
/D Indicates that the symbolic link target is a directory.\n\
/H Create a hard link.\n\
/J Create a directory junction.\n\n\
If neither /H or /J is specified, a symbolic link is created."
STRING_MEMMORY_HELP1, "Visualizza la quantità della memoria di sistema.\n\n\ STRING_MEMMORY_HELP1, "Visualizza la quantità della memoria di sistema.\n\n\
MEMORY" MEMORY"
@ -590,6 +597,7 @@ IF Esegue elaborazioni condizionali in un batch.\n\
LABEL Crea, modifica, o cancella l'etichetta di un disco.\n\ LABEL Crea, modifica, o cancella l'etichetta di un disco.\n\
MD Crea una cartella.\n\ MD Crea una cartella.\n\
MKDIR Crea una cartella.\n\ MKDIR Crea una cartella.\n\
MKLINK Creates a filesystem link object.\n\
MOVE Muove uno o più file da una cartella a un'altra\n\ MOVE Muove uno o più file da una cartella a un'altra\n\
PATH Visualizza o imposta i percorsi di ricerca per gli eseguibili.\n\ PATH Visualizza o imposta i percorsi di ricerca per gli eseguibili.\n\
PAUSE Ferma l'esecuzione di un batch e visualizza un messaggio.\n\ PAUSE Ferma l'esecuzione di un batch e visualizza un messaggio.\n\
@ -705,6 +713,9 @@ STRING_FOR_ERROR, "variabile non valida."
STRING_SCREEN_COL, "valore non valido per colonna" STRING_SCREEN_COL, "valore non valido per colonna"
STRING_SCREEN_ROW, "valore non valido per riga" STRING_SCREEN_ROW, "valore non valido per riga"
STRING_TIMER_TIME "Timer %d è %s: " STRING_TIMER_TIME "Timer %d è %s: "
STRING_MKLINK_CREATED_SYMBOLIC, "Symbolic link created for %s <<===>> %s\n"
STRING_MKLINK_CREATED_HARD, "Hard link created for %s <<===>> %s\n"
STRING_MKLINK_CREATED_JUNCTION, "Junction created for %s <<===>> %s\n"
STRING_INVALID_OPERAND, "Operando non valido." STRING_INVALID_OPERAND, "Operando non valido."
STRING_EXPECTED_CLOSE_PAREN, "Attesa una ')'." STRING_EXPECTED_CLOSE_PAREN, "Attesa una ')'."

View file

@ -310,6 +310,13 @@ STRING_MKDIR_HELP, "
MKDIR [ドライブ:]パス\n\ MKDIR [ドライブ:]パス\n\
MD [ドライブ:]パス" MD [ドライブ:]パス"
STRING_MKLINK_HELP, "Creates a filesystem link object.\n\n\
MKLINK [/D | /H | /J] linkname target\n\n\
/D Indicates that the symbolic link target is a directory.\n\
/H Create a hard link.\n\
/J Create a directory junction.\n\n\
If neither /H or /J is specified, a symbolic link is created."
STRING_MEMMORY_HELP1, "システム メモリの量を表\示します。\n\nMEMORY" STRING_MEMMORY_HELP1, "システム メモリの量を表\示します。\n\nMEMORY"
STRING_MEMMORY_HELP2, "\n %12s%% のメモリが使用されています。\n\n\ STRING_MEMMORY_HELP2, "\n %12s%% のメモリが使用されています。\n\n\
@ -551,6 +558,7 @@ IF
LABEL ディスクのボリューム ラベルを表\示または変更します。\n\ LABEL ディスクのボリューム ラベルを表\示または変更します。\n\
MD ディレクトリを作成します。\n\ MD ディレクトリを作成します。\n\
MKDIR ディレクトリを作成します。\n\ MKDIR ディレクトリを作成します。\n\
MKLINK Creates a filesystem link object.\n\
MOVE ファイルを移動およびファイルとディレクトリ名を変更します。\n\ MOVE ファイルを移動およびファイルとディレクトリ名を変更します。\n\
PATH 実行可能\ファイルの検索パスを表\示または設定します。\n\ PATH 実行可能\ファイルの検索パスを表\示または設定します。\n\
PAUSE バッチ プログラムの処理を一時停止し、メッセージを表\示します。\n\ PAUSE バッチ プログラムの処理を一時停止し、メッセージを表\示します。\n\
@ -658,6 +666,9 @@ STRING_FOR_ERROR, "
STRING_SCREEN_COL, "行の値が無効です。" STRING_SCREEN_COL, "行の値が無効です。"
STRING_SCREEN_ROW, "列の値が無効です。" STRING_SCREEN_ROW, "列の値が無効です。"
STRING_TIMER_TIME "タイマー %d は %s です。: " STRING_TIMER_TIME "タイマー %d は %s です。: "
STRING_MKLINK_CREATED_SYMBOLIC, "Symbolic link created for %s <<===>> %s\n"
STRING_MKLINK_CREATED_HARD, "Hard link created for %s <<===>> %s\n"
STRING_MKLINK_CREATED_JUNCTION, "Junction created for %s <<===>> %s\n"
STRING_INVALID_OPERAND, "無効なオペランドです。" STRING_INVALID_OPERAND, "無効なオペランドです。"
STRING_EXPECTED_CLOSE_PAREN, "Expected ')'" STRING_EXPECTED_CLOSE_PAREN, "Expected ')'"

View file

@ -294,6 +294,13 @@ STRING_LOCALE_HELP1, "gjeldende tid er"
STRING_MKDIR_HELP, "Oppretter en mappe.\n\n\ STRING_MKDIR_HELP, "Oppretter en mappe.\n\n\
MKDIR [stasjon:]mappe\nMD [stasjon:]mappe" MKDIR [stasjon:]mappe\nMD [stasjon:]mappe"
STRING_MKLINK_HELP, "Creates a filesystem link object.\n\n\
MKLINK [/D | /H | /J] linkname target\n\n\
/D Indicates that the symbolic link target is a directory.\n\
/H Create a hard link.\n\
/J Create a directory junction.\n\n\
If neither /H or /J is specified, a symbolic link is created."
STRING_MEMMORY_HELP1, "Vis mengde av system minne.\n\nMEMORY" STRING_MEMMORY_HELP1, "Vis mengde av system minne.\n\nMEMORY"
STRING_MEMMORY_HELP2, "\n %12s%% benyttet minne.\n\n\ STRING_MEMMORY_HELP2, "\n %12s%% benyttet minne.\n\n\
@ -534,6 +541,7 @@ IF Utf
LABEL Oppretter, endrer, eller sletter volumnavnet på en disk.\n\ LABEL Oppretter, endrer, eller sletter volumnavnet på en disk.\n\
MD Oppretter en mappe.\n\ MD Oppretter en mappe.\n\
MKDIR Oppretter en mappe.\n\ MKDIR Oppretter en mappe.\n\
MKLINK Creates a filesystem link object.\n\
MOVE Flytter en eller flere filer fra en mappe til en annen.\n\ MOVE Flytter en eller flere filer fra en mappe til en annen.\n\
PATH Vis eller sett en søkesti for kjørbare filer.\n\ PATH Vis eller sett en søkesti for kjørbare filer.\n\
PAUSE Avbryter behandling av en satsvis fil, og viser en melding.\n\ PAUSE Avbryter behandling av en satsvis fil, og viser en melding.\n\
@ -643,6 +651,9 @@ STRING_FOR_ERROR, "ugyldig variabel spesifikasjon."
STRING_SCREEN_COL, "ugyldig verdi for kolonne" STRING_SCREEN_COL, "ugyldig verdi for kolonne"
STRING_SCREEN_ROW, "ugyldig verdi for rad" STRING_SCREEN_ROW, "ugyldig verdi for rad"
STRING_TIMER_TIME "Stoppeklokke %d er %s: " STRING_TIMER_TIME "Stoppeklokke %d er %s: "
STRING_MKLINK_CREATED_SYMBOLIC, "Symbolic link created for %s <<===>> %s\n"
STRING_MKLINK_CREATED_HARD, "Hard link created for %s <<===>> %s\n"
STRING_MKLINK_CREATED_JUNCTION, "Junction created for %s <<===>> %s\n"
STRING_INVALID_OPERAND, "Ugyldig operand." STRING_INVALID_OPERAND, "Ugyldig operand."
STRING_EXPECTED_CLOSE_PAREN, "Forventet ')'." STRING_EXPECTED_CLOSE_PAREN, "Forventet ')'."

View file

@ -300,6 +300,13 @@ STRING_LOCALE_HELP1, "Czas bie
STRING_MKDIR_HELP, "Tworzy katalog.\n\n\ STRING_MKDIR_HELP, "Tworzy katalog.\n\n\
MKDIR [nap璠:]𦣇ie磬a\nMD [nap璠:]𦣇ie磬a" MKDIR [nap璠:]𦣇ie磬a\nMD [nap璠:]𦣇ie磬a"
STRING_MKLINK_HELP, "Creates a filesystem link object.\n\n\
MKLINK [/D | /H | /J] linkname target\n\n\
/D Indicates that the symbolic link target is a directory.\n\
/H Create a hard link.\n\
/J Create a directory junction.\n\n\
If neither /H or /J is specified, a symbolic link is created."
STRING_MEMMORY_HELP1, "Wy菏ietla ilo𨀣 pami璚i systemowej.\n\nMEMORY" STRING_MEMMORY_HELP1, "Wy菏ietla ilo𨀣 pami璚i systemowej.\n\nMEMORY"
STRING_MEMMORY_HELP2, "\n %12s%% pami璚i zaj皻ej.\n\n\ STRING_MEMMORY_HELP2, "\n %12s%% pami璚i zaj皻ej.\n\n\
@ -541,6 +548,7 @@ IF Przetwarzanie warunkowe w programach wsadowych.\n\
LABEL Tworzy, zmienia lub kasuje etykiet<65> woluminu w danym nap璠zie.\n\ LABEL Tworzy, zmienia lub kasuje etykiet<65> woluminu w danym nap璠zie.\n\
MD Tworzy katalog.\n\ MD Tworzy katalog.\n\
MKDIR Tworzy katalog.\n\ MKDIR Tworzy katalog.\n\
MKLINK Creates a filesystem link object.\n\
MOVE Przenosi jeden lub wi璚ej plik闚 z jednego katalogu do drugiego.\n\ MOVE Przenosi jeden lub wi璚ej plik闚 z jednego katalogu do drugiego.\n\
PATH Wy菏ietla lub ustawia 𦣇ie磬i dost瘼u dla program闚.\n\ PATH Wy菏ietla lub ustawia 𦣇ie磬i dost瘼u dla program闚.\n\
PAUSE Zawiesza przetwarzanie programu wsadowego i wy菏ietla komunikat.\n\ PAUSE Zawiesza przetwarzanie programu wsadowego i wy菏ietla komunikat.\n\
@ -649,6 +657,9 @@ STRING_FOR_ERROR, "z
STRING_SCREEN_COL, "nieprawid這wy numer kolumny" STRING_SCREEN_COL, "nieprawid這wy numer kolumny"
STRING_SCREEN_ROW, "nieprawid這wy numer rz璠u" STRING_SCREEN_ROW, "nieprawid這wy numer rz璠u"
STRING_TIMER_TIME "Stoper %d czas - %s: " STRING_TIMER_TIME "Stoper %d czas - %s: "
STRING_MKLINK_CREATED_SYMBOLIC, "Symbolic link created for %s <<===>> %s\n"
STRING_MKLINK_CREATED_HARD, "Hard link created for %s <<===>> %s\n"
STRING_MKLINK_CREATED_JUNCTION, "Junction created for %s <<===>> %s\n"
STRING_INVALID_OPERAND, "Nieprawid這wy argument operatora." STRING_INVALID_OPERAND, "Nieprawid這wy argument operatora."
STRING_EXPECTED_CLOSE_PAREN, "Oczekiwano ')'." STRING_EXPECTED_CLOSE_PAREN, "Oczekiwano ')'."

View file

@ -307,6 +307,13 @@ STRING_LOCALE_HELP1, "
STRING_MKDIR_HELP, "Создание каталога.\n\n\ STRING_MKDIR_HELP, "Создание каталога.\n\n\
MKDIR [диск:]путь\nMD [диск:]путь" MKDIR [диск:]путь\nMD [диск:]путь"
STRING_MKLINK_HELP, "Creates a filesystem link object.\n\n\
MKLINK [/D | /H | /J] linkname target\n\n\
/D Indicates that the symbolic link target is a directory.\n\
/H Create a hard link.\n\
/J Create a directory junction.\n\n\
If neither /H or /J is specified, a symbolic link is created."
STRING_MEMMORY_HELP1, "Вывод объема системной памяти.\n\nMEMORY" STRING_MEMMORY_HELP1, "Вывод объема системной памяти.\n\nMEMORY"
STRING_MEMMORY_HELP2, "\n %12s%% memory load.\n\n\ STRING_MEMMORY_HELP2, "\n %12s%% memory load.\n\n\
@ -548,6 +555,7 @@ IF
LABEL Создание, изменение и удаление меток тома.\n\ LABEL Создание, изменение и удаление меток тома.\n\
MD Создание каталога.\n\ MD Создание каталога.\n\
MKDIR Создание каталога.\n\ MKDIR Создание каталога.\n\
MKLINK Creates a filesystem link object.\n\
MOVE Перемещение файлов и переименование файлов и каталогов\n\ MOVE Перемещение файлов и переименование файлов и каталогов\n\
PATH Вывод или задание пути поиска исполняемых файлов.\n\ PATH Вывод или задание пути поиска исполняемых файлов.\n\
PAUSE Приостановка выполнения пакетного файла.\n\ PAUSE Приостановка выполнения пакетного файла.\n\
@ -656,6 +664,9 @@ STRING_FOR_ERROR, "
STRING_SCREEN_COL, "неправильное значение для кол" STRING_SCREEN_COL, "неправильное значение для кол"
STRING_SCREEN_ROW, "неправильное значение для стр" STRING_SCREEN_ROW, "неправильное значение для стр"
STRING_TIMER_TIME "Timer %d is %s: " STRING_TIMER_TIME "Timer %d is %s: "
STRING_MKLINK_CREATED_SYMBOLIC, "Symbolic link created for %s <<===>> %s\n"
STRING_MKLINK_CREATED_HARD, "Hard link created for %s <<===>> %s\n"
STRING_MKLINK_CREATED_JUNCTION, "Junction created for %s <<===>> %s\n"
STRING_INVALID_OPERAND, "Неверный операнд." STRING_INVALID_OPERAND, "Неверный операнд."
STRING_EXPECTED_CLOSE_PAREN, "Ожидается ')'." STRING_EXPECTED_CLOSE_PAREN, "Ожидается ')'."

View file

@ -306,6 +306,13 @@ STRING_LOCALE_HELP1, "Current time is"
STRING_MKDIR_HELP, "Creates a directory.\n\n\ STRING_MKDIR_HELP, "Creates a directory.\n\n\
MKDIR [drive:]path\nMD [drive:]path" MKDIR [drive:]path\nMD [drive:]path"
STRING_MKLINK_HELP, "Creates a filesystem link object.\n\n\
MKLINK [/D | /H | /J] linkname target\n\n\
/D Indicates that the symbolic link target is a directory.\n\
/H Create a hard link.\n\
/J Create a directory junction.\n\n\
If neither /H or /J is specified, a symbolic link is created."
STRING_MEMMORY_HELP1, "Displays the amount of system memory.\n\nMEMORY" STRING_MEMMORY_HELP1, "Displays the amount of system memory.\n\nMEMORY"
STRING_MEMMORY_HELP2, "\n %12s%% memory load.\n\n\ STRING_MEMMORY_HELP2, "\n %12s%% memory load.\n\n\
@ -587,6 +594,7 @@ IF
LABEL Ñòâîðåííÿ, çì³íà, àáî âèäàëåííÿ ì³òîê òîìó äèñêà.\n\ LABEL Ñòâîðåííÿ, çì³íà, àáî âèäàëåííÿ ì³òîê òîìó äèñêà.\n\
MD Ñòâîðåííÿ ïàïêè.\n\ MD Ñòâîðåííÿ ïàïêè.\n\
MKDIR Ñòâîðåííÿ ïàïêè.\n\ MKDIR Ñòâîðåííÿ ïàïêè.\n\
MKLINK Creates a filesystem link object.\n\
MOVE Ïåðåì³ùåííÿ îäíîãî àáî á³ëüøå ôàéë³â ç îäí³º¿ ïàïêè äî ³íøî¿\n\ MOVE Ïåðåì³ùåííÿ îäíîãî àáî á³ëüøå ôàéë³â ç îäí³º¿ ïàïêè äî ³íøî¿\n\
ïàïêè.\n\ ïàïêè.\n\
PATH ³äîáðàæåííÿ àáî âñòàíîâëåííÿ øëÿõó ïîøóêó âèêîíóâàíèõ ôàéë³â.\n\ PATH ³äîáðàæåííÿ àáî âñòàíîâëåííÿ øëÿõó ïîøóêó âèêîíóâàíèõ ôàéë³â.\n\
@ -705,6 +713,9 @@ STRING_FOR_ERROR, "bad variable specification."
STRING_SCREEN_COL, "íåïðàâèëüíå çíà÷åííÿ col" STRING_SCREEN_COL, "íåïðàâèëüíå çíà÷åííÿ col"
STRING_SCREEN_ROW, "íåïðàâèëüíå çíà÷åííÿ row" STRING_SCREEN_ROW, "íåïðàâèëüíå çíà÷åííÿ row"
STRING_TIMER_TIME "Òàéìåð %d - %s: " STRING_TIMER_TIME "Òàéìåð %d - %s: "
STRING_MKLINK_CREATED_SYMBOLIC, "Symbolic link created for %s <<===>> %s\n"
STRING_MKLINK_CREATED_HARD, "Hard link created for %s <<===>> %s\n"
STRING_MKLINK_CREATED_JUNCTION, "Junction created for %s <<===>> %s\n"
STRING_INVALID_OPERAND, "Íåâ³ðíèé îïåðàíä." STRING_INVALID_OPERAND, "Íåâ³ðíèé îïåðàíä."
STRING_EXPECTED_CLOSE_PAREN, "Î÷³êóºòüñÿ ')'." STRING_EXPECTED_CLOSE_PAREN, "Î÷³êóºòüñÿ ')'."

View file

@ -0,0 +1,219 @@
/*
* MKLINK.C - mklink internal command.
*/
#include <precomp.h>
#ifdef INCLUDE_CMD_MKLINK
/* There is no API for creating junctions, so we must do it the hard way */
static BOOL CreateJunction(LPCTSTR LinkName, LPCTSTR TargetName)
{
/* Structure for reparse point daya when ReparseTag is one of
* the tags defined by Microsoft. Copied from MinGW winnt.h */
typedef struct _REPARSE_DATA_BUFFER {
DWORD ReparseTag;
WORD ReparseDataLength;
WORD Reserved;
_ANONYMOUS_UNION union {
struct {
WORD SubstituteNameOffset;
WORD SubstituteNameLength;
WORD PrintNameOffset;
WORD PrintNameLength;
ULONG Flags;
WCHAR PathBuffer[1];
} SymbolicLinkReparseBuffer;
struct {
WORD SubstituteNameOffset;
WORD SubstituteNameLength;
WORD PrintNameOffset;
WORD PrintNameLength;
WCHAR PathBuffer[1];
} MountPointReparseBuffer;
struct {
BYTE DataBuffer[1];
} GenericReparseBuffer;
} DUMMYUNIONNAME;
} REPARSE_DATA_BUFFER, *PREPARSE_DATA_BUFFER;
HMODULE hNTDLL = GetModuleHandle(_T("NTDLL"));
BOOLEAN (WINAPI *RtlDosPathNameToNtPathName_U)(PCWSTR, PUNICODE_STRING, PCWSTR *, CURDIR *)
= (BOOLEAN (WINAPI *)())GetProcAddress(hNTDLL, "RtlDosPathNameToNtPathName_U");
VOID (WINAPI *RtlFreeUnicodeString)(PUNICODE_STRING)
= (VOID (WINAPI *)())GetProcAddress(hNTDLL, "RtlFreeUnicodeString");
TCHAR TargetFullPath[MAX_PATH];
#ifdef UNICODE
#define TargetFullPathW TargetFullPath
#else
WCHAR TargetFullPathW[MAX_PATH];
#endif
UNICODE_STRING TargetNTPath;
HANDLE hJunction;
/* The data for this kind of reparse point has two strings:
* The first ("SubstituteName") is the full target path in NT format,
* the second ("PrintName") is the full target path in Win32 format.
* Both of these must be wide-character strings. */
if (!RtlDosPathNameToNtPathName_U ||
!RtlFreeUnicodeString ||
!GetFullPathName(TargetName, MAX_PATH, TargetFullPath, NULL) ||
#ifndef UNICODE
!MultiByteToWideChar(CP_ACP, 0, TargetFullPath, -1, TargetFullPathW, -1) ||
#endif
!RtlDosPathNameToNtPathName_U(TargetFullPathW, &TargetNTPath, NULL, NULL))
{
return FALSE;
}
/* We have both the names we need, so time to create the junction.
* Start with an empty directory */
if (!CreateDirectory(LinkName, NULL))
{
RtlFreeUnicodeString(&TargetNTPath);
return FALSE;
}
/* Open the directory we just created */
hJunction = CreateFile(LinkName, GENERIC_WRITE, 0, NULL,
OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
if (hJunction != INVALID_HANDLE_VALUE)
{
/* Allocate a buffer large enough to hold both strings, including trailing NULs */
DWORD TargetLen = wcslen(TargetFullPathW) * sizeof(WCHAR);
DWORD DataSize = FIELD_OFFSET(REPARSE_DATA_BUFFER, MountPointReparseBuffer.PathBuffer)
+ TargetNTPath.Length + sizeof(WCHAR)
+ TargetLen + sizeof(WCHAR);
PREPARSE_DATA_BUFFER Data = _alloca(DataSize);
/* Fill it out and use it to turn the directory into a reparse point */
Data->ReparseTag = IO_REPARSE_TAG_MOUNT_POINT;
Data->ReparseDataLength = DataSize - FIELD_OFFSET(REPARSE_DATA_BUFFER, MountPointReparseBuffer);
Data->Reserved = 0;
Data->MountPointReparseBuffer.SubstituteNameOffset = 0;
Data->MountPointReparseBuffer.SubstituteNameLength = TargetNTPath.Length;
wcscpy(Data->MountPointReparseBuffer.PathBuffer,
TargetNTPath.Buffer);
Data->MountPointReparseBuffer.PrintNameOffset = TargetNTPath.Length + sizeof(WCHAR);
Data->MountPointReparseBuffer.PrintNameLength = TargetLen;
wcscpy((WCHAR *)((BYTE *)Data->MountPointReparseBuffer.PathBuffer
+ Data->MountPointReparseBuffer.PrintNameOffset),
TargetFullPathW);
if (DeviceIoControl(hJunction, FSCTL_SET_REPARSE_POINT,
Data, DataSize, NULL, 0, &DataSize, NULL))
{
/* Success */
CloseHandle(hJunction);
RtlFreeUnicodeString(&TargetNTPath);
return TRUE;
}
CloseHandle(hJunction);
}
RemoveDirectory(LinkName);
RtlFreeUnicodeString(&TargetNTPath);
return FALSE;
}
INT
cmd_mklink(LPTSTR param)
{
HMODULE hKernel32 = GetModuleHandle(_T("KERNEL32"));
DWORD Flags = 0;
enum { SYMBOLIC, HARD, JUNCTION } LinkType = SYMBOLIC;
INT NumFiles = 0;
LPTSTR Name[2];
INT argc, i;
LPTSTR *arg;
if (!_tcsncmp(param, _T("/?"), 2))
{
ConOutResPuts(STRING_MKLINK_HELP);
return 0;
}
arg = split(param, &argc, FALSE);
for (i = 0; i < argc; i++)
{
if (arg[i][0] == _T('/'))
{
if (!_tcsicmp(arg[i], _T("/D")))
Flags |= 1; /* SYMBOLIC_LINK_FLAG_DIRECTORY */
else if (!_tcsicmp(arg[i], _T("/H")))
LinkType = HARD;
else if (!_tcsicmp(arg[i], _T("/J")))
LinkType = JUNCTION;
else
{
error_invalid_switch(arg[i][1]);
freep(arg);
return 1;
}
}
else
{
if (NumFiles == 2)
{
error_too_many_parameters(arg[i]);
freep(arg);
return 1;
}
Name[NumFiles++] = arg[i];
}
}
freep(arg);
if (NumFiles != 2)
{
error_req_param_missing();
return 1;
}
nErrorLevel = 0;
if (LinkType == SYMBOLIC)
{
/* CreateSymbolicLink doesn't exist in old versions of Windows,
* so load dynamically */
BOOL (WINAPI *CreateSymbolicLink)(LPCTSTR, LPCTSTR, DWORD)
#ifdef UNICODE
= (BOOL (WINAPI *)())GetProcAddress(hKernel32, "CreateSymbolicLinkW");
#else
= (BOOL (WINAPI *)())GetProcAddress(hKernel32, "CreateSymbolicLinkA");
#endif
if (CreateSymbolicLink && CreateSymbolicLink(Name[0], Name[1], Flags))
{
ConOutResPrintf(STRING_MKLINK_CREATED_SYMBOLIC, Name[0], Name[1]);
return 0;
}
}
else if (LinkType == HARD)
{
/* CreateHardLink doesn't exist in old versions of Windows,
* so load dynamically */
BOOL (WINAPI *CreateHardLink)(LPCTSTR, LPCTSTR, LPSECURITY_ATTRIBUTES)
#ifdef UNICODE
= (BOOL (WINAPI *)())GetProcAddress(hKernel32, "CreateHardLinkW");
#else
= (BOOL (WINAPI *)())GetProcAddress(hKernel32, "CreateHardLinkA");
#endif
if (CreateHardLink && CreateHardLink(Name[0], Name[1], NULL))
{
ConOutResPrintf(STRING_MKLINK_CREATED_HARD, Name[0], Name[1]);
return 0;
}
}
else
{
if (CreateJunction(Name[0], Name[1]))
{
ConOutResPrintf(STRING_MKLINK_CREATED_JUNCTION, Name[0], Name[1]);
return 0;
}
}
ErrorMessage(GetLastError(), _T("MKLINK"));
return 1;
}
#endif /* INCLUDE_CMD_MKLINK */

View file

@ -89,6 +89,7 @@
#define STRING_CMD_HELP7 614 #define STRING_CMD_HELP7 614
#define STRING_CMD_HELP8 615 #define STRING_CMD_HELP8 615
#define STRING_ASSOC_HELP 616 #define STRING_ASSOC_HELP 616
#define STRING_MKLINK_HELP 617
#define STRING_CMD_SHELLINFO 624 #define STRING_CMD_SHELLINFO 624
@ -242,6 +243,9 @@
#define STRING_REPLACE_HELP10 736 #define STRING_REPLACE_HELP10 736
#define STRING_REPLACE_HELP11 737 #define STRING_REPLACE_HELP11 737
#define STRING_MKLINK_CREATED_SYMBOLIC 738
#define STRING_MKLINK_CREATED_HARD 739
#define STRING_MKLINK_CREATED_JUNCTION 740
/* These strings are language independent (cmd.rc) */ /* These strings are language independent (cmd.rc) */
#define STRING_FREEDOS_DEV 800 #define STRING_FREEDOS_DEV 800