- 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);
/* Prototypes for MKLINK.C */
INT cmd_mklink(LPTSTR);
/* Prototypes for MISC.C */
INT GetRootPath(TCHAR *InPath,TCHAR *OutPath,INT size);
BOOL SetRootPath(TCHAR *InPath);

View file

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

View file

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

View file

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

View file

@ -294,6 +294,13 @@ STRING_LOCALE_HELP1, "Aktuelle Zeit: "
STRING_MKDIR_HELP, "Erzeugt ein Verzeichnis.\n\n\
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_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\
MD 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\
ein anderes.\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_ROW, "ungültige Zeilen-Angabe"
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_EXPECTED_CLOSE_PAREN, "Erwartet ')'."
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\
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_HELP2, "\n %12s%% memory load.\n\n\
@ -583,6 +590,7 @@ IF
LABEL Δημιουργεί, αλλάζει ή διαγράφει την ετικέτα τόμου ενός δίσκου.\n\
MD Δημιουργεί έναν κατάλογο.\n\
MKDIR Δημιουργεί έναν κατάλογο.\n\
MKLINK Creates a filesystem link object.\n\
MOVE Μετακινεί ένα ή περισσότερα αρχεία από έναν κατάλογο σε έναν άλλο.\n\
PATH Εμφανίζει ή ορίζει μια διαδρομή αναζήτησης για εκτελέσιμα αρχεία.\n\
PAUSE Αναστέλλει την εκτέλεση ενός προγράμματος δέσμης και εμφανίζει ένα μήνυμα.\n\
@ -697,6 +705,9 @@ STRING_FOR_ERROR, "bad variable specification."
STRING_SCREEN_COL, "invalid value for col"
STRING_SCREEN_ROW, "invalid value for row"
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_EXPECTED_CLOSE_PAREN, "Αναμενόταν ')'."

View file

@ -302,6 +302,13 @@ STRING_LOCALE_HELP1, "Current time is"
STRING_MKDIR_HELP, "Creates a directory.\n\n\
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_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\
MD 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\
directory.\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_ROW, "invalid value for row"
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_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\
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_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\
MD 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\
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\
@ -649,6 +657,9 @@ STRING_FOR_ERROR, "Especici
STRING_SCREEN_COL, "Valor inválido de columna"
STRING_SCREEN_ROW, "Valor inválido de fila"
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_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\
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_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\
MD 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\
répertoire.\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_ROW, "valeur invalide pour lig"
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_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\
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_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\
MD 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\
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\
@ -629,4 +637,7 @@ STRING_FOR_ERROR, "Hib
STRING_SCREEN_COL, "Érvénytelen érték oszlopnak"
STRING_SCREEN_ROW, "Érvénytelen érték sornak"
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

View file

@ -302,6 +302,13 @@ STRING_LOCALE_HELP1, "Waktu saat ini"
STRING_MKDIR_HELP, "Membuat direktori.\n\n\
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_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\
MD 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\
directory.\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_ROW, "Nilai untuk baris tidak benar"
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_EXPECTED_CLOSE_PAREN, "Diharapkan ')'."

View file

@ -301,6 +301,13 @@ STRING_LOCALE_HELP1, "L'ora attuale
STRING_MKDIR_HELP, "Crea una cartella.\n\n\
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\
MEMORY"
@ -590,6 +597,7 @@ IF Esegue elaborazioni condizionali in un batch.\n\
LABEL Crea, modifica, o cancella l'etichetta di un disco.\n\
MD 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\
PATH Visualizza o imposta i percorsi di ricerca per gli eseguibili.\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_ROW, "valore non valido per riga"
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_EXPECTED_CLOSE_PAREN, "Attesa una ')'."

View file

@ -310,6 +310,13 @@ STRING_MKDIR_HELP, "
MKDIR [ドライブ:]パス\n\
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_HELP2, "\n %12s%% のメモリが使用されています。\n\n\
@ -551,6 +558,7 @@ IF
LABEL ディスクのボリューム ラベルを表\示または変更します。\n\
MD ディレクトリを作成します。\n\
MKDIR ディレクトリを作成します。\n\
MKLINK Creates a filesystem link object.\n\
MOVE ファイルを移動およびファイルとディレクトリ名を変更します。\n\
PATH 実行可能\ファイルの検索パスを表\示または設定します。\n\
PAUSE バッチ プログラムの処理を一時停止し、メッセージを表\示します。\n\
@ -658,6 +666,9 @@ STRING_FOR_ERROR, "
STRING_SCREEN_COL, "行の値が無効です。"
STRING_SCREEN_ROW, "列の値が無効です。"
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_EXPECTED_CLOSE_PAREN, "Expected ')'"

View file

@ -294,6 +294,13 @@ STRING_LOCALE_HELP1, "gjeldende tid er"
STRING_MKDIR_HELP, "Oppretter en mappe.\n\n\
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_HELP2, "\n %12s%% benyttet minne.\n\n\
@ -534,6 +541,7 @@ IF Utf
LABEL Oppretter, endrer, eller sletter volumnavnet på en disk.\n\
MD 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\
PATH Vis eller sett en søkesti for kjørbare filer.\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_ROW, "ugyldig verdi for rad"
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_EXPECTED_CLOSE_PAREN, "Forventet ')'."

View file

@ -300,6 +300,13 @@ STRING_LOCALE_HELP1, "Czas bie
STRING_MKDIR_HELP, "Tworzy katalog.\n\n\
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_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\
MD 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\
PATH Wy菏ietla lub ustawia 𦣇ie磬i dost瘼u dla program闚.\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_ROW, "nieprawid這wy numer rz璠u"
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_EXPECTED_CLOSE_PAREN, "Oczekiwano ')'."

View file

@ -307,6 +307,13 @@ STRING_LOCALE_HELP1, "
STRING_MKDIR_HELP, "Создание каталога.\n\n\
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_HELP2, "\n %12s%% memory load.\n\n\
@ -548,6 +555,7 @@ IF
LABEL Создание, изменение и удаление меток тома.\n\
MD Создание каталога.\n\
MKDIR Создание каталога.\n\
MKLINK Creates a filesystem link object.\n\
MOVE Перемещение файлов и переименование файлов и каталогов\n\
PATH Вывод или задание пути поиска исполняемых файлов.\n\
PAUSE Приостановка выполнения пакетного файла.\n\
@ -656,6 +664,9 @@ STRING_FOR_ERROR, "
STRING_SCREEN_COL, "неправильное значение для кол"
STRING_SCREEN_ROW, "неправильное значение для стр"
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_EXPECTED_CLOSE_PAREN, "Ожидается ')'."

View file

@ -306,6 +306,13 @@ STRING_LOCALE_HELP1, "Current time is"
STRING_MKDIR_HELP, "Creates a directory.\n\n\
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_HELP2, "\n %12s%% memory load.\n\n\
@ -587,6 +594,7 @@ IF
LABEL Ñòâîðåííÿ, çì³íà, àáî âèäàëåííÿ ì³òîê òîìó äèñêà.\n\
MD Ñòâîðåííÿ ïàïêè.\n\
MKDIR Ñòâîðåííÿ ïàïêè.\n\
MKLINK Creates a filesystem link object.\n\
MOVE Ïåðåì³ùåííÿ îäíîãî àáî á³ëüøå ôàéë³â ç îäí³º¿ ïàïêè äî ³íøî¿\n\
ïàïêè.\n\
PATH ³äîáðàæåííÿ àáî âñòàíîâëåííÿ øëÿõó ïîøóêó âèêîíóâàíèõ ôàéë³â.\n\
@ -705,6 +713,9 @@ STRING_FOR_ERROR, "bad variable specification."
STRING_SCREEN_COL, "íåïðàâèëüíå çíà÷åííÿ col"
STRING_SCREEN_ROW, "íåïðàâèëüíå çíà÷åííÿ row"
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_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_HELP8 615
#define STRING_ASSOC_HELP 616
#define STRING_MKLINK_HELP 617
#define STRING_CMD_SHELLINFO 624
@ -242,6 +243,9 @@
#define STRING_REPLACE_HELP10 736
#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) */
#define STRING_FREEDOS_DEV 800