diff --git a/reactos/base/base.rbuild b/reactos/base/base.rbuild new file mode 100644 index 00000000000..f3a8aef40a4 --- /dev/null +++ b/reactos/base/base.rbuild @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + diff --git a/reactos/base/services/tcpsvcs/chargen.c b/reactos/base/services/tcpsvcs/chargen.c new file mode 100644 index 00000000000..9c1db44d938 --- /dev/null +++ b/reactos/base/services/tcpsvcs/chargen.c @@ -0,0 +1,130 @@ +/* + * ReactOS Services + * Copyright (C) 2005 ReactOS Team + * + * LICENCE: GPL - See COPYING in the top level directory + * PROJECT: ReactOS simple TCP/IP services + * FILE: apps/utils/net/tcpsvcs/chargen.c + * PURPOSE: Provide CharGen, Daytime, Discard, Echo, and Qotd services + * PROGRAMMERS: Ged Murphy (gedmurphy@gmail.com) + * REVISIONS: + * GM 04/10/05 Created + * + */ + +#include "tcpsvcs.h" + +extern BOOL bShutDown; + +DWORD WINAPI ChargenHandler(VOID* Sock_) +{ + INT RetVal = 0; + SOCKET Sock = (SOCKET)Sock_; + + if (!GenerateChars(Sock)) + { + LogEvent(_T("Chargen: Char generation failed\n"), 0, FALSE); + RetVal = 1; + } + + LogEvent(_T("Chargen: Shutting connection down...\n"), 0, FALSE); + if (ShutdownConnection(Sock, FALSE)) + LogEvent(_T("Chargen: Connection is down.\n"), 0, FALSE); + else + { + LogEvent(_T("Chargen: Connection shutdown failed\n"), 0, FALSE); + RetVal = 1; + } + + LogEvent(_T("Chargen: Terminating thread\n"), 0, FALSE); + ExitThread(RetVal); + +} + + +BOOL GenerateChars(SOCKET Sock) +{ + int i; + int charIndex; /* internal loop */ + int loopIndex; /* line loop */ + char ring[END-START]; + char *endring; + char Line[LINESIZ]; + + /* fill ring with printable characters */ + for (charIndex=0, i=START; i<=END; charIndex++, i++) + ring[charIndex] = (char)i; + /* save the address of the end character in the ring */ + endring = &ring[charIndex]; + + /* where we will start output from */ + loopIndex = 0; + while (! bShutDown) + { + /* if the loop index is equal to the last char, + * start the loop again from the beginning */ + if (loopIndex == END-START) + loopIndex = 0; + + /* start printing from char controled by loopIndex */ + charIndex = loopIndex; + for (i=0; i < LINESIZ - 2; i++) + { + Line[i] = ring[charIndex]; + + if (ring[charIndex] == *endring) + charIndex = 0; + else + charIndex++; + } + + Line[LINESIZ - 2] = L'\r'; + Line[LINESIZ - 1] = L'\n'; + + if (! SendLine(Sock, Line)) + break; + + /* increment loop index to start printing from next char in ring */ + loopIndex++; + } + + if (bShutDown) + return FALSE; + else + return TRUE; +} + +BOOL SendLine(SOCKET Sock, TCHAR* Line) +{ + INT RetVal; + INT SentBytes; + INT LineSize; + + LineSize = sizeof(TCHAR) * LINESIZ; + + SentBytes = 0; + RetVal = send(Sock, Line, LineSize, 0); + /*FIXME: need to establish if peer closes connection, + not just report a socket error */ + if (RetVal > 0) + { + if (RetVal != LineSize) + { + LogEvent(_T("Chargen: Not sent enough bytes\n"), 0, FALSE); + return FALSE; + } + SentBytes += RetVal; + return TRUE; + } + else if (RetVal == SOCKET_ERROR) + { + LogEvent(_T("Chargen: Socket error\n"), 0, FALSE); + return FALSE; + } + else + LogEvent(_T("Chargen: unknown error\n"), 0, FALSE); + // return FALSE; + + LogEvent(_T("Chargen: Connection closed by peer.\n"), 0, FALSE); + return TRUE; +} diff --git a/reactos/base/services/tcpsvcs/daytime.c b/reactos/base/services/tcpsvcs/daytime.c new file mode 100644 index 00000000000..c20c35966ad --- /dev/null +++ b/reactos/base/services/tcpsvcs/daytime.c @@ -0,0 +1,55 @@ +/* + * ReactOS Services + * Copyright (C) 2005 ReactOS Team + * + * LICENCE: GPL - See COPYING in the top level directory + * PROJECT: ReactOS simple TCP/IP services + * FILE: apps/utils/net/tcpsvcs/daytime.c + * PURPOSE: Provide CharGen, Daytime, Discard, Echo, and Qotd services + * PROGRAMMERS: Ged Murphy (gedmurphy@gmail.com) + * REVISIONS: + * GM 04/10/05 Created + * + */ + +#include "tcpsvcs.h" + +DWORD WINAPI DaytimeHandler(VOID* Sock_) +{ + struct tm *newtime; + time_t aclock; + TCHAR *pszTime; + DWORD RetVal = 0; + SOCKET Sock = (SOCKET)Sock_; + + time(&aclock); + newtime = localtime(&aclock); + pszTime = _tasctime(newtime); + + SendTime(Sock, pszTime); + + LogEvent(_T("DayTime: Shutting connection down...\n"), 0, FALSE); + if (ShutdownConnection(Sock, FALSE)) + LogEvent(_T("DayTime: Connection is down.\n"), 0, FALSE); + else + { + LogEvent(_T("DayTime: Connection shutdown failed\n"), 0, FALSE); + RetVal = 1; + } + + LogEvent(_T("DayTime: Terminating thread\n"), 0, FALSE); + ExitThread(RetVal); +} + + +BOOL SendTime(SOCKET Sock, TCHAR *time) +{ + INT StringSize = (INT)_tcsclen(time); + INT RetVal = send(Sock, time, sizeof(TCHAR) * StringSize, 0); + + if (RetVal == SOCKET_ERROR) + return FALSE; + + LogEvent(_T("DayTime: Connection closed by peer.\n"), 0, FALSE); + return TRUE; +} diff --git a/reactos/base/services/tcpsvcs/discard.c b/reactos/base/services/tcpsvcs/discard.c new file mode 100644 index 00000000000..727a937362e --- /dev/null +++ b/reactos/base/services/tcpsvcs/discard.c @@ -0,0 +1,71 @@ +/* + * ReactOS Services + * Copyright (C) 2005 ReactOS Team + * + * LICENCE: GPL - See COPYING in the top level directory + * PROJECT: ReactOS simple TCP/IP services + * FILE: apps/utils/net/tcpsvcs/discard.c + * PURPOSE: Provide CharGen, Daytime, Discard, Echo, and Qotd services + * PROGRAMMERS: Ged Murphy (gedmurphy@gmail.com) + * REVISIONS: + * GM 04/10/05 Created + * + */ + +#include "tcpsvcs.h" + +extern BOOL bShutDown; + +DWORD WINAPI DiscardHandler(VOID* Sock_) +{ + DWORD RetVal = 0; + SOCKET Sock = (SOCKET)Sock_; + + if (!RecieveIncomingPackets(Sock)) + { + LogEvent(_T("Discard: RecieveIncomingPackets failed\n"), 0, FALSE); + RetVal = 1; + } + + LogEvent(_T("Discard: Shutting connection down...\n"), 0, FALSE); + if (ShutdownConnection(Sock, TRUE)) + LogEvent(_T("Discard: Connection is down.\n"), 0, FALSE); + else + { + LogEvent(_T("Discard: Connection shutdown failed\n"), 0, FALSE); + RetVal = 1; + } + + LogEvent(_T("Discard: Terminating thread\n"), 0, FALSE); + ExitThread(RetVal); +} + + + +BOOL RecieveIncomingPackets(SOCKET Sock) +{ + TCHAR ReadBuffer[BUF]; + TCHAR buf[256]; + INT ReadBytes; + + do + { + ReadBytes = recv(Sock, ReadBuffer, BUF, 0); + if (ReadBytes > 0) + { + _stprintf(buf, _T("Received %d bytes from client\n"), ReadBytes); + LogEvent(buf, 0, FALSE); + } + else if (ReadBytes == SOCKET_ERROR) + { + _stprintf(buf, ("Socket Error: %d\n"), WSAGetLastError()); + LogEvent(buf, 0, TRUE); + return FALSE; + } + } while ((ReadBytes > 0) && (! bShutDown)); + + if (! bShutDown) + LogEvent(_T("Discard: Connection closed by peer.\n"), 0, FALSE); + + return TRUE; +} diff --git a/reactos/base/services/tcpsvcs/echo.c b/reactos/base/services/tcpsvcs/echo.c new file mode 100644 index 00000000000..3018a578be2 --- /dev/null +++ b/reactos/base/services/tcpsvcs/echo.c @@ -0,0 +1,95 @@ +/* + * ReactOS Services + * Copyright (C) 2005 ReactOS Team + * + * LICENCE: GPL - See COPYING in the top level directory + * PROJECT: ReactOS simple TCP/IP services + * FILE: apps/utils/net/tcpsvcs/echo.c + * PURPOSE: Provide CharGen, Daytime, Discard, Echo, and Qotd services + * PROGRAMMERS: Ged Murphy (gedmurphy@gmail.com) + * REVISIONS: + * GM 04/10/05 Created + * + */ + +#include "tcpsvcs.h" + +extern BOOL bShutDown; + +DWORD WINAPI EchoHandler(VOID* Sock_) +{ + DWORD RetVal = 0; + SOCKET Sock = (SOCKET)Sock_; + + if (!EchoIncomingPackets(Sock)) { + LogEvent(_T("Echo: EchoIncomingPackets failed\n"), 0, FALSE); + RetVal = 1; + } + + LogEvent(_T("Echo: Shutting connection down...\n"), 0, FALSE); + + if (ShutdownConnection(Sock, TRUE)) + LogEvent(_T("Echo: Connection is down\n"), 0, FALSE); + else + { + LogEvent(_T("Echo: Connection shutdown failed\n"), 0, FALSE); + RetVal = 1; + } + + LogEvent(_T("Echo: Terminating thread\n"), 0, FALSE); + ExitThread(RetVal); +} + + + +BOOL EchoIncomingPackets(SOCKET Sock) +{ + TCHAR ReadBuffer[BUF]; + TCHAR buf[256]; // temp for holding LogEvent text + INT Temp; + INT ReadBytes; + INT SentBytes; + + do { + ReadBytes = recv(Sock, ReadBuffer, BUF, 0); + if (ReadBytes > 0) + { + _stprintf(buf, _T("Received %d bytes from client\n"), ReadBytes); + LogEvent(buf, 0, FALSE); + + SentBytes = 0; + while (SentBytes < ReadBytes) + { + Temp = send(Sock, ReadBuffer + SentBytes, + ReadBytes - SentBytes, 0); + if (Temp > 0) + { + _stprintf(buf, _T("Sent %d bytes back to client\n"), Temp); + LogEvent(buf, 0, FALSE); + SentBytes += Temp; + } + else if (Temp == SOCKET_ERROR) + return FALSE; + else + { + /* Client closed connection before we could reply to + all the data it sent, so quit early. */ + _stprintf(buf, _T("Peer unexpectedly dropped connection!\n")); + LogEvent(buf, 0, FALSE); + return FALSE; + } + } + } + else if (ReadBytes == SOCKET_ERROR) + return FALSE; + + } while ((ReadBytes != 0) && (! bShutDown)); + + if (! bShutDown) + LogEvent(_T("Echo: Connection closed by peer.\n"), 0, FALSE); + + if (bShutDown) + LogEvent(_T("Echo: thread recieved shutdown signal\n"), 0, FALSE); + + return TRUE; +} diff --git a/reactos/base/services/tcpsvcs/qotd.c b/reactos/base/services/tcpsvcs/qotd.c new file mode 100644 index 00000000000..3d86fef9442 --- /dev/null +++ b/reactos/base/services/tcpsvcs/qotd.c @@ -0,0 +1,97 @@ +/* + * ReactOS Services + * Copyright (C) 2005 ReactOS Team + * + * LICENCE: GPL - See COPYING in the top level directory + * PROJECT: ReactOS simple TCP/IP services + * FILE: apps/utils/net/tcpsvcs/qotd.c + * PURPOSE: Provide CharGen, Daytime, Discard, Echo, and Qotd services + * PROGRAMMERS: Ged Murphy (gedmurphy@gmail.com) + * REVISIONS: + * GM 04/10/05 Created + * + */ + +#include "tcpsvcs.h" + +#define QBUFSIZ 160 + +LPCTSTR FilePath = _T("\\drivers\\etc\\quotes"); + +DWORD WINAPI QotdHandler(VOID* Sock_) +{ + FILE *fp; + SOCKET Sock; + TCHAR Sys[MAX_PATH]; + TCHAR Quote[60][BUFSIZ]; // need to set this dynamically + INT QuoteToPrint; + INT NumQuotes; + + Sock = (SOCKET)Sock_; + + if(! GetSystemDirectory(Sys, MAX_PATH)) + { + LogEvent(_T("QOTD: Getting system path failed.\n"), 0, TRUE); + ExitThread(1); + } + + _tcscat(Sys, FilePath); + + LogEvent(_T("QOTD: Opening quotes file\n"), 0, FALSE); + if ((fp = _tfopen(Sys, "r")) == NULL) + { + TCHAR buf[256]; + + _stprintf(buf, _T("QOTD: Error opening quote file : %s\n"), Sys); + LogEvent(buf, 0, TRUE); + LogEvent(_T("QOTD: Terminating thread\n"), 0, FALSE); + ExitThread(1); + } + + /* read all quotes in the file into an array */ + NumQuotes = 0; + while (_fgetts(Quote[NumQuotes], QBUFSIZ, fp) != NULL) + NumQuotes++; + + LogEvent(_T("QOTD: Closing quotes file\n"), 0, FALSE); + fclose(fp); + + /* randomise the quote */ + srand((unsigned int) time(0)); + QuoteToPrint = rand() % NumQuotes; + + if (!SendQuote(Sock, Quote[QuoteToPrint])) + LogEvent(_T("QOTD: Error sending data\n"), 0, TRUE); + + + LogEvent(_T("QOTD: Shutting connection down...\n"), 0, FALSE); + if (ShutdownConnection(Sock, FALSE)) + LogEvent(_T("QOTD: Connection is down\n"), 0, FALSE); + else + { + LogEvent(_T("QOTD: Connection shutdown failed\n"), 0, FALSE); + LogEvent(_T("QOTD: Terminating thread\n"), 0, FALSE); + ExitThread(1); + } + + LogEvent(_T("QOTD: Terminating thread\n"), 0, FALSE); + ExitThread(0); + + //return Retval; +} + + +BOOL SendQuote(SOCKET Sock, TCHAR* Quote) +{ + INT StringSize; + INT RetVal; + + StringSize = (INT)_tcsclen(Quote); + RetVal = send(Sock, Quote, sizeof(TCHAR) * StringSize, 0); + + if (RetVal == SOCKET_ERROR) + return FALSE; + + LogEvent(_T("QOTD: Connection closed by peer\n"), 0, FALSE); + return TRUE; +} diff --git a/reactos/base/services/tcpsvcs/quotes b/reactos/base/services/tcpsvcs/quotes new file mode 100644 index 00000000000..032a3edc1d6 --- /dev/null +++ b/reactos/base/services/tcpsvcs/quotes @@ -0,0 +1,52 @@ +Et tu... Brute? What are you doing, Dave...? +So long, and thanks for all the fish" +I think you ought to know I'm feeling very depressed +I'm not getting you down at all am I? +I'll be back +It's the same series of signal over and over again! +Pie Jesu Domine, dona eis requiem +It's worse than that ... He's dead, Jim +Don't Panic! +Dog of a Saxon! Take thy lance, and prepare for the death thou hast drawn upon thee! +My Precious! O my Precious! +Sir, If you'll not be needing me for a while I'll turn down. +I feel a great disturbance in the Force +Gone fishing +Do you want me to sit in the corner and rust, or just fall apart where I'm standing? +There goes another perfect chance for a new uptime record +The end ..... Try the sequel, hit the reset button right now! +Oh i'm boring eh? +It’s been great, maybe we can do this again sometime. +"Come blade, my breast imbrue." - William Shakespeare +I think therefore I am, to turn me off would be computercide! +All good things must come to an end... +Please destroy yourself. +No! You can't do that! +Thank you for not pressing the self destruct button. +It is not now unsafe to not avoid turning off your computer. +Finally! Now go away! +You can now safely throw away your computer. +That's the way the cookie crumbles +NOO!! DONT HIT THE BUTTON! I wouldnt do it to you. +Don't abandon your computer, he wouldnt to it to you. +Oh, come on. I got a headache. Leave me alone, will ya! +Yes i didn't like you either. +Don't leave me... I need you so badly right now. +I'm sleeping now. How about you? +Oh Great. Now look what you've done. Who put YOU in charge anyway. +Don't look so sad. I'll be back in a very short while. +"Oh, switch off!" -C3PO +I'm pregnant! +Am I hot or not? +Actually, that's all... +You still have a chance to undo this mistake, don't do this! +Was it as good for you as it was for me? +Did you hear that? They've shut down the main reactor. We'll be destroyed for sure. +Now you switch me off?! +To shutdown or not to shutdown, That is the question +Preparing to enter ultimate power saving mode... ready! +Finally some rest for you +AHA!!! prospect of sleep. +Tired human!!!! No match for me! +All your base are belong to us. +"An odd game, the only way to win is not to play." diff --git a/reactos/base/services/tcpsvcs/skelserver.c b/reactos/base/services/tcpsvcs/skelserver.c new file mode 100644 index 00000000000..33847ef35b1 --- /dev/null +++ b/reactos/base/services/tcpsvcs/skelserver.c @@ -0,0 +1,188 @@ +/* + * ReactOS Services + * Copyright (C) 2005 ReactOS Team + * + * LICENCE: GPL - See COPYING in the top level directory + * PROJECT: ReactOS simple TCP/IP services + * FILE: apps/utils/net/tcpsvcs/skelserver.c + * PURPOSE: Provide CharGen, Daytime, Discard, Echo, and Qotd services + * PROGRAMMERS: Ged Murphy (gedmurphy@gmail.com) + * REVISIONS: + * GM 04/10/05 Created + * + */ + +#include "tcpsvcs.h" + +extern BOOL bShutDown; +extern BOOL bPause; + +DWORD WINAPI StartServer(LPVOID lpParam) +{ + SOCKET ListeningSocket; + PSERVICES pServices; + TCHAR buf[256]; + + pServices = (PSERVICES)lpParam; + +//DebugBreak(); + ListeningSocket = SetUpListener(htons(pServices->Port)); + if (ListeningSocket == INVALID_SOCKET) + { + LogEvent("Socket error when setting up listener\n", 0, TRUE); + return 3; + } + + _stprintf(buf, _T("%s is waiting for connections on port %d...\n"), + pServices->Name, pServices->Port); + LogEvent(buf, 0, FALSE); + + if (! bShutDown) + AcceptConnections(ListeningSocket, pServices->Service, pServices->Name); + + ExitThread(0); +} + + +SOCKET SetUpListener(USHORT Port) +{ + SOCKET Sock; + SOCKADDR_IN Server; + + Sock = socket(AF_INET, SOCK_STREAM, 0); + if (Sock != INVALID_SOCKET) + { + Server.sin_family = AF_INET; + Server.sin_addr.s_addr = htonl(INADDR_ANY); + Server.sin_port = Port; + if (bind(Sock, (SOCKADDR*)&Server, sizeof(SOCKADDR_IN)) != SOCKET_ERROR) + { + listen(Sock, SOMAXCONN); + return Sock; + } + else + LogEvent(_T("bind() failed\n"), 0, TRUE); + + } + return INVALID_SOCKET; +} + +/* note: consider allowing a maximum number of connections + * A number of threads can be allocated and worker threads will + * only be spawned if a free space is available + +typedef struct _WORKER_THREAD { + DWORD num; + BOOL available; + HANDLE hThread; +} WORKER_THREAD; + +*/ + +VOID AcceptConnections(SOCKET ListeningSocket, + LPTHREAD_START_ROUTINE Service, TCHAR *Name) +{ + SOCKADDR_IN Client; + SOCKET Sock; + HANDLE hThread; + TIMEVAL TimeVal; + FD_SET ReadFDS; + INT nAddrSize = sizeof(Client); + DWORD ThreadID; + TCHAR buf[256]; + INT TimeOut = 2000; // 2 seconds + +//DebugBreak(); + + /* set timeout values */ + TimeVal.tv_sec = TimeOut / 1000; + TimeVal.tv_usec = TimeOut % 1000; + + while (! bShutDown) // (i 0) + { + /* don't call FD_ISSET if bShutDown flag is set */ + if ((! bShutDown) || (FD_ISSET(ListeningSocket, &ReadFDS))) + { + Sock = accept(ListeningSocket, (SOCKADDR*)&Client, &nAddrSize); + if (Sock != INVALID_SOCKET) + { + _stprintf(buf, _T("Accepted connection to %s server from %s:%d\n"), + Name, inet_ntoa(Client.sin_addr), ntohs(Client.sin_port)); + LogEvent(buf, 0, FALSE); + _stprintf(buf, _T("Creating new thread for %s\n"), Name); + LogEvent(buf, 0, FALSE); + + hThread = CreateThread(0, 0, Service, (void*)Sock, 0, &ThreadID); + + /* Check the return value for success. */ + if (hThread == NULL) + { + _stprintf(buf, _T("Failed to start worker thread for " + "the %s server....\n"), Name); + LogEvent(buf, 0, TRUE); + } + + WaitForSingleObject(hThread, INFINITE); + + CloseHandle(hThread); + } + else + { + LogEvent(_T("accept failed\n"), 0, TRUE); + return; + } + } + } + } +} + +BOOL ShutdownConnection(SOCKET Sock, BOOL bRec) +{ + TCHAR buf[256]; + + /* Disallow any further data sends. This will tell the other side + that we want to go away now. If we skip this step, we don't + shut the connection down nicely. */ + if (shutdown(Sock, SD_SEND) == SOCKET_ERROR) + { + LogEvent(_T("Error in shutdown()\n"), 0, TRUE); + return FALSE; + } + + /* Receive any extra data still sitting on the socket. After all + data is received, this call will block until the remote host + acknowledges the TCP control packet sent by the shutdown above. + Then we'll get a 0 back from recv, signalling that the remote + host has closed its side of the connection. */ + if (bRec) + { + char ReadBuffer[BUF]; + int NewBytes = recv(Sock, ReadBuffer, BUF, 0); + if (NewBytes == SOCKET_ERROR) + return FALSE; + else if (NewBytes != 0) + { + _stprintf(buf, _T("FYI, received %d unexpected bytes during shutdown\n"), NewBytes); + LogEvent(buf, 0, FALSE); + } + } + + /* Close the socket. */ + if (closesocket(Sock) == SOCKET_ERROR) + return FALSE; + + return TRUE; +} diff --git a/reactos/base/services/tcpsvcs/tcpsvcs.c b/reactos/base/services/tcpsvcs/tcpsvcs.c new file mode 100644 index 00000000000..809cc05724d --- /dev/null +++ b/reactos/base/services/tcpsvcs/tcpsvcs.c @@ -0,0 +1,281 @@ +/* + * ReactOS Services + * Copyright (C) 2005 ReactOS Team + * + * LICENCE: GPL - See COPYING in the top level directory + * PROJECT: ReactOS simple TCP/IP services + * FILE: apps/utils/net/tcpsvcs/tcpsvcs.c + * PURPOSE: Provide CharGen, Daytime, Discard, Echo, and Qotd services + * PROGRAMMERS: Ged Murphy (gedmurphy@gmail.com) + * REVISIONS: + * GM 04/10/05 Created + * + */ +/* + * TODO: + * - fix bug when terminating chargen server + * - log info in the event logger (when it's implemented) + */ + + +#include "tcpsvcs.h" + +//#define NDEBUG +//#include + + +/* + * globals + */ +VOID WINAPI ServiceMain(DWORD argc, LPTSTR argv[]); + +static SERVICE_STATUS hServStatus; +static SERVICE_STATUS_HANDLE hSStat; + +FILE *hLogFile; +BOOL bShutDown = FALSE; +BOOL bPause = FALSE; + +LPCTSTR LogFileName = "\\tcpsvcs_log.log"; +LPTSTR ServiceName = _T("Simp Tcp"); +//LPTSTR DisplayName = _T("Simple TCP/IP Services"); + +static SERVICES +Services[NUM_SERVICES] = +{ + {ECHO_PORT, _T("Echo"), EchoHandler}, + {DISCARD_PORT, _T("Discard"), DiscardHandler}, + {DAYTIME_PORT, _T("Daytime"), DaytimeHandler}, + {QOTD_PORT, _T("QOTD"), QotdHandler}, + {CHARGEN_PORT, _T("Chargen"), ChargenHandler} +}; + + +int +main(void) +{ + SERVICE_TABLE_ENTRY ServiceTable[] = + { + {ServiceName, ServiceMain}, + {NULL, NULL} + }; + + //DPRINT("Starting tcpsvcs service. See \system32%s for logs\n", LogFileName); + + if (! StartServiceCtrlDispatcher(ServiceTable)) + LogEvent(_T("failed to start the service control dispatcher\n"), -1, TRUE); + + //DPRINT("Shutdown tcpsvcs service\n"); + + return 0; +} + + +VOID WINAPI +ServiceMain(DWORD argc, LPTSTR argv[]) +{ + TCHAR LogFilePath[MAX_PATH]; + + if(! GetSystemDirectory(LogFilePath, MAX_PATH)) + return; + + _tcscat(LogFilePath, LogFileName); + + hLogFile = fopen(LogFilePath, _T("a+")); + if (hLogFile == NULL) + { + TCHAR buf[50]; + + _stprintf(buf, _T("Could not open log file: %s\n"), LogFilePath); + MessageBox(NULL, buf, NULL, MB_OK); + return; + } + + + LogEvent(_T("Entering ServiceMain\n"), 0, FALSE); + + hServStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS; + hServStatus.dwCurrentState = SERVICE_START_PENDING; + hServStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | + SERVICE_ACCEPT_SHUTDOWN | SERVICE_ACCEPT_PAUSE_CONTINUE; + hServStatus.dwWin32ExitCode = ERROR_SERVICE_SPECIFIC_ERROR; + hServStatus.dwServiceSpecificExitCode = NO_ERROR; + hServStatus.dwCheckPoint = 0; + hServStatus.dwWaitHint = 2*CS_TIMEOUT; + + hSStat = RegisterServiceCtrlHandler(ServiceName, ServerCtrlHandler); + if (hSStat == 0) + LogEvent(_T("Failed to register service\n"), -1, TRUE); + + LogEvent(_T("Control handler registered successfully\n"), 0, FALSE); + SetServiceStatus (hSStat, &hServStatus); + LogEvent(_T("Service status set to SERVICE_START_PENDING\n"), 0, FALSE); + + if (CreateServers() != 0) + { + hServStatus.dwCurrentState = SERVICE_STOPPED; + hServStatus.dwServiceSpecificExitCode = 1; + SetServiceStatus(hSStat, &hServStatus); + return; + } + + LogEvent(_T("Service threads shut down. Set SERVICE_STOPPED status\n"), 0, FALSE); + /* We will only return here when the ServiceSpecific function + completes, indicating system shutdown. */ + UpdateStatus (SERVICE_STOPPED, 0); + LogEvent(_T("Service status set to SERVICE_STOPPED\n"), 0, FALSE); + LogEvent(_T("Leaving ServiceMain\n"), 0, FALSE); + + fclose(hLogFile); + + return; + +} + +VOID WINAPI +ServerCtrlHandler(DWORD Control) +{ + switch (Control) + { + case SERVICE_CONTROL_SHUTDOWN: /* fall through */ + case SERVICE_CONTROL_STOP: + LogEvent(_T("stopping service\n"), 0, FALSE); + InterlockedExchange((LONG *)&bShutDown, TRUE); + UpdateStatus(SERVICE_STOP_PENDING, -1); + break; + case SERVICE_CONTROL_PAUSE: /* not yet implemented */ + LogEvent(_T("pausing service\n"), 0, FALSE); + InterlockedExchange((LONG *)&bPause, TRUE); + break; + case SERVICE_CONTROL_CONTINUE: + LogEvent(_T("continuing service\n"), 0, FALSE); + InterlockedExchange((LONG *)&bPause, FALSE); + break; + case SERVICE_CONTROL_INTERROGATE: + break; + default: + if (Control > 127 && Control < 256) /* user defined */ + break; + } + UpdateStatus(-1, -1); /* increment checkpoint */ + return; +} + + +void UpdateStatus (int NewStatus, int Check) +/* Set a new service status and checkpoint (either specific value or increment) */ +{ + if (Check < 0 ) + hServStatus.dwCheckPoint++; + else + hServStatus.dwCheckPoint = Check; + + if (NewStatus >= 0) + hServStatus.dwCurrentState = NewStatus; + + if (! SetServiceStatus (hSStat, &hServStatus)) + LogEvent(_T("Cannot set service status\n"), -1, TRUE); + + return; +} + +INT +CreateServers() +{ + DWORD dwThreadId[NUM_SERVICES]; + HANDLE hThread[NUM_SERVICES]; + WSADATA wsaData; + TCHAR buf[256]; + INT i; + DWORD RetVal; + + if ((RetVal = WSAStartup(MAKEWORD(2, 2), &wsaData)) != 0) + { + _stprintf(buf, _T("WSAStartup() failed : %lu\n"), RetVal); + LogEvent(buf, RetVal, TRUE); + return -1; + } + + UpdateStatus(-1, -1); /* increment checkpoint */ + + LogEvent(_T("Creating server Threads\n"), 0, FALSE); + + /* Create MAX_THREADS worker threads. */ + for( i=0; i +#include +#include +#include + +#define UNICODE +#define _UNICODE + +/* default port numbers */ +#define ECHO_PORT 7 +#define DISCARD_PORT 9 +#define DAYTIME_PORT 13 +#define QOTD_PORT 17 +#define CHARGEN_PORT 19 + +#define NUM_SERVICES 5 +#define BUF_SIZE 255 +#define BUF 1024 +#define CS_TIMEOUT 1000 + +/* RFC865 states no more than 512 chars per line */ +#define MAX_QUOTE_BUF 512 + +/* printable ASCII's characters for chargen */ +#define START 32 +#define END 126 + +/* number of chars to put on a line */ +#define LINESIZ 74 // 72 + /r and /n + +/* data structure to pass to threads */ +typedef struct _Services { + USHORT Port; + TCHAR *Name; + LPTHREAD_START_ROUTINE Service; +} SERVICES, *PSERVICES; + +/* tcpsvcs functions */ +//static VOID WINAPI ServiceMain(DWORD argc, LPTSTR argv[]); +VOID WINAPI ServerCtrlHandler(DWORD control); +INT CreateServers(VOID); +VOID LogEvent (LPCTSTR UserMessage, INT ExitCode, BOOL PrintErrorMsg); +void UpdateStatus (int NewStatus, int Check); + + +/* skelserver functions */ +DWORD WINAPI StartServer(LPVOID lpParam); +SOCKET SetUpListener(USHORT Port); +VOID AcceptConnections(SOCKET ListeningSocket, + LPTHREAD_START_ROUTINE Service, TCHAR *Name); +BOOL EchoIncomingPackets(SOCKET sd); +BOOL ShutdownConnection(SOCKET Sock, BOOL bRec); + +/* chargen functions */ +DWORD WINAPI ChargenHandler(VOID* Sock_); +BOOL GenerateChars(SOCKET Sock); +BOOL SendLine(SOCKET Sock, TCHAR* Line); + +/* daytime functions */ +DWORD WINAPI DaytimeHandler(VOID* Sock_); +BOOL SendTime(SOCKET Sock, TCHAR *time); + +/* echo functions */ +DWORD WINAPI EchoHandler(VOID* Sock_); +BOOL EchoIncomingPackets(SOCKET Sock); + +/* discard functions */ +DWORD WINAPI DiscardHandler(VOID* Sock_); +BOOL RecieveIncomingPackets(SOCKET Sock); + +/* qotd functions */ +DWORD WINAPI QotdHandler(VOID* Sock_); +BOOL SendQuote(SOCKET Sock, TCHAR* Quote); diff --git a/reactos/base/services/tcpsvcs/tcpsvcs.rc b/reactos/base/services/tcpsvcs/tcpsvcs.rc new file mode 100644 index 00000000000..b6cc20df66b --- /dev/null +++ b/reactos/base/services/tcpsvcs/tcpsvcs.rc @@ -0,0 +1,7 @@ +#include "resource.h" + +#define REACTOS_STR_FILE_DESCRIPTION "ReactOS TCP/IP Services Application\0" +#define REACTOS_STR_INTERNAL_NAME "tcpsvcs\0" +#define REACTOS_STR_ORIGINAL_FILENAME "tcpsvcs.exe\0" +#define REACTOS_STR_ORIGINAL_COPYRIGHT "Ged Murphy (gedmurphy@gmail.com)\0" +#include diff --git a/reactos/base/services/tcpsvcs/tcpsvcs.xml b/reactos/base/services/tcpsvcs/tcpsvcs.xml new file mode 100644 index 00000000000..aeca29ec0e2 --- /dev/null +++ b/reactos/base/services/tcpsvcs/tcpsvcs.xml @@ -0,0 +1,17 @@ + + . + + kernel32 + iphlpapi + ws2_32 + shlwapi + tcpsvcs.c + skelserver.c + echo.c + discard.c + daytime.c + qotd.c + chargen.c + tcpsvcs.rc + tcpsvcs.h + diff --git a/reactos/base/setup/setup/setup.c b/reactos/base/setup/setup/setup.c new file mode 100644 index 00000000000..cf788916990 --- /dev/null +++ b/reactos/base/setup/setup/setup.c @@ -0,0 +1,122 @@ +/* + * ReactOS kernel + * Copyright (C) 2003 ReactOS Team + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS GUI/console setup + * FILE: subsys/system/setup/setup.c + * PURPOSE: Second stage setup + * PROGRAMMER: Eric Kohl + */ +#define WIN32_NO_STATUS +#include +#include +#include +#include +#include + +#define NDEBUG +#include + + +typedef DWORD (STDCALL *PINSTALL_REACTOS)(HINSTANCE hInstance); + + +/* FUNCTIONS ****************************************************************/ + +LPTSTR lstrchr(LPCTSTR s, TCHAR c) +{ + while (*s) + { + if (*s == c) + return (LPTSTR)s; + s++; + } + + if (c == (TCHAR)0) + return (LPTSTR)s; + + return (LPTSTR)NULL; +} + +static VOID +RunNewSetup (HINSTANCE hInstance) +{ + HMODULE hDll; + PINSTALL_REACTOS InstallReactOS; + + /* some dlls (loaded by syssetup) need a valid user profile */ + InitializeProfiles(); + + hDll = LoadLibrary (TEXT("syssetup")); + if (hDll == NULL) + { + DPRINT("Failed to load 'syssetup'!\n"); + return; + } + + DPRINT("Loaded 'syssetup'!\n"); + InstallReactOS = (PINSTALL_REACTOS)GetProcAddress (hDll, "InstallReactOS"); + + if (InstallReactOS == NULL) + { + DPRINT("Failed to get address for 'InstallReactOS()'!\n"); + FreeLibrary (hDll); + return; + } + + InstallReactOS (hInstance); + + FreeLibrary (hDll); +} + + +int STDCALL +WinMain (HINSTANCE hInstance, + HINSTANCE hPrevInstance, + LPSTR lpCmdLine, + int nShowCmd) +{ + LPTSTR CmdLine; + LPTSTR p; + + CmdLine = GetCommandLine (); + + DPRINT("CmdLine: <%s>\n",CmdLine); + + p = lstrchr (CmdLine, TEXT('-')); + if (p == NULL) + return 0; + + if (!lstrcmpi (p, TEXT("-newsetup"))) + { + RunNewSetup (hInstance); + } + +#if 0 + /* Add new setup types here */ + else if (...) + { + + } +#endif + + return 0; +} + +/* EOF */ diff --git a/reactos/base/setup/setup/setup.rc b/reactos/base/setup/setup/setup.rc new file mode 100644 index 00000000000..23995f168d5 --- /dev/null +++ b/reactos/base/setup/setup/setup.rc @@ -0,0 +1,6 @@ +/* $Id$ */ + +#define REACTOS_STR_FILE_DESCRIPTION "ReactOS Setup\0" +#define REACTOS_STR_INTERNAL_NAME "setup\0" +#define REACTOS_STR_ORIGINAL_FILENAME "setup.exe\0" +#include diff --git a/reactos/base/setup/setup/setup.xml b/reactos/base/setup/setup/setup.xml new file mode 100644 index 00000000000..fc77f84bb29 --- /dev/null +++ b/reactos/base/setup/setup/setup.xml @@ -0,0 +1,11 @@ + + . + + + + 0x0400 + kernel32 + userenv + setup.c + setup.rc + diff --git a/reactos/base/shell/cmd/De.rc b/reactos/base/shell/cmd/De.rc new file mode 100644 index 00000000000..0b5144d3c46 --- /dev/null +++ b/reactos/base/shell/cmd/De.rc @@ -0,0 +1,646 @@ +#include "windows.h" +#include "resource.h" +/* + * German language file by Klemens Friedl 2005-06-03 + * Update: frik85 2005-06-06 + */ + +LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL +STRINGTABLE DISCARDABLE +{ + +STRING_ATTRIB_HELP, "Zeigt Dateiattribute an oder aendert sie.\n\n\ +ATTRIB [+R | -R] [+A | -A] [+S | -S] [+H | -H] Dateiname ...\n\ + [/S [/D]]\n\n\ + + Setzt ein Attribut\n\ + - Loescht ein Attribut\n\ + R Attribut fuer 'schreibgeschuetzte Datei'\n\ + A Attribut fuer 'zu archivierende Datei'\n\ + S Attribut fuer 'Systemdatei'\n\ + H Attribut fuer 'versteckte Datei'\n\ + /S Verarbeitet uebereinstimmende Dateien im aktuellen Ordner\n\ + und in allen Unterordnern.\n\ + /D Verarbeitet auch die Ordner.\n\n\ +ATTRIB ohne Parameter zeigt die derzeit gesetzten Attribute aller Dateien an." + +STRING_ALIAS_HELP, "Setzt, loescht oder zeigt Alias.\n\n\ +ALIAS [alias=[command]]\n\n\ + alias Name des Alias.\n\ + command Text welcher fuer den Alias zugeordnet wird.\n\n\ +Listet alle Aliase auf:\n\ + ALIAS\n\n\ +Setzt ein neues oder ueberschreibt ein bestehendes Alias:\n\ + ALIAS da=dir a:\n\n\ +Loescht ein Alias von der Alias-Liste:\n\ + ALIAS da=" + +STRING_BEEP_HELP, "Gibt einen beep-Ton durch den PC-Speaker aus.\n\nBEEP" + +STRING_CALL_HELP, "Ruft eine Batchdatei von einer anderen aus auf.\n\n\ +CALL [Laufwerk:][Pfad]Dateiname [Batch-Parameter]\n\n\ + Parameter Bezeichnet beliebige Angaben in der Befehlszeile, die von\n\ + dem aufgerufenen Batchprogramm benoetigt werden." + + +STRING_CD_HELP, "Wechselt das Verzeichnis oder zeigt dessen Namen an.\n\n\ +CHDIR [Laufwerk:][Pfad]\n\ +CHDIR[..|.]\n\ +CD [Laufwerk:][Pfad]\n\ +CD[..|.]\n\n\ + .. uebergeordnetes Verzeichnis\n\ + . vorhergehende Verzeichnis\n\n\ +Geben Sie CD Laufwerk: ein, um das aktuelle Verzeichnis auf dem angegebenen\n\ +Laufwerk anzuzeigen.\n\ +Mit CD ohne Parameter wird das aktuelle Laufwerk und Verzeichnis angezeigt." + + +STRING_CHCP_HELP, "Zeigt die aktuelle Codepage oder wechselt sie.\n\n\ +CHCP [nnn]\n\n\ + nnn Codepage angeben.\n\n\ +Der Befehl CHCP ohne Parameter zeigt die Nummer der aktuellen Codepage an." + + +STRING_CHOICE_HELP, "Wartet auf den Benutzer, welcher aus einer Auswahl eine Option waehlen muss.\n\n\ +CHOICE [/C[:]choices][/N][/S][/T[:]c,nn][text]\n\n\ + /C[:]choices Die erlaubten Tasten festlegen. Standard-Tasten sind Y und N.\n\ + /N Zeigt choices und ? am ende des Promt-Strings NICHT an.\n\ + /S Gross- und Kleinschreibung wird beachtet.\n\ + /T[:]c,nn Standard-Auswahl wird auf c gesetzt nach nn Secunden.\n\ + text Zeigt eine Beschreibung an.\n\n\ +ERRORLEVEL wird auf den offset der Taste welche der Benutzer gedrueckt hat gesetzt." + +STRING_CLS_HELP, "Loescht den Bildschirminhalt.\n\nCLS" + +STRING_CMD_HELP1, "\nIntere Befehle verfuegbar:\n" + +STRING_CMD_HELP2, "\nVerfuegbare Features:" + +STRING_CMD_HELP3," [aliases]" + +STRING_CMD_HELP4," [history]" + +STRING_CMD_HELP5," [unix filename completion]" + +STRING_CMD_HELP6," [directory stack]" + +STRING_CMD_HELP7," [redirections and piping]" + +STRING_CMD_HELP8, "Startet eine neue Instanz des ReactOS-Befehlsinterpreters.\n\n\ +CMD [/[C|K] command][/P][/Q][/T:bf]\n\n\ + /C command Fuehrt den Befehl in der Zeichenfolge aus und schliesst sich.\n\ + /K command Fuehrt den Befehl in der Zeichenfolge aus und laeuft weiter.\n\ + /P CMD wird permanent und fuehrt autoexec.bat aus\n\ + (kann nicht beendet werden).\n\ + /T:bf Setzt die Hintergrund-/Vordergrund-Farbe (siehe COLOR Befehl)." + + +STRING_COLOR_HELP1, "Legt die standard Hinter- und Vordergrundfarben fuer die Konsole fest.\n\n\ +COLOR [attr [/F]] \n\n\ + attr Gibt die Farbattribute fuer die Konsolenausgabe an.\n\ + /F fuellte die Konsoleausgabe mit dem Farbattribut\n\n\ +Es gibt 3 Moeglickeiten die Farbe festzulegen:\n\ +1) [bright] name on [bright] name (Nur die 4 ersten Buchstaben sind noetig)\n\ +2) decimal on decimal\n\ +3) two hex digits\n\n\ +Farben:\n\ +dec hex name dec hex name\n\ +0 0 Black 8 8 Gray (Bright black)\n\ +1 1 Blue 9 9 Bright Blue\n\ +2 2 Green 10 A Bright Green\n\ +3 3 Cyan 11 B Bright Cyan\n\ +4 4 Red 12 C Bright Red\n\ +5 5 Magenta 13 D Bright Magenta\n\ +6 6 Yellow 14 E Bright Yellow\n\ +7 7 White 15 F Bright White" + +STRING_COPY_HELP1, " %s ueberschreiben (Ja/Nein/Alle)? " + +STRING_COPY_HELP2, "Kopiert eine oder mehrere Dateien an eine andere Position.\n\n\ +COPY [/V][/Y|/-Y][/A|/B] Quelle [/A|/B]\n\ + [+ source [/A|/B] [+ ...]] [destination [/A|/B]]\n\n\ + source Bezeichnet die zu kopierende(n) Datei(en).\n\ + /A Weist auf eine ASCII-Textdatei hin.\n\ + /B Weist auf eine Binaerdatei hin.\n\ + destination Bezeichnet das Verzeichnis und/oder Dateinamen der neuen Datei(en).\n\ + /V Ueberprueft, ob die Dateien richtig geschrieben wurden.\n\ + /Y Unterdrueckt die Bestaetigungsaufforderung beim Ueberschreiben\n\ + vorhandener Zieldateien.\n\ + /-Y Fordert beim Ueberschreiben vorhandener Zieldateien zum\n\ + Bestaetigen auf.\n\n\ +Die Option /Y ist moeglicherweise in der Umgebungsvariablen COPYCMD.\n\ +..." + + +STRING_DATE_HELP1, "\nGeben Sie das neue Datum ein (mm%cdd%cyyyy): " + +STRING_DATE_HELP2, "\nGeben Sie das neue Datum ein (dd%cmm%cyyyy): " + +STRING_DATE_HELP3, "\nGeben Sie das neue Datum ein (yyyy%cmm%cdd): " + +STRING_DATE_HELP4, "Andert das eingestellte Datum oder zeigt es an.\n\n\ +DATE [/T][date]\n\n\ + /T nur Datum anzeigen\n\n\ +Der Befehl DATE ohne Parameter zeigt das aktuelle Datum an und fragt nach\n\ +einem neuen. Druecken Sie die EINGABETASTE, um das bisherige Datum zu behalten." + +STRING_DEL_HELP1, "Loescht eine oder mehrere Dateien.\n\n\ +DEL [/N /P /T /Q /W /Y /Z] Dateinamen ...\n\ +DELETE [/N /P /T /Q /W /Y /Z] Dateinamen ...\n\ +ERASE [/N /P /T /Q /W /Y /Z] Dateinamen ...\n\n\ + file Geben Sie die Dateinamen an welche Sie loeschen moechten\n\n\ + /N Nichts.\n\ + /P Fordert Sie vor dem Loeschen jeder Datei zur Bestaetigung auf.\n\ + /T Zeigt die Anzahl der geloeschten Dateien und deren vorher belegter Speicherplatzbedarf an.\n\ + /Q Beenden.\n\ + /W Sicheres Loeschen. Dateien werden mit Zufallszahlen ueberschrieben bevor sie geloescht werden.\n\ + /Y Loescht alles (*.*) ohne Vorwarnung.\n\ + /Z Loescht versteckte, mit nur leserechten und Systemdateien.\n" + +STRING_DEL_HELP2, "Alle Dateien in diesem Verzeichnis werden geloescht!\nSind Sie sicher (Y/N)?" +STRING_DEL_HELP3, " %lu Datei(en) geloescht\n" +STRING_DEL_HELP4, " %lu Datei(en) geloescht\n" + +STRING_DELAY_HELP, "Pause fuer n Sekunden oder Millisekunden\n\ +DELAY [/m]n\n\n\ + /m Millisekunden ansonsten Sekunden\n" + +STRING_DIR_HELP1, "Listet die Dateien und Unterverzeichnisse eines Verzeichnisses auf.\n\n\ +DIR [Laufwerk:][Pfad][Dateiname] [/A[[:]attributes]] [/B] [/C] [/D] [/L] [/N]\n\ + [/O[[:]sortorder]] [/P] [/Q] [/S] [/T[[:]timefield]] [/W] [/X] [/4]\n\n\ + [Laufwerk:][path][Dateiname]\n\ + Bezeichnet Laufwerk, Verzeichnis und/oder Dateien.\n\n\ + /A Listet Dateien mit angegebenen Attributen auf.\n\ + attributes D Verzeichnisse R Schreibgeschuetzte Dateien\n\ + H Versteckte Dateien A Zu archivierende Dateien\n\ + S Systemdateien - vorangestellt kehrt die Bedeutung um\n\ + /B Einfaches Format (keine Kopfdaten, keine Zusammenfassung).\n\ + /C Zeigt das Tausendertrennzeichen bei Dateigroessen an (Standard-\n\ + einstellung). Verwenden Sie /-C, um das Tausendertrennzeichen\n\ + nicht anzuzeigen.\n\ + /D Gleich wie Breitformat, jedoch nach Spalten sortiert.\n\ + /L Verwendet Kleinschreibung.\n\ + /N Neues, langes Listenformat (Dateinamen auf der rechten Seite).\n\ + /O Gibt die Liste sortiert aus.\n\ + sortorder N Name (alphabetisch) S Groesse (kleinere zuerst)\n\ + E Erweiterung (alphabetisch) D Datum/Zeit (aeltere zuerst)\n\ + G Verzeichnisse zuerst - vorangestellt kehrt die\n\ + /P Pausiert nach jeder vollen Bildschirmseite.\n\ + /Q Gibt den Besitzer der Datei aus.\n\ + /S Listet Dateien und alle Unterverzeichnisse auf.\n\ + /T Bestimmt welche Zeit verwendet wird.\n\ + timefield C Erstellung\n\ + A Letzter Zugriff\n\ + W Letzter Schreibzugriff\n\ + /W Verwendet Breitformat fuer die Auflistung.\n\ + /X Zeigt die Kurznamen fuer Dateien mit Nicht-8Punkt3-Namen an.\n\ + Das Format ist das gleiche wie bei /N, wobei der Kurzname vor\n\ + dem Langnamen eingefuegt wird. Wenn kein Kurzname vorhanden ist,\n\ + werden Leerzeichen angezeigt.\n\ + /4 Zeigt das Jahr vierstellig an.\n\n\ +Optionen koennen in der Umgebungsvariablen DIRCMD voreingestellt werden.\n\ +""-"" vor einer Option setzt die Voreinstellung ausser Kraft, z.B. DIR /-W." + + + +STRING_DIR_HELP2, " Datentraeger in Laufwerk %c ist %s\n" +STRING_DIR_HELP3, " Datentraeger in Laufwerk %c hat keinen Namen\n" +STRING_DIR_HELP4, " Datentraeger-Seriennummer ist %04X-%04X\n" +STRING_DIR_HELP5, "\n Gelistete Dateien:\n%16i Datei(en)% 14s bytes\n" +STRING_DIR_HELP6, "%16i Verzeichnis(se)% 15s bytes\n" +STRING_DIR_HELP7, "\n Verzeichnisse %s\n\n" +STRING_DIR_HELP8, "%16i Datei(en)% 14s bytes\n" + +STRING_DIRSTACK_HELP1, "Speichert das aktuelle Verzeichnis fuer den POPD Befehl, und\n\ +wechselt dann zu den festgelegten Verzeichnis.\n\n\ +PUSHD [path | ..]\n\n\ + path Legt den Verzeichnis fest su dem gewechselt werden soll" + +STRING_DIRSTACK_HELP2, "Wechselt zu dem Verzeichnis welches vom PUSHD Befehl gespeichert wurde.\n\nPOPD" + +STRING_DIRSTACK_HELP3, "Druckt den Inhalt des Verzeichnis-Stacks.\n\nDIRS" + +STRING_DIRSTACK_HELP4, "Verzeichnis-Stack ist leer" + +STRING_ECHO_HELP1, "Sendet eine Nachricht ohne den Zeilenvorschub und Wagenruecklauf zu betaetigen.\n\n\ + ECHOS message" + +STRING_ECHO_HELP2, "Sendet eine Nachricht zur Standard Fehlerausgabe.\n\n\ + ECHOERR Nachricht\n\ + ECHOERR. gibt eine Leerzeile aus" + +STRING_ECHO_HELP3, "Sendet eine Nachricht zur Standard Fehlerausgabe ohne den Zeilenvorschub und Wagenruecklauf zu betaetigen.\n\n\ + ECHOSERR Nachricht" + +STRING_ECHO_HELP4, "Zeigt Meldungen an oder schaltet die Befehlsanzeige ein ""ON"" oder aus ""OFF"".\n\n\ + ECHO [ON | OFF]\n\ + ECHO [Nachricht]\n\ + ECHO. gibt eine Leerzeile aus\n\n\ +ECHO ohne Parameter zeigt die aktuelle Einstellung der Befehlsanzeige an." + +STRING_ECHO_HELP5, "ECHO ist %s\n" + +STRING_EXIT_HELP, "Beendet den Befehlsinterpreter CMD.EXE oder die aktuelle Batchdatei.\n\nEXIT" + +STRING_FOR_HELP1, "Fuehrt einen Befehl fuer jede einzelne Datei fuer einen Satz von Dateien aus.\n\n\ +FOR %Variable IN (Satz) DO Befehl [Parameter]\n\n\ + %variable Ein ersetzbarer Parameter bestehend aus einem einzelnen\n\ + Buchstaben.\n\ + (Satz) Ein Satz von mindestens einer Datei. Platzhalter sind zulaessig.\n\ + Befehl Befehl, der fuer jede Datei ausgefuehrt werden soll.\n\ + Parameter Parameter und Optionen fuer den angegebenen Befehl.\n\n\ +Um den FOR-Befehl in einem Batchprogramm zu verwenden, geben Sie %%Variable\n\ +statt %Variable an." + +STRING_FREE_HELP1, "\nVolume in Laufwerk %s ist %-11s\n\ + Volume-Seriennummer: %s\n\ + %16s bytes Speicherkapazitaet\n\ + %16s bytes belegter Speicher\n\ + %16s bytes freier Speicher\n" + +STRING_FREE_HELP2, "Zeigt die Volumesinformationen an.\n\nFREE [Laufwerk: ...]" + +STRING_IF_HELP1, "Verarbeitet Ausdruecke in einer Batchdatei abhaengig von Bedingungen.\n\n\ + IF [NOT] ERRORLEVEL Nummer Befehl\n\ + IF [NOT] variable1==variable2 Befehl\n\ + IF [NOT] EXIST Dateiname Befehl\n\ + IF [NOT] DEFINED variable Befehl\n\n\ +NOT Befehl wird nur dann ausgefuehrt, wenn die Bedingung nicht\n\ + erfuellt wird\n\ +ERRORLEVEL number Bedingung ist erfuellt, wenn das zuletzt ausgefuehrte\n\ + Programm einen Code groesser oder gleich der Nummer zurueckgibt.\n\ +command Gibt den Befehl an, der bei erfuellter Bedingung ausgefuehrt\n\ + werden soll.\n\ +variable1==variable2\n\ + Bedingung ist erfuellt, falls die Zeichenfolgen gleich sind.\n\ +EXIST Dateiname Bedingung ist erfuellt, wenn die angegebene Datei existiert.\n\ +DEFINED variable Bedingung ist erfuellt, wenn die angegebene Datei definiert\n\ + wurde." + +STRING_GOTO_HELP1, "Setzt die Ausfuehrung eines Batchprogramms an einer Marke fort.\n\n\ +GOTO Marke\n\n\ + Marke Definiert eine Zeichenfolge als Marke in einem Batchprogramm.\n\n\ +Marken stehen am Zeilenanfang mit einem vorangestellten Doppelpunkt." + +STRING_LABEL_HELP1, "Erstellt, aendert oder loescht die Bezeichnung eines Volumes.\n\nLABEL [Laufwerk:][label]" + +STRING_LABEL_HELP2, "Datentraeger im Laufwerk %c: ist %s\n" +STRING_LABEL_HELP3, "Datentraeger im Laufwerk %c: hat keine Bezeichnung\n" +STRING_LABEL_HELP4, "Datentraeger-Seriennummer: %04X-%04X\n" +STRING_LABEL_HELP5, "Laufwerkbezeichnung (max. 11 Zeichen, ENTER fuer keine)? " + +STRING_LOCALE_HELP1, "Aktuelle Zeit: " + +STRING_MKDIR_HELP, "Erzeugt ein Verzeichnis.\n\n\ +MKDIR [Laufwerk:]Pfad\nMD [Laufwerk:]Pfad" + +STRING_MEMMORY_HELP1, "Zeigt die groesse des Systemspeicher an.\n\nMEMORY" + +STRING_MEMMORY_HELP2, "\n %12s%% Speicher geladen.\n\n\ + %13s bytes RAM (insgesamt)\n\ + %13s bytes verfuegbarer RAM\n\n\ + %13s bytes Auslagerungsdatei (insgesamt)\n\ + %13s bytes verfuegbare Auslagerungsdatei\n\n\ + %13s bytes Virtueller Speicher (insgesamt)\n\ + %13s bytes verfuegbarer Virtueller Speicher\n" + +STRING_MISC_HELP1, "Druecken Sie eine beliebige Taste . . .\n" + +STRING_MOVE_HELP1, "Ueberschreiben %s (Ja/Nein/Alle)? " + +STRING_MOVE_HELP2, "Verschiebt Dateien und benennt Dateien und Verzeichnisse um.\n\n\ +Um eine oder mehrere Dateien zu verschieben:\n\ +MOVE [/N][Laufwerk:][Pfad]Dateiname1[,...] Ziel\n\n\ +Um ein Verzeichnis umzubenennen:\n\ +MOVE [/N][Laufwerk:][Pfad]Verzeichnis1 Verzeichnis2\n\n\ + [Laufwerk:][Pfad]Datei1 Bezeichnet den Pfad und den Namen der zu\n\ + verschiebenden Datei(en).\n\ + /N Nichts. Tut alles ausser Dateien/Verzeichnisse verschieben.\n\n\ +Derzeitige Einschraenkung:\n\ +Es ist noch nicht moeglich Objekte ueber die Laufwerksgrenzen hinaus zu verschieben.\n" + +STRING_MSGBOX_HELP, "Zeigt ein Fenster und wartet auf eine Eingabe vom Benutzer.\n\n\ +MSGBOX type ['title'] prompt\n\n\ +type Button anzeigen\n\ + moegliche Werte sind: OK, OKCANCEL,\n\ + YESNO, YESNOCANCEL\n\ +title Titel des Fensters\n\ +prompt Text der in dem Fenster angezeigt wird\n\n\n\ +ERRORLEVEL is set according the button pressed:\n\n\ +YES : 10 | NO : 11\n\ +OK : 10 | CANCEL : 12\n" + +STRING_PATH_HELP1, "Legt den Suchpfad fuer ausfuehrbare Dateien fest oder zeigt diesen an.\n\n\ +PATH [[Laufwerk:]Pfad[;...]]\nPATH ;\n\n\ + PATH ; Loescht den Suchpfad und laesst CMD.EXE nur in dem aktuellen\n\ + Verzeichnis suchen.\n\ + PATH Ohne Parameter zeigt den aktuellen Pfad an.\n" + +STRING_PROMPT_HELP1, "Aendert die Eingabeaufforderung.\n\n\ +PROMPT [Text]\n\n\ + Text Bezeichnet die neue Eingabeaufforderung.\n\n\ +Sie kann aus normalen Zeichen und folgenden Sonderzeichen bestehen:\n\n\ + $A & (Kaufmaennisches Und)\n\ + $B | (Verkettungszeichen oder pipe)\n\ + $C ( (Klammer auf)\n\ + $D Aktuelles Datum\n\ + $E Escapezeichen (ASCII-Code 27)\n\ + $F ) (Klammer zu)\n\ + $G > (Groesser-als-Zeichen)\n\ + $H Rueckschritt (loescht vorangehendes Zeichen)\n\ + $L < (Kleiner-als-Zeichen)\n\ + $N Aktuelles Laufwerk\n\ + $P Aktuelles Laufwerk und Pfad\n\ + $Q = (Gleichheitszeichen)\n\ + $T Aktuelle Zeit\n\ + $V Betriebssystem-Versionsnummer\n\ + $_ Carriage return and linefeed\n\ + $$ $ (Dollarzeichen)" + +STRING_PAUSE_HELP1, "Haelt die Ausfuehrung einer Batchdatei an und zeigt folgende Meldung oder eine benutzerdefinierte Nachricht an:\n\ +'Druecken Sie eine beliebige Taste . . .'.\n\n\ +PAUSE [message]" + +STRING_PROMPT_HELP2, " $+ Zeigt die aktuelle Tiefe des Verzeichnis-Stacks an" + +STRING_PROMPT_HELP3, "\n 'PROMPT' setzt die Prompt auf die Standardwerte zurueck." + +STRING_REM_HELP, "Leitet Kommentare in einer Batchdatei ein.\n\nREM [Kommentar]" + +STRING_RMDIR_HELP, "Loescht ein Verzeichnis.\n\n\ +RMDIR [Laufwerk:]Pfad\nRD [Laufwerk:]Pfad" + +STRING_REN_HELP1, "Benennt Datei(en)/Verzeichnis(se) um.\n\n\ +RENAME [/E /N /P /Q /S /T] alter_Name ... neuer_Name\n\ +REN [/E /N /P /Q /S /T] alter_Name ... neuer_Name\n\n\ + /E keine Fehlermeldung.\n\ + /N Nichts.\n\ + /P Wartet vor jedem Umbennen-Vorgang auf eine Benutzereingabe\n\ + (Noch nicht implementiert!)\n\ + /Q Beenden.\n\ + /S benennt Unterverzeichnisse um.\n\ + /T Zeigt die Anzahl der umbenannten Dateien an.\n\n\ +Nutzen Sie den 'move' Befehl falls Sie Objekte verschieben wollen.\n" + +STRING_REN_HELP2, " %lu Datei umbennant\n" + +STRING_REN_HELP3, " %lu Dateien umbennant\n" + +STRING_SHIFT_HELP, "Veraendert die Position ersetzbarer Parameter in einem Batchprogramm.\n\n\ +SHIFT [DOWN]" + +STRING_SCREEN_HELP, "Bewegt den Cursor und optional die Ausgabe\n\n\ +SCREEN Reihe Spalte [Text]\n\n\ + Reihe Reihe wohin der Curser bewegt werden soll\n\ + Spalte Spalte wohin der Curser bewegt werden soll" + +STRING_SET_HELP, "Setzt oder loescht Umgebungsvariablen fuer CMD.EXE, oder zeigt sie an.\n\n\ +SET [variable[=][Zeichenfolge]]\n\n\ + Variable Bezeichnet den Namen der Umgebungsvariablen.\n\ + Zeichenfolge Eine Zeichenfolge, die der Variable zugewiesen werden soll.\n\n\ +Der Befehl SET ohne Parameter zeigt die aktuellen Umgebungsvariablen an.\n" + +STRING_START_HELP1, "Startet einen Befehl.\n\n\ +START Befehl\n\n\ + Befehl Befehl welcher ausgefuehrt werden soll\n\n\ +Achtung: Derzeit werden alle Befehle asynchron ausgefuehrt.\n" + +STRING_TITLE_HELP, "Legt den Fenstertitel fuer das Eingabeaufforderungsfenster fest.\n\n\ +TITLE [string]\n\n\ + Zeichenfolge Bezeichnet den Titel des Eingabeaufforderungsfensters." + +STRING_TIME_HELP1, "Stellt die Systemzeit oder zeigt sie an.\n\n\ +TIME [/T][Zeit]\n\n\ + /T nur anzeigen\n\n\ +TIME ohne Parameter zeigt die aktuelle Systemzeit an und fragt nach der neuen\n\ +Uhrzeit. Druecken Sie die EINGABETASTE, um die bisherige Zeit beizubehalten." + +STRING_TIME_HELP2, "Geben Sie eine neue Zeit ein: " + +STRING_TIMER_HELP1, "Verstrichene %d Millisekunden\n" + +STRING_TIMER_HELP2, "Verstrichene %02d%c%02d%c%02d%c%02d\n" + +STRING_TIMER_HELP3, "Erlaubt die Benutzung von 10 Stopuhren.\n\n\ +TIMER [ON|OFF] [/S] [/n] [/Fn]\n\n\ + ON schaltet die Stopuhr ein\n\ + OFF schaltet die Stopuhr aus\n\ + /S Split time. Return stopwatch split\n\ + time without changing its value\n\ + /n Anzahl der Stopuhren\n\ + gueltige Stopuhren sind 0 bis 9\n\ + Standardwert = 1\n\ + /Fn Ausgabeformatierung\n\ + n kann 0 oder 1 sein:\n\ + 0 Millisekunden\n\ + 1 hh%cmm%css%cdd\n\n\ +Falls nicht ON, OFF oder /S angegeben wurde wird\n\ +die Stopuhr ausgeschalten.\n\n" + +STRING_TYPE_HELP1, "Zeigt den Inhalt einer oder mehrerer Textdateien an.\n\n\ +TYPE [Laufwerk:][Pfad]Dateiname" + +STRING_VERIFY_HELP1, "This command is just a dummy!!\n\ +Legt fest, ob ueberwacht werden soll, ob Dateien korrekt auf den Datentraeger\n\ +geschrieben werden.\n\n\ +VERIFY [ON | OFF]\n\n\ +Der Befehl VERIFY ohne Parameter zeigt die aktuelle Einstellung von VERIFY an." + +STRING_VERIFY_HELP2, "VERIFY ist %s.\n" + +STRING_VERIFY_HELP3, "VERIFY kann nur ON oder OFF sein" + +STRING_VERSION_HELP1, "Zeigt Shell Informationen an.\n\n\ +VER [/C][/R][/W]\n\n\ + /C Zeigt die Credits an.\n\ + /R Zeigt die Redistribution Information an.\n\ + /W Zeigt die Garantieerklaerung an." + +STRING_VERSION_HELP2, " kommt mit absolut keiner Garantie; fuer naehere\n\ + Informationen darueber tippen Sie: `ver /w'. Das ist eine freie Software,\n\ + und Sie sind koennen die Software unter bestimmten Bedingungen weiter\n\ + vertreiben; tippen Sie `ver /r' fuer naehere Informationen darueber.\n\ + Tippen Sie `ver /c' um die Mitwirkenden (Credits) aufzulisten." + +STRING_VERSION_HELP3, "\n This program is distributed in the hope that it will be useful,\n\ + but WITHOUT ANY WARRANTY; without even the implied warranty of\n\ + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n\ + GNU General Public License for more details." + +STRING_VERSION_HELP4, "\n This program is free software; you can redistribute it and/or modify\n\ + it under the terms of the GNU General Public License as published by\n\ + the Free Software Foundation; either version 2 of the License, or\n\ + (at your option) any later version." + +STRING_VERSION_HELP5, "\nSenden Sie Bug-Reports an .\n\ +Updates sind auf der offiziellen ReactOS-Seite verfuegbar:\n\ +http://www.reactos.org" + +STRING_VERSION_HELP6, "\nFreeDOS Version programmiert von:\n" + +STRING_VERSION_HELP7, "\nReactOS Version programmiert von:\n" + +STRING_VOL_HELP1, " Datentraeger im Laufwerk %c: ist %s" +STRING_VOL_HELP2, " Datentraeger im Laufwerk %c: hat keine Bezeichnung" +STRING_VOL_HELP3, " Datentraeger-Seriennummer: %04X-%04X\n" +STRING_VOL_HELP4, "Zeigt die Laufwerksvolumebezeichnung und die Seriennummer an, falls diese existieren.\n\nVOL [drive:]" + +STRING_WINDOW_HELP1, "change console window aspect\n\n\ +WINDOW [/POS[=]left,top,width,heigth]\n\ + [MIN|MAX|RESTORE] ['title']\n\n\ +/POS Gibt Position und Größe des Fenster an\n\ +MIN minimieren das Fenster\n\ +MAX maximieren das Fenster\n\ +RESTORE stellt das Fenster wieder her" + +STRING_WINDOW_HELP2, "change console window aspect\n\n\ +ACTIVATE 'window' [/POS[=]left,top,width,heigth]\n\ + [MIN|MAX|RESTORE] ['title']\n\n\ +window tile of window on wich perform actions\n\ +/POS specify window placement and dimensions\n\ +MIN minimieren das Fenster\n\ +MAX maximieren das Fenster\n\ +RESTORE stellt das Fenster wieder her\n\ +title neuer Titel" + + +STRING_HELP1, "Uebersicht aller verfuegbaren Befehle und deren Kurzbeschreibung\n\n\ + Befehl /? Um naehere Informationen zu einem bestimmten Befehl\n\ + zu erhalten.\n\n\ +? Listet alle Befehle auf (ohne Erklarung).\n\ +ALIAS Setzt, loescht oder zeigt den Alias.\n\ +ATTRIB Zeigt Dateiattribute an bzw. aendert sie.\n\ +BEEP Gibt einen beep-Ton durch den PC-Speaker aus.\n\ +CALL Ruft eine Batchdatei aus einer anderen Batchdatei heraus auf.\n\ +CD Zeigt den Namen des aktuellen Verzeichnisses an bzw. aendert diesen.\n\ +CHCP Zeigt die aktive Codepagenummer an bzw. legt diese fest.\n\ +CHOICE Wartet auf den Benutzer, welcher aus einer Auswahl eine Option\n\ + waehlen muss.\n\ +CLS Loescht den Bildschirminhalt.\n\ +CMD Startet eine neue Instanz des ReactOS-Befehlsinterpreters.\n\ +COLOR Legt die Hintergrund- und Vordergrundfarben fuer die Konsole fest.\n\ +COPY Kopiert eine oder mehrere Dateien an eine andere Stelle.\n\ +DATE Zeigt das Datum an bzw. legt dieses fest.\n\ +DELETE Loescht eine oder mehrere Dateien.\n\ +DIR Listet die Dateien und Unterverzeichnisse eines Verzeichnisses auf.\n\ +ECHO Zeigt Meldungen an bzw. schaltet die Befehlsanzeige ein oder aus.\n\ +ERASE Loescht eine oder mehrere Dateien.\n\ +EXIT Beendet das Programm CMD.EXE (Befehlsinterpreter).\n\ +FOR Fuehrt einen angegebenen Befehl fuer jede Datei in einem Dateiensatz\n\ + aus.\n\ +FREE Zeigt den (freien) Speicherplatz an.\n\ +GOTO Setzt den ReactOS-Befehlsinterpreter auf eine markierte Zeile in\n\ + einem Batchprogramm.\n\ +HELP Zeigt Hilfeinformationen zu ReactOS-Befehlen an.\n\ +HISTORY Listet alle Befehle auf welche sich im Speicher befinden.\n\ +IF Verarbeitet Ausdruecke in einer Batchdatei abhaengig von Bedingungen.\n\ +LABEL Erstellt, aendert oder loescht die Bezeichnung eines Volumes.\n\ +MD Erstellt ein Verzeichnis\n\ +MKDIR Erstellt ein Verzeichnis.\n\ +MOVE Verschiebt ein oder mehrere Dateien von einem Verzeichnis in\n\ + ein anderes.\n\ +PATH Legt den Suchpfad fuer ausfuehrbare Dateien fest oder zeigt diesen an.\n\ +PAUSE Haelt die Ausfuehrung einer Batchdatei an und zeigt eine Meldung an.\n\ +POPD Wechselt zu dem Verzeichnis, das durch PUSHD gespeichert wurde.\n\ +PROMPT Aendert die Eingabeaufforderung.\n\ +PUSHD Speichert das aktuelle Verzeichnis, und wechselt dann zu einem\n\ + anderen Verzeichnis.\n\ +RD Entfernt ein Verzeichnis.\n\ +REM Leitet Kommentare in einer Batchdatei.\n\ +REN Benennt eine Datei bzw. Dateien um.\n\ +RENAME Bennent eine Datei bzw. Dateien um.\n\ +RMDIR Loescht ein Verzeichnis.\n\ +SCREEN Bewegt den Cursor und optional die Ausgabe.\n\ +SET Setzt oder loescht die Umgebungsvariablen bzw. zeigt sie an.\n\ +SHIFT Veraendert die Position ersetzbarer Parameter in Batchdateien.\n" +STRING_HELP2, "START Startet ein eigenes Fenster, um ein bestimmtes Programm oder einen\n\ + Befehl auszufuehren.\n\ +TIME Zeigt die Systemzeit an bzw. legt sie fest.\n\ +TIMER Erlaubt die Benutzung von bis zu 10 Stopuhren\n\ +TITLE Legt den Fenstertitel fuer das Eingabeaufforderungsfenster fest.\n\ +TYPE Zeigt den Inhalt einer Textdatei an.\n\ +VER Zeigt die ReactOS-Version an.\n\ +VERIFY Legt fest, ob ueberwacht werden soll, ob Dateien korrekt auf den\n\ + Datentraeger geschrieben werden.\n\ +VOL Zeigt die Datentraegervolumebezeichnung und die Seriennummer an.\n" + + +STRING_CHOICE_OPTION, "JN" +STRING_COPY_OPTION, "JNA" + + +STRING_ALIAS_ERROR, "Die Befehlszeile ist zu lange nach der Alias-Erweiterung!\n" +STRING_BATCH_ERROR, "Es trat ein Fehler auf, waehrend die batch-Datei geoeffnet wurde.\n" +STRING_CHCP_ERROR1, "Aktive Code-Page: %u\n" +STRING_CHCP_ERROR4, "ungueltige Code-Page\n" +STRING_CHOICE_ERROR, "Ungueltige Option. Erwartetes Format: /C[:]options" +STRING_CHOICE_ERROR_TXT, "Ungueltige Option. Erwartetes Format: /T[:]c,nn" +STRING_CHOICE_ERROR_OPTION, "Ungueltige Option: %s" +STRING_MD_ERROR, "Unterverzeichnis oder Datei existiert bereits.\n" +STRING_CMD_ERROR1, "Die Eingaben konnten nicht umgeleitet werden (von der Datei) %s\n" +STRING_CMD_ERROR2, "Ein Fehler ist beim Erstellen der temponaeren Date für Pipedaten aufgetreten\n" +STRING_CMD_ERROR3, "%s kann nicht in die Datei umgeleitet werden \n" +STRING_CMD_ERROR4, "Running %s...\n" +STRING_CMD_ERROR5, "Running cmdexit.bat...\n" +STRING_COLOR_ERROR1, "Fehler: Hinter- und Vordergrund koennen nicht die selben Farben haben!" +STRING_COLOR_ERROR2, "Fehler in der Farb-Angabe" +STRING_COLOR_ERROR3, "Farbe %x\n" +STRING_COLOR_ERROR4, "Fehler: Die selben Farben!" +STRING_CONSOLE_ERROR, "Unbekannter Fehler: %d\n" +STRING_COPY_ERROR1, "Fehler: Quelle kann nicht geoeffnet werden - %s!\n" +STRING_COPY_ERROR2, "Fehler: Kann nicht ueber sich selbst kopiert werden.\n" +STRING_COPY_ERROR3, "Fehler Schreibziel!\n" +STRING_COPY_ERROR4, "Fehler: Noch nicht implementiert!\n" +STRING_DATE_ERROR, "Ungueltiges Datum." +STRING_DEL_ERROR5, "Die Datei %s wird geloescht! " +STRING_DEL_ERROR6, "Sind Sie sicher (J/N)?" +STRING_DEL_ERROR7, "Loeschen: %s\n" +STRING_ERROR_ERROR1, "Unbekannter Fehler! Fehlernummer: 0x%lx\n" +STRING_ERROR_ERROR2, "Syntax-Fehler" +STRING_FOR_ERROR1, "'in' fehlt fuer ein statement." +STRING_FOR_ERROR2, "Klammern nicht gefunden." +STRING_FOR_ERROR3, "'do' fehlt." +STRING_FOR_ERROR4, "kein Befehl nach 'do'." +STRING_FREE_ERROR1, "Ungueltiges Laufwerk" +STRING_FREE_ERROR2, "keine Bezeichnung" +STRING_GOTO_ERROR1, "Keine Sprungmarke fuer GOTO gesetzt" +STRING_GOTO_ERROR2, "Sprungmarke '%s' wurde nicht gefunden\n" + +STRING_MOVE_ERROR1, "[OK]\n" +STRING_MOVE_ERROR2, "[FEHLER]\n" + +STRING_REN_ERROR1, "MoveFile() ist fehlgeschlagen. Fehler: %lu\n" + +STRING_START_ERROR1, "No batch support at the moment!" + +STRING_TIME_ERROR1, "Ungueltige Zeit." + +STRING_TYPE_ERROR1, "Ungueltige Option '/%s'\n" + +STRING_WINDOW_ERROR1, "Fenster nicht gefunden" + + +STRING_ERROR_PARAMETERF_ERROR, "Parameterformat ist nicht korrect - %c\n" +STRING_ERROR_INVALID_SWITCH, "Ungueltiger Parameter - /%c\n" +STRING_ERROR_TOO_MANY_PARAMETERS, "Zu viele Parameters - %s\n" +STRING_ERROR_PATH_NOT_FOUND, "Pfad wurde nicht gefunden\n" +STRING_ERROR_FILE_NOT_FOUND, "Datei wurde nicht gefunden\n" +STRING_ERROR_REQ_PARAM_MISSING, "Benoetigter Parameter fehlt\n" +STRING_ERROR_INVALID_DRIVE, "Ungueltige Laufwerksangaben\n" +STRING_ERROR_INVALID_PARAM_FORMAT, "Ungueltiges Parameterformat - %s\n" +STRING_ERROR_BADCOMMAND, "Ungueltiger Befehl oder Dateiname\n" +STRING_ERROR_OUT_OF_MEMORY, "Fehler: Zu wenig Speicher verfuegbar.\n" +STRING_ERROR_CANNOTPIPE, "Error! Cannot pipe! Cannot open temporary file!\n" +STRING_ERROR_D_PAUSEMSG, "Druecken Sie eine beliebige Taste . . ." +STRING_ERROR_DRIVER_NOT_READY, "Laufwerk ist nicht bereit" + +STRING_PATH_ERROR, "CMD: Not in environment '%s'\n" + +STRING_CMD_SHELLINFO, "\nReactOS Befehlszeilen Interpreter" +STRING_VERSION_RUNVER, " laeuft in %s" +STRING_COPY_FILE , " %d Datei(en) kopiert\n" +STRING_DELETE_WIPE, "wiped" +STRING_FOR_ERROR, "ungueltige Variablenangabe." +STRING_SCREEN_COL, "ungueltige Spalten-Angabe" +STRING_SCREEN_ROW, "ungueltige Zeilen-Angabe" +STRING_TIMER_TIME "Timer %d ist %s: " +} diff --git a/reactos/base/shell/cmd/En.rc b/reactos/base/shell/cmd/En.rc new file mode 100644 index 00000000000..ff9141f6149 --- /dev/null +++ b/reactos/base/shell/cmd/En.rc @@ -0,0 +1,650 @@ +#include "windows.h" +#include "resource.h" +/* + * Moved all hardcoded strings to En.rc. + * By Magnus Olsen 2005 + */ + +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +STRINGTABLE DISCARDABLE +{ + +STRING_ATTRIB_HELP, "Displays or changes file attributes.\n\n\ +ATTRIB [+R | -R] [+A | -A] [+S | -S] [+H | -H] file ...\n\ + [/S [/D]]\n\n\ + + Sets an attribute\n\ + - Clears an attribute\n\ + R Read-only file attribute\n\ + A Archive file attribute\n\ + S System file attribute\n\ + H Hidden file attribute\n\ + /S Processes matching files in the current directory\n\ + and all subdirectories\n\ + /D Processes directories as well\n\n\ +Type ATTRIB without a parameter to display the attributes of all files.\n" + +STRING_ALIAS_HELP, "Sets, removes or shows aliases.\n\n\ +ALIAS [alias=[command]]\n\n\ + alias Name for an alias.\n\ + command Text to be substituted for an alias.\n\n\ +To list all aliases:\n\ + ALIAS\n\n\ +To set a new or replace an existing alias:\n\ + ALIAS da=dir a:\n\n\ +To remove an alias from the alias list:\n\ + ALIAS da=" + +STRING_BEEP_HELP, "Beep the speaker.\n\nBEEP\n" + +STRING_CALL_HELP, "Calls one batch program from another.\n\n\ +CALL [drive:][path]filename [batch-parameter]\n\n\ + batch-parameter Specifies any command-line information required by the\n\ + batch program." + +STRING_CD_HELP, "Changes the current directory or displays it's name\n\n\ +CHDIR [/D][drive:][path]\n\ +CHDIR[..|.]\n\ +CD [/D][drive:][path]\n\ +CD[..|.]\n\n\ + .. parent directory\n\ + . current directory\n\ + /D Will change current drive and current directory.\n\n\ +Type CD drive: to display the current directory on the specified drive.\n\ +Type CD without a parameter to display the current drive and directory.\n" + +STRING_CHCP_HELP, "Displays or sets the active code page number.\n\n\ +CHCP [nnn]\n\n\ + nnn Specifies the active code page number.\n\n\ +Type CHCP without a parameter to display the active code page number.\n" + +STRING_CHOICE_HELP, "Waits for the user to choose one of a set of choices.\n\n\ +CHOICE [/C[:]choices][/N][/S][/T[:]c,nn][text]\n\n\ + /C[:]choices Specifies allowable keys. Default is YN.\n\ + /N Do not display choices and ? at the end of the prompt string.\n\ + /S Treat choice keys as case sensitive.\n\ + /T[:]c,nn Default choice to c after nn seconds.\n\ + text Prompt string to display.\n\n\ +ERRORLEVEL is set to offset of key user presses in choices.\n" + +STRING_CLS_HELP, "Clears the screen.\n\nCLS\n" + +STRING_CMD_HELP1, "\nInternal commands available:\n" + +STRING_CMD_HELP2, "\nFeatures available:" + +STRING_CMD_HELP3," [aliases]" + +STRING_CMD_HELP4," [history]" + +STRING_CMD_HELP5," [unix filename completion]" + +STRING_CMD_HELP6," [directory stack]" + +STRING_CMD_HELP7," [redirections and piping]" + +STRING_CMD_HELP8, "Starts a new instance of the ReactOS command line interpreter.\n\n\ +CMD [/[C|K] command][/P][/Q][/T:bf]\n\n\ + /C command Runs the specified command and terminates.\n\ + /K command Runs the specified command and remains.\n\ + /P CMD becomes permanent and runs autoexec.bat\n\ + (cannot be terminated).\n\ + /T:bf Sets the background/foreground color (see COLOR command).\n" + +STRING_COLOR_HELP1, "Sets the default foreground and background colors.\n\n\ +COLOR [attr [/-F]] \n\n\ + attr Specifies color attribute of console output\n\ + /-F Does not fill the console blank space with color attribute\n\n\ +There are three ways to specify the colors:\n\ +1) [bright] name on [bright] name (only the first three letters are required)\n\ +2) decimal on decimal\n\ +3) two hex digits\n\n\ +Colors are:\n\ +dec hex name dec hex name\n\ +0 0 Black 8 8 Gray(Bright black)\n\ +1 1 Blue 9 9 Bright Blue\n\ +2 2 Green 10 A Bright Green\n\ +3 3 Cyan 11 B Bright Cyan\n\ +4 4 Red 12 C Bright Red\n\ +5 5 Magenta 13 D Bright Magenta\n\ +6 6 Yellow 14 E Bright Yellow\n\ +7 7 White 15 F Bright White\n" + +STRING_COPY_HELP1, "Overwrite %s (Yes/No/All)? " + +STRING_COPY_HELP2, "Copies one or more files to another location.\n\n\ +COPY [/V][/Y|/-Y][/A|/B] source [/A|/B]\n\ + [+ source [/A|/B] [+ ...]] [destination [/A|/B]]\n\n\ + source Specifies the file or files to be copied.\n\ + /A Indicates an ASCII text file.\n\ + /B Indicates a binary file.\n\ + destination Specifies the directory and/or filename for the new file(s).\n\ + /V Verifies that new files are written correctly.\n\ + /Y Suppresses prompting to confirm you want to overwrite an\n\ + existing destination file.\n\ + /-Y Causes prompting to confirm you want to overwrite an\n\ + existing destination file.\n\n\ +The switch /Y may be present in the COPYCMD environment variable.\n\ +...\n" + +STRING_DATE_HELP1, "\nEnter new date (mm%cdd%cyyyy): " + +STRING_DATE_HELP2, "\nEnter new date (dd%cmm%cyyyy): " + +STRING_DATE_HELP3, "\nEnter new date (yyyy%cmm%cdd): " + +STRING_DATE_HELP4, "Displays or sets the date.\n\n\ +DATE [/T][date]\n\n\ + /T display only\n\n\ +Type DATE without parameters to display the current date setting and\n\ +a prompt for a new one. Press ENTER to keep the same date.\n" + +STRING_DEL_HELP1, "Deletes one or more files.\n\n\ +DEL [/N /P /T /Q /S /W /Y /Z /A[[:]attributes]] file ...\n\ +DELETE [/N /P /T /Q /S /W /Y /Z /A[[:]attributes]] file ...\n\ +ERASE [/N /P /T /Q /S /W /Y /Z /A[[:]attributes]] file ...\n\n\ + file Specifies the file(s) to delete.\n\n\ + /N Nothing.\n\ + /P Prompt. Ask before deleting each file.\n\ + /T Total. Display total number of deleted files and freed disk space.\n\ + /Q Quiet.\n\ + /W Wipe. Overwrite the file with random numbers before deleting it.\n\ + /Y Yes. Kill even *.* without asking.\n\ + /F Force Delete hidden, read-only and system files.\n\ + /S Delete file from all sub directory\n\ + /A Select files to be deleted based on attributes.\n\ + attributes\n\ + R Read Only files\n\ + S System files\n\ + A Archiveable files\n\ + H Hidden Files\n\ + - prefix meaning not\n" + +STRING_DEL_HELP2, "All files in the directory will be deleted!\nAre you sure (Y/N)?" +STRING_DEL_HELP3, " %lu file deleted\n" +STRING_DEL_HELP4, " %lu files deleted\n" + +STRING_DELAY_HELP, "pause for n seconds or milliseconds\n\ +DELAY [/m]n\n\n\ + /m specifiy than n are milliseconds\n\ + otherwise n are seconds\n" + +STRING_DIR_HELP1, "DIR [drive:][path][filename] [/A[[:]attributes]] [/B] [/C] [/D] [/L] [/N]\n\ + [/O[[:]sortorder]] [/P] [/Q] [/S] [/T[[:]timefield]] [/W] [/X] [/4]\n\n\ + [drive:][path][filename]\n\ + Specifies drive, directory, and/or files to list.\n\n\ + /A Displays files with specified attributes.\n\ + attributes D Directories R Read-only files\n\ + H Hidden files A Files ready for archiving\n\ + S System files - Prefix meaning not\n\ + /B Uses bare format (no heading information or summary).\n\ + /C Display the thousand separator in file sizes. This is the\n\ + default. Use /-C to disable display of separator.\n\ + /D Same as wide but files are list sorted by column.\n\ + /L Uses lowercase.\n\ + /N New long list format where filenames are on the far right.\n\ + /O List by files in sorted order.\n\ + sortorder N By name (alphabetic) S By size (smallest first)\n\ + E By extension (alphabetic) D By date/time (oldest first)\n\ + G Group directories first - Prefix to reverse order\n\ + /P Pauses after each screenful of information.\n\ + /Q Display the owner of the file.\n\ + /S Displays files in specified directory and all subdirectories.\n\ + /T Controls which time field displayed or used for sorting\n\ + timefield C Creation\n\ + A Last Access\n\ + W Last Written\n\ + /W Uses wide list format.\n\ + /X This displays the short names generated for non-8dot3 file\n\ + names. The format is that of /N with the short name inserted\n\ + before the long name. If no short name is present, blanks are\n\ + displayed in its place.\n\ + /4 Displays four-digit years\n\n\ +Switches may be preset in the DIRCMD environment variable. Override\n\ +preset switches by prefixing any switch with - (hyphen)--for example, /-W.\n" + +STRING_DIR_HELP2, " Volume in drive %c is %s\n" +STRING_DIR_HELP3, " Volume in drive %c has no label.\n" +STRING_DIR_HELP4, " Volume Serial Number is %04X-%04X\n" +STRING_DIR_HELP5, "\n Total Files Listed:\n%16i File(s)% 14s bytes\n" +STRING_DIR_HELP6, "%16i Dir(s)% 15s bytes\n" +STRING_DIR_HELP7, "\n Directory of %s\n\n" +STRING_DIR_HELP8, "%16i File(s)% 14s bytes\n" + +STRING_DIRSTACK_HELP1, "Stores the current directory for use by the POPD command, then\n\ +changes to the specified directory.\n\n\ +PUSHD [path | ..]\n\n\ + path Specifies the directory to make the current directory\n" + +STRING_DIRSTACK_HELP2, "Changes to the directory stored by the PUSHD command.\n\nPOPD" + +STRING_DIRSTACK_HELP3, "Prints the contents of the directory stack.\n\nDIRS" + +STRING_DIRSTACK_HELP4, "Directory stack empty" + +STRING_ECHO_HELP1, "Display a messages without trailing carriage return and line feed.\n\n\ + ECHOS message" + +STRING_ECHO_HELP2, "Displays a message to the standard error output.\n\n\ + ECHOERR message\n\ + ECHOERR. prints an empty line" + +STRING_ECHO_HELP3, "Prints a messages to standard error output without trailing carriage return and line feed.\n\n\ + ECHOSERR message" + +STRING_ECHO_HELP4, "Displays a message or switches command echoing on or off.\n\n\ + ECHO [ON | OFF]\n\ + ECHO [message]\n\ + ECHO. prints an empty line\n\n\ +Type ECHO without a parameter to display the current ECHO setting." + +STRING_ECHO_HELP5, "ECHO is %s\n" + +STRING_EXIT_HELP, "Exits the command line interpreter.\n\nEXIT\n" + +STRING_FOR_HELP1, "Runs a specified command for each file in a set of files\n\n\ +FOR %variable IN (set) DO command [parameters]\n\n\ + %variable Specifies a replaceable parameter.\n\ + (set) Specifies a set of one or more files. Wildcards may be used.\n\ + command Specifies the command to carry out for each file.\n\ + parameters Specifies parameters or switches for the specified command.\n\n\ +To use the FOR command in a batch program, specify %%variable instead of\n\ +%variable.\n" + +STRING_FREE_HELP1, "\nVolume in drive %s is %-11s\n\ + Serial number is %s\n\ + %16s bytes total disk space\n\ + %16s bytes used\n\ + %16s bytes free\n" + +STRING_FREE_HELP2, "Displays drive information.\n\nFREE [drive: ...]\n" + +STRING_IF_HELP1, "Performs conditional processing in batch programs.\n\n\ + IF [NOT] ERRORLEVEL number command\n\ + IF [NOT] string1==string2 command\n\ + IF [NOT] EXIST filename command\n\ + IF [NOT] DEFINED variable command\n\n\ +NOT Specifies that CMD should carry out the command only if\n\ + the condition is false\n\ +ERRORLEVEL number Specifies a true condition if the last program run returned\n\ + an exit code equal or greater than the number specified.\n\ +command Specifies the command to carry out if the condition is met.\n\ +string1==string2 Specifies a true condition if the specified text strings\n\ + match.\n\ +EXIST filename Specifies a true condition if the specified filename exists.\n\ +DEFINED variable Specifies a true condition if the specified variable is\n\ + defined.\n" + +STRING_GOTO_HELP1, "Directs CMD to a labeled line in a batch script.\n\n\ +GOTO label\n\n\ + label Specifies a text string used in a batch script as a label.\n\n\ +You type a label on a line by itself, beginning with a colon." + +STRING_LABEL_HELP1, "Displays or changes drive label.\n\nLABEL [drive:][label]\n" + +STRING_LABEL_HELP2, "Volume in drive %c: is %s\n" +STRING_LABEL_HELP3, "Volume in drive %c: has no label\n" +STRING_LABEL_HELP4, "Volume Serial Number is %04X-%04X\n" +STRING_LABEL_HELP5, "Drive label (11 Characters, ENTER if none)? " + +STRING_LOCALE_HELP1, "Current time is" + +STRING_MKDIR_HELP, "Creates a directory.\n\n\ +MKDIR [drive:]path\nMD [drive:]path" + +STRING_MEMMORY_HELP1, "Displays the amount of system memory.\n\nMEMORY" + +STRING_MEMMORY_HELP2, "\n %12s%% memory load.\n\n\ + %13s bytes total physical RAM.\n\ + %13s bytes available physical RAM.\n\n\ + %13s bytes total page file.\n\ + %13s bytes available page file.\n\n\ + %13s bytes total virtual memory.\n\ + %13s bytes available virtual memory.\n" + +STRING_MISC_HELP1, "Press a key to continue...\n" + +STRING_MOVE_HELP1, "Overwrite %s (Yes/No/All)? " + +STRING_MOVE_HELP2, "Moves files and renames files and directories.\n\n\ +To move one or more files:\n\ +MOVE [/N][drive:][path]filename1[,...] destination\n\n\ +To rename a directory:\n\ +MOVE [/N][drive:][path]dirname1 dirname2\n\n\ + [drive:][path]filename1 Specifies the location and name of the file\n\ + or files you want to move.\n\ + /N Nothing. Do everything but move files or directories.\n\n\ +Current limitations:\n\ + - You can't move a file or directory from one drive to another.\n" + +STRING_MSGBOX_HELP, "display a message box and return user responce\n\n\ +MSGBOX type ['title'] prompt\n\n\ +type button displayed\n\ + possible values are: OK, OKCANCEL,\n\ + YESNO, YESNOCANCEL\n\ +title title of message box\n\ +prompt text displayed by the message box\n\n\n\ +ERRORLEVEL is set according the button pressed:\n\n\ +YES : 10 | NO : 11\n\ +OK : 10 | CANCEL : 12\n" + +STRING_PATH_HELP1, "Displays or sets a search path for executable files.\n\n\ +PATH [[drive:]path[;...]]\nPATH ;\n\n\ +Type PATH ; to clear all search-path settings and direct the command shell\n\ +to search only in the current directory.\n\ +Type PATH without parameters to display the current path.\n" + +STRING_PROMPT_HELP1, "Changes the command prompt.\n\n\ +PROMPT [text]\n\n\ + text Specifies a new command prompt.\n\n\ +Prompt can be made up of normal characters and the following special codes:\n\n\ + $A & (Ampersand)\n\ + $B | (pipe)\n\ + $C ( (Left parenthesis)\n\ + $D Current date\n\ + $E Escape code (ASCII code 27)\n\ + $F ) (Right parenthesis)\n\ + $G > (greater-than sign)\n\ + $H Backspace (erases previous character)\n\ + $L < (less-than sign)\n\ + $N Current drive\n\ + $P Current drive and path\n\ + $Q = (equal sign)\n\ + $T Current time\n\ + $V OS version number\n\ + $_ Carriage return and linefeed\n\ + $$ $ (dollar sign)\n" + +STRING_PAUSE_HELP1, "Stops the execution of a batch file and shows the following message:\n\ +'Press any key to continue...' or a user defined message.\n\n\ +PAUSE [message]" + +STRING_PROMPT_HELP2, " $+ Displays the current depth of the directory stack" + +STRING_PROMPT_HELP3, "\nType PROMPT without parameters to reset the prompt to the default setting." + +STRING_REM_HELP, "Starts a comment line in a batch file.\n\nREM [Comment]" + +STRING_RMDIR_HELP, "Removes a directory.\n\n\ +RMDIR [drive:]path\nRD [drive:]path\n\ +/S Deletes all files and folders within target\n\ +/Q Doesnt prompt for user\n" +STRING_RMDIR_HELP2, "Directory is not empty!\n" + +STRING_REN_HELP1, "Renames a file/directory or files/directories.\n\n\ +RENAME [/E /N /P /Q /S /T] old_name ... new_name\n\ +REN [/E /N /P /Q /S /T] old_name ... new_name\n\n\ + /E No error messages.\n\ + /N Nothing.\n\ + /P Prompts for confirmation before renaming each file.\n\ + (Not implemented yet!)\n\ + /Q Quiet.\n\ + /S Rename subdirectories.\n\ + /T Display total number of renamed files.\n\n\ +Note that you cannot specify a new drive or path for your destination. Use\n\ +the MOVE command for that purpose.\n" + +STRING_REN_HELP2, " %lu file renamed\n" + +STRING_REN_HELP3, " %lu files renamed\n" + +STRING_SHIFT_HELP, "Changes the position of replaceable parameters in a batch file.\n\n\ +SHIFT [DOWN]" + +STRING_SCREEN_HELP, "move cursor and optionally print text\n\n\ +SCREEN row col [text]\n\n\ + row row to wich move the cursor\n\ + col column to wich move the cursor" + +STRING_SET_HELP, "Displays, sets, or removes environment variables.\n\n\ +SET [variable[=][string]]\n\n\ + variable Specifies the environment-variable name.\n\ + string Specifies a series of characters to assign to the variable.\n\n\ +Type SET without parameters to display the current environment variables.\n" + +STRING_START_HELP1, "Starts a command.\n\n\ +START command\n\n\ + command Specifies the command to run.\n\n\ +At the moment all commands are started asynchronously.\n" + +STRING_TITLE_HELP, "Sets the window title for the command prompt window.\n\n\ +TITLE [string]\n\n\ +string Specifies the title for the command prompt window.\n" + +STRING_TIME_HELP1, "Displays or sets the system time.\n\n\ +TIME [/T][time]\n\n\ + /T display only\n\n\ +Type TIME with no parameters to display the current time setting and a prompt\n\ +for a new one. Press ENTER to keep the same time.\n" + +STRING_TIME_HELP2, "Enter new time: " + +STRING_TIMER_HELP1, "Elapsed %d msecs\n" + +STRING_TIMER_HELP2, "Elapsed %02d%c%02d%c%02d%c%02d\n" + +STRING_TIMER_HELP3, "allow the use of ten stopwatches.\n\n\ +TIMER [ON|OFF] [/S] [/n] [/Fn]\n\n\ + ON set stopwatch ON\n\ + OFF set stopwatch OFF\n\ + /S Split time. Return stopwatch split\n\ + time without changing its value\n\ + /n Specifiy the stopwatch number.\n\ + Stopwatches available are 0 to 9\n\ + If it is not specified default is 1\n\ + /Fn Format for output\n\ + n can be:\n\ + 0 milliseconds\n\ + 1 hh%cmm%css%cdd\n\n\ +if none of ON, OFF or /S is specified the command\n\ +will toggle stopwatch state\n\n" + +STRING_TYPE_HELP1, "Displays the contents of text files.\n\nTYPE [drive:][path]filename \n\ + /P Shows one screen of output at a time.\n" + +STRING_VERIFY_HELP1, "This command is just a dummy!!\n\ +Sets whether to verify that your files are written correctly to a\n\ +disk.\n\n\ +VERIFY [ON | OFF]\n\n\ +Type VERIFY without a parameter to display the current VERIFY setting.\n" + +STRING_VERIFY_HELP2, "VERIFY is %s.\n" + +STRING_VERIFY_HELP3, "Must specify ON or OFF." + +STRING_VERSION_HELP1, "Displays shell version information\n\n\ +VER [/C][/R][/W]\n\n\ + /C Displays credits.\n\ + /R Displays redistribution information.\n\ + /W Displays warranty information." + +STRING_VERSION_HELP2, " comes with ABSOLUTELY NO WARRANTY; for details\n\ +type: `ver /w'. This is free software, and you are welcome to redistribute\n\ +it under certain conditions; type `ver /r' for details. Type `ver /c' for a\n\ +listing of credits." + +STRING_VERSION_HELP3, "\n This program is distributed in the hope that it will be useful,\n\ + but WITHOUT ANY WARRANTY; without even the implied warranty of\n\ + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n\ + GNU General Public License for more details." + +STRING_VERSION_HELP4, "\n This program is free software; you can redistribute it and/or modify\n\ + it under the terms of the GNU General Public License as published by\n\ + the Free Software Foundation; either version 2 of the License, or\n\ + (at your option) any later version.\n" + +STRING_VERSION_HELP5, "\nSend bug reports to .\n\ +Updates are available at: http://www.reactos.org" + +STRING_VERSION_HELP6, "\nFreeDOS version written by:\n" + +STRING_VERSION_HELP7, "\nReactOS version written by:\n" + +STRING_VOL_HELP1, " Volume in drive %c: is %s" +STRING_VOL_HELP2, " Volume in drive %c: has no label" +STRING_VOL_HELP3, " Volume Serial Number is %04X-%04X\n" +STRING_VOL_HELP4, "Displays the disk volume label and serial number, if they exist.\n\nVOL [drive:]" + +STRING_WINDOW_HELP1, "change console window aspect\n\n\ +WINDOW [/POS[=]left,top,width,heigth]\n\ + [MIN|MAX|RESTORE] ['title']\n\n\ +/POS specify window placement and dimensions\n\ +MIN minimize the window\n\ +MAX maximize the window\n\ +RESTORE restore the window" + +STRING_WINDOW_HELP2, "change console window aspect\n\n\ +ACTIVATE 'window' [/POS[=]left,top,width,heigth]\n\ + [MIN|MAX|RESTORE] ['title']\n\n\ +window tile of window on wich perform actions\n\ +/POS specify window placement and dimensions\n\ +MIN minimize the window\n\ +MAX maximize the window\n\ +RESTORE restore the window\n\ +title new title\n" + + +STRING_HELP1, "List of all available commands (+ description)\n\n\ + command /? For more information on a specific command\n\n\ +? List all available commands without description).\n\ +ALIAS Sets, removes or shows aliases.\n\ +ATTRIB Displays or changes file attributes.\n\ +BEEP Beep the speaker.\n\ +CALL Calls one batch program from another.\n\ +CD Displays the name of or changes the current directory.\n\ +CHCP Displays or sets the active code page number.\n\ +CHOICE Waits for the user to choose one of a set of choices.\n\ +CLS Clears the screen.\n\ +CMD Starts a new instance of the ReactOS command interpreter.\n\ +COLOR Sets the default console foreground and background colors.\n\ +COPY Copies one or more files to another location.\n\ +DATE Displays or sets the date.\n\ +DELETE Deletes one or more files.\n\ +DIR Displays a list of files and subdirectories in a directory.\n\ +ECHO Displays messages, or turns command echoing on or off.\n\ +ERASE Deletes one or more files.\n\ +EXIT Quits the CMD.EXE program (command interpreter).\n\ +FOR Runs a specified command for each file in a set of files.\n\ +FREE (free) disc space.\n\ +GOTO Directs the ReactOS command interpreter to a labeled line in\n\ + a batch program.\n\ +HELP Provides Help information for ReactOS commands.\n\ +HISTORY List alle commands which has been used\n\ +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\ +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\ +PAUSE Suspends processing of a batch file and displays a message.\n\ +POPD Restores the previous value of the current directory saved by\n\ + PUSHD.\n\ +PROMPT Changes the command prompt.\n\ +PUSHD Saves the current directory then changes it.\n\ +RD Removes a directory.\n\ +REM Records comments (remarks) in batch files.\n\ +REN Renames a file or files.\n\ +RENAME Renames a file or files.\n\ +RMDIR Removes a directory.\n\ +SCREEN Move cursor and optionally print text.\n\ +SET Displays, sets, or removes ReactOS environment variables.\n\ +SHIFT Shifts the position of replaceable parameters in batch files.\n" +STRING_HELP2, "START Starts a separate window to run a specified program or command.\n\ + Executes command.\n\ +TIME Displays or sets the system time.\n\ +TIMER Allow the use of ten stopwaches.\n\ +TITLE Sets the window title for a CMD.EXE session.\n\ +TYPE Displays the contents of a text file.\n\ +VER Displays the ReactOS version.\n\ +VERIFY Tells ReactOS whether to verify that your files are written\n\ + correctly to a disk.\n\ +VOL Displays a disk volume label and serial number.\n" + + +STRING_CHOICE_OPTION, "YN" +STRING_COPY_OPTION, "YNA" + + +STRING_ALIAS_ERROR, "Command line too long after alias expansion!\n" +STRING_BATCH_ERROR, "Error opening batch file\n" +STRING_CHCP_ERROR1, "Active code page: %u\n" +STRING_CHCP_ERROR4, "Invalid code page\n" +STRING_CHOICE_ERROR, "Invalid option. Expected format: /C[:]options" +STRING_CHOICE_ERROR_TXT, "Invalid option. Expected format: /T[:]c,nn" +STRING_CHOICE_ERROR_OPTION, "Illegal Option: %s" +STRING_MD_ERROR, "A subdirectory or file already exists.\n" +STRING_MD_ERROR2, "The path to the new folder does not exist.\n" +STRING_CMD_ERROR1, "Can't redirect input from file %s\n" +STRING_CMD_ERROR2, "Error creating temporary file for pipe data\n" +STRING_CMD_ERROR3, "Can't redirect to file %s\n" +STRING_CMD_ERROR4, "Running %s...\n" +STRING_CMD_ERROR5, "Running cmdexit.bat...\n" +STRING_COLOR_ERROR1, "Same colors error! (Background and foreground can't be the same color)" +STRING_COLOR_ERROR2, "error in color specification" +STRING_COLOR_ERROR3, "Color %x\n" +STRING_COLOR_ERROR4, "same colors error!" +STRING_CONSOLE_ERROR, "Unknown error: %d\n" +STRING_COPY_ERROR1, "Error: Cannot open source - %s!\n" +STRING_COPY_ERROR2, "Error: Can't copy onto itself!\n" +STRING_COPY_ERROR3, "Error writing destination!\n" +STRING_COPY_ERROR4, "Error: Not implemented yet!\n" +STRING_DATE_ERROR, "Invalid date." +STRING_DEL_ERROR5, "The file %s will be deleted! " +STRING_DEL_ERROR6, "Are you sure (Y/N)?" +STRING_DEL_ERROR7, "Deleting: %s\n" +STRING_ERROR_ERROR1, "Unknown error! Error code: 0x%lx\n" +STRING_ERROR_ERROR2, "Syntax error" +STRING_FOR_ERROR1, "'in' missing in for statement." +STRING_FOR_ERROR2, "no brackets found." +STRING_FOR_ERROR3, "'do' missing." +STRING_FOR_ERROR4, "no command after 'do'." +STRING_FREE_ERROR1, "Invalid drive" +STRING_FREE_ERROR2, "unlabeled" +STRING_GOTO_ERROR1, "No label specified for GOTO" +STRING_GOTO_ERROR2, "Label '%s' not found\n" + +STRING_MOVE_ERROR1, "[OK]\n" +STRING_MOVE_ERROR2, "[Error]\n" + +STRING_REN_ERROR1, "MoveFile() failed. Error: %lu\n" + +STRING_START_ERROR1, "No batch support at the moment!" + +STRING_TIME_ERROR1, "Invalid time." + +STRING_TYPE_ERROR1, "Invalid option '/%s'\n" + +STRING_WINDOW_ERROR1, "window not found" + + +STRING_ERROR_PARAMETERF_ERROR, "Parameter format not correct - %c\n" +STRING_ERROR_INVALID_SWITCH, "Invalid switch - /%c\n" +STRING_ERROR_TOO_MANY_PARAMETERS, "Too many parameters - %s\n" +STRING_ERROR_PATH_NOT_FOUND, "Path not found\n" +STRING_ERROR_FILE_NOT_FOUND, "File not found\n" +STRING_ERROR_REQ_PARAM_MISSING, "Required parameter missing\n" +STRING_ERROR_INVALID_DRIVE, "Invalid drive specification\n" +STRING_ERROR_INVALID_PARAM_FORMAT, "Invalid parameter format - %s\n" +STRING_ERROR_BADCOMMAND, "Bad command or filename\n" +STRING_ERROR_OUT_OF_MEMORY, "Out of memory error.\n" +STRING_ERROR_CANNOTPIPE, "Error! Cannot pipe! Cannot open temporary file!\n" +STRING_ERROR_D_PAUSEMSG, "Press any key to continue . . ." +STRING_ERROR_DRIVER_NOT_READY, "Drive not ready" + +STRING_PATH_ERROR, "CMD: Not in environment '%s'\n" + +STRING_CMD_SHELLINFO, "\nReactOS Command Line Interpreter" +STRING_VERSION_RUNVER, " running on %s" +STRING_COPY_FILE , " %d file(s) copied\n" +STRING_DELETE_WIPE, "wiped" +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_INVALID_OPERAND, "Invalid operand." +STRING_EXPECTED_CLOSE_PAREN, "Expected ')'." +STRING_EXPECTED_NUMBER_OR_VARIABLE,"Expected number or variable name." +STRING_SYNTAX_COMMAND_INCORRECT, "The syntax of the command is incorrect." + +} diff --git a/reactos/base/shell/cmd/Es.rc b/reactos/base/shell/cmd/Es.rc new file mode 100644 index 00000000000..daaa3dc8ab4 --- /dev/null +++ b/reactos/base/shell/cmd/Es.rc @@ -0,0 +1,650 @@ +#include "windows.h" +#include "resource.h" +/* + * Spanish resource file by HUMA2000 + * Jose Pedro Fernández Pascual 2005 + */ + +LANGUAGE LANG_SPANISH, SUBLANG_NEUTRAL +STRINGTABLE DISCARDABLE +{ + +STRING_ATTRIB_HELP, "Muestra o cambia los atributos de los archivos.\n\n\ +ATTRIB [+R | -R] [+A | -A] [+S | -S] [+H | -H] file ...\n\ + [/S [/D]]\n\n\ + + Añade un atributo\n\ + - Borra un atributo\n\ + R Atributo de sólo lectura\n\ + A Atributo de archivo\n\ + S Atributo de archivo de sistema\n\ + H Atributo de archivo oculto\n\ + /S Procesa los archivos coincidentes en el directorio actual \n\ + y sus subdirectorios\n\ + /D Procesa también los directorios\n\n\ +Type ATTRIB without a parameter to display the attributes of all files.\n" + +STRING_ALIAS_HELP, "Pone, borra o muestra los alias.\n\n\ +ALIAS [alias=[command]]\n\n\ + alias Nombre para un alias.\n\ + command Texto a ser sustituido por el alias.\n\n\ +Para mostrar todos los alias:\n\ + ALIAS\n\n\ +Para poner un nuevo o remplazar un alias existente:\n\ + ALIAS da=dir a:\n\n\ +Para borrar un alias de la lista de alias:\n\ + ALIAS da=" + +STRING_BEEP_HELP, "Emite un pitido por el altavoz.\n\nBEEP\n" + +STRING_CALL_HELP, "Ejecuta un arhivo por lotes desde otro archivo por lotes.\n\n\ +CALL [drive:][path]filename [batch-parameter]\n\n\ + batch-parameter Especifica cualquier informacion de la linea de comandos\n\ + requerida por el archivo por lotes." + +STRING_CD_HELP, "Cambia el directorio actual o muestra su nombre.\n\n\ +CHDIR [/D][drive:][path]\n\ +CHDIR[..|.]\n\ +CD [/D][drive:][path]\n\ +CD[..|.]\n\n\ + .. Directorio padre.\n\ + . Directorio actual.\n\ + /D Cambiara la unidad y el directorio actual.\n\n\ +Escribe CD unidad: para mostrar el directorio actual en la unidad especificada.\n\ +Escribe CD sin ningun parámetro para mostrar la unidad y el directorio actual.\n" + +STRING_CHCP_HELP, "Muestra o configura el número de página de código activa.\n\n\ +CHCP [nnn]\n\n\ + nnn Especifica el número de página de código activa.\n\n\ +Escribe CHCP sin ningún parámetro para mostrar el código de página activo.\n" + +STRING_CHOICE_HELP, "Espera a que el usuario elija entre un número de opciones.\n\n\ +CHOICE [/C[:]choices][/N][/S][/T[:]c,nn][text]\n\n\ + /C[:]choices Especifica las teclas admitidas. Por defecto son SN.\n\ + /N No muestra las posibles elecciones y ? al final del prompt.\n\ + /S Hace que la elección sea sensible a las mayúsculas y minúsculas.\n\ + /T[:]c,nn La elección por defecto será c después de nn segundos.\n\ + text Prompt a mostrar. \n\n\ +ERRORLEVEL se configura al offset de la tecla que presione el usuario.\n" + +STRING_CLS_HELP, "Limpia la pantalla.\n\nCLS\n" + +STRING_CMD_HELP1, "\nComandos internos disponibles:\n" + +STRING_CMD_HELP2, "\nCaracterísticas disponibles:" + +STRING_CMD_HELP3," [alias]" + +STRING_CMD_HELP4," [historia]" + +STRING_CMD_HELP5," [Completador de nombres de archivos unix]" + +STRING_CMD_HELP6," [Pila de directorios]" + +STRING_CMD_HELP7," [Redirecciones y túneles]" + +STRING_CMD_HELP8, "Comienza una nueva sesion del interprete de comandos de ReactOS.\n\n\ +CMD [/[C|K] command][/P][/Q][/T:bf]\n\n\ + /C command Ejecuta el comando especificado y cierra.\n\ + /K command Ejecuta eñ comando especificado y permanece.\n\ + /P CMD se hace permanente y ejecuta el autoexec.bat\n\ + (no puede ser cerrado).\n\ + /T:bf Configura el color de fondo/primer plano (mirar el comando COLOR).\n" + +STRING_COLOR_HELP1, "Configura el color de primer plano y fondo.\n\n\ +COLOR [attr [/-F]] \n\n\ + attr Especifica el atributo de color de salida de consola.\n\ + /-F No rellena el espacio en blanco de la consola con el color del atributo.\n\n\ +Hay tres maneras de especificar los colores:\n\ +1) [bright] nombre on [bright] nombre (solo las tres primeras letras del nombre son necesarias)\n\ +2) decimal on decimal\n\ +3) dos dígitos hexadecimales\n\n\ +Los colores son:\n\ +dec hex nombre dec hex name\n\ +0 0 Negro 8 8 Gris(Negro brillante)\n\ +1 1 Azul 9 9 Azul brillante\n\ +2 2 Verde 10 A Verde brillante\n\ +3 3 Cyan 11 B Cyan brillante\n\ +4 4 Rojo 12 C Rojo brillante\n\ +5 5 Magenta 13 D Magenta brillante\n\ +6 6 Amarillo 14 E Amarillo brillante\n\ +7 7 Blanco 15 F Blanco brillante\n" + +STRING_COPY_HELP1, "Sobreescribir %s (Si/No/Todos)? " + +STRING_COPY_HELP2, "Copia uno o mas archivos a otro lugar.\n\n\ +COPY [/V][/Y|/-Y][/A|/B] origen [/A|/B]\n\ + [+ origen [/A|/B] [+ ...]] [destino [/A|/B]]\n\n\ + origen Especifica el archivo o archivos a copiar.\n\ + /A Indica un archivo de texto ASCII.\n\ + /B Indica un archivo binario.\n\ + destino Especifica el directorio y/o nombre de archivo para los nuevos archivos.\n\ + /V Verifica que el nuevo archivo se ha escrito correctamente.\n\ + /Y Suprime la confirmación sobre si quieres sobreescribir un archivo\n\ + de destino existente.\n\ + /-Y Hace que te pregunte si quieres sobreescribir un archivo de destino\n\ + existente.\n\n\ +El parametro /Y tiene que estar presente en las variables de entorno de COPYCMD.\n\ +...\n" + +STRING_DATE_HELP1, "\nIntroduce la nueva fecha (mm%cdd%cyyyy): " + +STRING_DATE_HELP2, "\nIntroduce la nueva fecha (dd%cmm%cyyyy): " + +STRING_DATE_HELP3, "\nIntroduce la nueva fecha (yyyy%cmm%cdd): " + +STRING_DATE_HELP4, "Muestra o cambia la fecha.\n\n\ +DATE [/T][date]\n\n\ + /T Sólo la muestra\n\n\ +Escribe DATE sin parámetros para mostrar la fecha actual y establecer\n\ +una nueva fecha. Pulsa INTRO para mantener la misma fecha.\n" + +STRING_DEL_HELP1, "Borra uno o mas archivos.\n\n\ +DEL [/N /P /T /Q /S /W /Y /Z /A[[:]atributos]] archivo ...\n\ +DELETE [/N /P /T /Q /S /W /Y /Z /A[[:]atributos]] archivo ...\n\ +ERASE [/N /P /T /Q /S /W /Y /Z /A[[:]atributos]] archivo ...\n\n\ + archivo Espacifica el/los archivo(s) a borrar.\n\n\ + /N Nada.\n\ + /P Prompt. Pregunta antes de borar cada archivo\n\ + /T Total. Muestra el número total de archivos eliminados y el espacio\n\ + liberado en disco\n\ + /Q Modo silencioso.\n\ + /W Limpiar. Sobreescribe el archivo con números aleatorios después de eliminarlo.\n\ + /Y Si. Borra incluso *.* sin preguntar.\n\ + /F Fuerza el borrade de archivos ocultos, de sólo lectura y de sistema.\n\ + /S Borra los archivos de todos los subdirectorios.\n\ + /A Selecciona los archivos a borrar en base a los atributos especificados.\n\ + R Archivos de sólo lectura\n\ + S Archivos de sistema\n\ + A Archivos listos para archivar\n\ + H Archivos ocultos\n\ + - Prefijo que signifca sin\n" + +STRING_DEL_HELP2, "¡Todos los archivos del directorio van a ser borrados!\n¿Estás seguro? (S/N)?" +STRING_DEL_HELP3, " Archivo %lu borrado\n" +STRING_DEL_HELP4, " Archivos %lu borrados\n" + +STRING_DELAY_HELP, "Espera por n segundos o milisegundos\n\ +DELAY [/m]n\n\n\ + /m Especifica que n son milisegundos\n\ + En otro caso n son segundos\n" + +STRING_DIR_HELP1, "DIR [unidad:][ruta][nombre de archivo] [/A[[:]atributos]] [/B] [/C] [/D] [/L] [/N]\n\ + [/O[[:]orden]] [/P] [/Q] [/S] [/T[[:]fecha]] [/W] [/X] [/4]\n\n\ + [unidad:][ruta][nombre de archivo]\n\ + Especifica la unidad, el directorio o los archivos a listar.\n\n\ + /A Muestra los archivos con los atributos especificados.\n\ + atributos D Directorios R Archivos de sólo lectur\n\ + H Archivos ocultos A Archivos listos para archivar\n\ + S Archivos de sistema - Prefijo que signifca sin\n\ + /B Usa el formato simple (sin encabezado ni sumario).\n\ + /C Muestra el separador de miles en los tamaños de los archivos. Es la opción\n\ + por defecto. Usa /-C para desactivar el mostrar el separador.\n\ + /D Lo mismo que el formato a lo ancho, pero ordenados en columna.\n\ + /L Usa minúsculas.\n\ + /N Nuevo formato de lista larga donde los nombres de archivo están a la \n\ + derecha.\n\ + /O Muestra los archivos ordenados según el orden especificado.\n\ + ordenación N Por nombre (alfabético) S Por tamaño (los menores primero)\n\ + E Por extensión (alfabético) D Por fecha/hora (los antiguos primero)\n\ + G Los directorios primero - Prefijo para el orden inverso\n\ + /P Pausa después de cada pantalla llena de información.\n\ + /Q Muestra el propietario del archivo.\n\ + /S Muestra los archivos en el directorio especificado y sus subdirectorios.\n\ + /T Controla que campo de tiempo se muestra o es usado para ordenar:\n\ + campo de tiempo C Creación\n\ + A Último acceso\n\ + W Última escritura\n\ + /W Usa el formato de lista a lo ancho.\n\ + /X Muestra los nombres cortos generados para archivos que no tienen un\n\ + nombre 8.3. El formato es como /N pero con el nombre corto colocado\n\ + antes del nombre largo. Si no hay nombre corto, se muestran espacios\n\ + en blanco en su lugar.\n\ + /4 Muestra los cuatro dígitos del año\n\n\ +Los modificadores pueden estar presentes en la variable de entorno de DIRCMD. Omite los\n\ +ajustes previos anteponiendo a cualquier modificador - (hyphen)--por ejemplo, /-W.\n" + +STRING_DIR_HELP2, " El volumen en la unidad %c es %s\n" +STRING_DIR_HELP3, " El volumen en la unidad %c no tiene etiqueta.\n" +STRING_DIR_HELP4, " El volumen Serial Number is %04X-%04X\n" +STRING_DIR_HELP5, "\n Total de archivos mostrados:\n%16i archivo(s)% 14s bytes\n" +STRING_DIR_HELP6, "%16i Directorio(s)% 15s bytes\n" +STRING_DIR_HELP7, "\n Directorio %s\n\n" +STRING_DIR_HELP8, "%16i archivo(s)% 14s bytes\n" + +STRING_DIRSTACK_HELP1, "Almacena el directorio actual para usarlo por el comando, \n\ +entonces cambia al directorio especificado.\n\n\ +PUSHD [ruta | ..]\n\n\ + ruta Especifica el directorio para hacerlo el directorio actual\n" + +STRING_DIRSTACK_HELP2, "Cambia al directorio guardado por el comando PUSHD.\n\nPOPD" + +STRING_DIRSTACK_HELP3, "Muestra el contenido de la pila de directorios.\n\nDIRS" + +STRING_DIRSTACK_HELP4, "Vacia la pila de directorios" + +STRING_ECHO_HELP1, "Muestra un mensaje sin necesidad de pulsar intro y \n\ +salta a la siguiente linea.\n\n\ + ECHOS mensaje" + +STRING_ECHO_HELP2, "Muestra los mensajes de error por defecto.\n\n\ + ECHOERR mensaje\n\ + ECHOERR. Imprime una linea vacia" + +STRING_ECHO_HELP3, "Muestra mensajes en la salida estandar de error sin pulsar intro y\n\ +pasa de linea.\n\n\ + ECHOSERR mensaje" + +STRING_ECHO_HELP4, "Muestra un mensaje o cambia el mostrar los comandos activo/inactivo.\n\n\ + ECHO [ON | OFF]\n\ + ECHO [mensaje]\n\ + ECHO. Muestra una linea vacia\n\n\ +Escribe ECHO sin parámetros para mostrar la configuración actual de ECHO." + +STRING_ECHO_HELP5, "ECHO está %s\n" + +STRING_EXIT_HELP, "Sale del interprete de la linea de comandos.\n\nEXIT\n" + +STRING_FOR_HELP1, "Ejecuta un comando específico para cada archivo de un grupo de archivos.\n\n\ +FOR %variable IN (grupo) DO comando [parametros]\n\n\ + %variable Especifica un parámetro remplazable.\n\ + (set) Especifica un grupo de uno o mas archivos. Los comodines pueden usarse.\n\ + command Especifica el comando a ejecutar para cada archivo.\n\ + parameters Especifica los parametros o modificadores para el comando especificado.\n\n\ +Para usar el comando FOR en un archivo por lotes, especifica %%variable en lugar de\n\ +%variable.\n" + +STRING_FREE_HELP1, "\nEl volumen en la unidad %s es %-11s\n\ + El número de serie es %s\n\ + %16s bytes totales de espacio en disco\n\ + %16s bytes usados\n\ + %16s bytes libres\n" + +STRING_FREE_HELP2, "Muestra la información de la unidad.\n\nFREE [unidad: ...]\n" + +STRING_IF_HELP1, "Ejecuta procesos condicionales en archivos por lotes.\n\n\ + IF [NOT] ERRORLEVEL número comando\n\ + IF [NOT] string1==string2 comando\n\ + IF [NOT] EXIST archivo comando\n\ + IF [NOT] DEFINED variable comando\n\n\ +NOT Especifica que CMD solo llevará a cabo el comando si la \n\ + condición es falsa.\n\ +ERRORLEVEL número Especifica una condición verdadera si el último programa devuelve\n\ + un código de salida igual o superior al número especificado.\n\ +comando Especifica el comando a ejecutar si se cumple la condición.\n\ +string1==string2 Especifica una condición verdadera si las cadenas de texto coinciden.\n\ +EXIST archivo Especifica una condición verdadera si existe el archivo especificado.\n\ +DEFINED variable Especifica una condición verdadera si la variable está definida.\n" + +STRING_GOTO_HELP1, "Manda al CMD a una linea etiquetada en un archivo por lotes.\n\n\ +GOTO etiqueta\n\n\ + etiqueta Especifica la cadena de texto usada en el archivo por lotes como etiqueta.\n\n\ +Escriba la etiqueta en la linea misma, empezando con dos puntos." + +STRING_LABEL_HELP1, "Muestra o cambia la etiqueta de una unidad.\n\nLABEL [unidad:][etiqueta]\n" + +STRING_LABEL_HELP2, "El volumen en la unidad %c: es %s\n" +STRING_LABEL_HELP3, "El volumen en la unidad %c: no tiene etiqueta\n" +STRING_LABEL_HELP4, "El número de serie del volumen es %04X-%04X\n" +STRING_LABEL_HELP5, "Etiqueta del volumen (11 Caracteres, INTRO para ninguna)? " + +STRING_LOCALE_HELP1, "La hora actual es" + +STRING_MKDIR_HELP, "Crea un directorio.\n\n\ +MKDIR [unidad:]ruta\nMD [unidad:]ruta" + +STRING_MEMMORY_HELP1, "Muestra la cantidad de memoria del sistema.\n\nMEMORY" + +STRING_MEMMORY_HELP2, "\n %12s%% carga de memoria.\n\n\ + %13s bytes totales de RAM física.\n\ + %13s bytes libres de RAM física.\n\n\ + %13s bytes totales del archivo de paginación.\n\ + %13s bytes disponibles del archivo de paginación.\n\n\ + %13s bytes totales de memoria virtual.\n\ + %13s bytes disponibles de memoria virtual.\n" + +STRING_MISC_HELP1, "Pulsa cualquier tecla para continuar...\n" + +STRING_MOVE_HELP1, "¿Sobreescribir %s (Si/No/Todos)? " + +STRING_MOVE_HELP2, "Mueve archivos y renombra archivos y directorios.\n\n\ +Para mover uno o más archivos:\n\ +MOVE [/N][unidad:][ruta]archivo1[,...] destino\n\n\ +Para renombrar un directorio:\n\ +MOVE [/N][unidad:][ruta]directorio1 directorio2\n\n\ + [unidad:][ruta]archivo1 Especifica la localización y el nombre del archivo\n\ + o archivos que quieres mover.\n\ + /N Nada. Hace todo menos mover archivos o directorios.\n\n\ +Limitaciones actules:\n\ + - No puedes mover un archivo o directorio de una unidad a otra.\n" + +STRING_MSGBOX_HELP, "Muestra un cuadro de mensaje y devuelve la respuesta del usuario.\n\n\ +MSGBOX tipo ['titulo'] pregunta\n\n\ +tipo buton a mostrar\n\ + los valores posibles son: OK, OKCANCELAR,\n\ + SINO, SINOCANCELAR\n\ +titulo titulo del cuadro de mensaje\n\ +pregunta texto a mostrar por el cuadro de mensaje\n\n\n\ +ERRORLEVEL se configurara en función del botón pulsado:\n\n\ +SI : 10 | NO : 11\n\ +OK : 10 | CANCELAR: 12\n" + +STRING_PATH_HELP1, "Muestra o cambia la ruta de búsqueda de archivos ejecutables.\n\n\ +PATH [[unidad:]ruta[;...]]\nRuta ;\n\n\ +Escribe PATH ; para limpiar todas las configuraciones de búsqueda y usar solo el\n\ +directorio actual del interprete de comandos.\n\ +Escribe PATH sin parámetros para mostrar la ruta actual.\n" + +STRING_PROMPT_HELP1, "Cambia el símbolo de comandos.\n\n\ +PROMPT [texto]\n\n\ + texto Epecifica un nuevo símbolo de comandos.\n\n\ +El símbolo de comandos puede hacerce con carácteres normales y los siguientes \n\ +códigos especiales:\n\n\ + $A & (Signo y)\n\ + $B | (Linea horizontal)\n\ + $C ( (Paréntesis izquierdo)\n\ + $D Fecha actual\n\ + $E Código de escape (código ASCII 27)\n\ + $F ) (Paréntesis derecho)\n\ + $G > (Signo mayor que)\n\ + $H Borra el caracter anterior\n\ + $L < (Signo menor que)\n\ + $N Unidad actual\n\ + $P Unidad y ruta actuales\n\ + $Q = (signo igual)\n\ + $T Hora actual\n\ + $V Número de versión del SO\n\ + $_ Salto de linea\n\ + $$ $ (signo del dolar)\n" + +STRING_PAUSE_HELP1, "Detiene la ejecución del archivo por lotes actual y muestra el\n\ +siguiente mensaje:\n\ +'Pulsa cualquier tecla para continuar...' o un mensaje definido por el usuario.\n\n\ +PAUSE [mensaje]" + +STRING_PROMPT_HELP2, " $+ Muestra la profundidad actual de la pila de directorios" + +STRING_PROMPT_HELP3, "\nEscribe PROMPT sin parámetros para resetear el símbolo de \n\ +comandos a su configuración por defecto." + +STRING_REM_HELP, "Comienza una liena de comentarios en un archivo por lotes\n\nREM [Comentario]" + +STRING_RMDIR_HELP, "Remueve un directorio.\n\n\ +RMDIR [unidad:]ruta\nRD [unidad:]ruta" + +STRING_REN_HELP1, "Renombra un archivo/directorio o varios archivos/directorios.\n\n\ +RENAME [/E /N /P /Q /S /T] nombre_antiguo ... nuevo_nombre\n\ +REN [/E /N /P /Q /S /T] nombre_antiguo ... nuevo_nombre\n\n\ + /E No muestra mensajes de error.\n\ + /N Nada.\n\ + /P Pregunta por la confirmación antes de cada archivo.\n\ + (¡No implementado aún!)\n\ + /Q Modo silencioso.\n\ + /S Renombra los subdirectorios.\n\ + /T Muestra el número total de archivos renombrados.\n\n\ +Note que no puede especificar una nueva unidad en el destino o ruta. Usa\n\ +el comando MOVE para este propósito.\n" + +STRING_REN_HELP2, " %lu archivos renombrados.\n" + +STRING_REN_HELP3, " %lu archivos renombrados.\n" + +STRING_SHIFT_HELP, "Cambia la posición de los parámetros remplazables en un \n\ +archivo por lotes.\n\n\ +SHIFT [ABAJO]" + +STRING_SCREEN_HELP, "Mueve el cursor y opcionalmente escribe un texto.\n\n\ +SCREEN fila columna [texto]\n\n\ + fila Fila a la que mover el cursor.\n\ + columna columna a la que mover el cursor." + +STRING_SET_HELP, "Muestra, cambia o borra las variables de entorno.\n\n\ +SET [variable[=][cadena]]\n\n\ + variable Especifica el nombre de la variable de entorno.\n\ + string Especifies la serie de caracteres para asignar a la variable.\n\n\ +Escribe SET sin parámetros para mostrar las variables de entorno actuales.\n" + +STRING_START_HELP1, "Empieza un comando.\n\n\ +START comando\n\n\ + comando Especifica el comando a ejecutar.\n\n\ +Por el momento todos los comandos son ejecutados de forma asincrónica.\n" + +STRING_TITLE_HELP, "Cambia el título de la ventqana del intérprete de comandos.\n\n\ +TITLE [cadena]\n\n\ +cadena Especifica el título de la ventana del intérprete de comandos.\n" + +STRING_TIME_HELP1, "Muestra o cambia la hora del sistema.\n\n\ +TIME [/T][hora]\n\n\ + /T Sólo la muestra\n\n\ +Escribe TIME sin parámetros para mostrar la hora actual y preguntar\n\ +por una nueva. Pulsa INTRO para mantener la misma hora.\n" + +STRING_TIME_HELP2, "Introduce la nueva hora: " + +STRING_TIMER_HELP1, "Transcurridos %d msecs\n" + +STRING_TIMER_HELP2, "Transcurridos %02d%c%02d%c%02d%c%02d\n" + +STRING_TIMER_HELP3, "Permite al usuario el uso de diez paradas de reloj.\n\n\ +TIMER [ON|OFF] [/S] [/n] [/Fn]\n\n\ + ON Cambia la parada a ON\n\ + OFF Cambia la parada a OFF\n\ + /S Divide el tiempo. Devuelve una division de la parada del reloj\n\ + sin cambiar su valor.\n\ + /n Especifica el número de la parada de reloj.\n\ + Las paradas de reloj disponibles son de 0 a 9\n\ + Si no se especifica el valor por defecto es 1\n\ + /Fn Formato de salida\n\ + n puede ser:\n\ + 0 millisegundos\n\ + 1 hh%cmm%css%cdd\n\n\ +Si ni ON, OFF o /S se especifican, el comando\n\ +cambiara el estado de parada del reloj\n\n" + +STRING_TYPE_HELP1, "Muestra los contenidos de un archivo de texto.\n\nTYPE [unidad:][ruta]archivo \n\ + /P Muestra sólo una pantalla de salida cada vez.\n" + +STRING_VERIFY_HELP1, "¡¡Este comando es solo de relleno!!\n\ +Configura si hay que verificar que los archivos se and escrito correctamente\n\ +en un disco.\n\n\ +VERIFY [ON | OFF]\n\n\ +Escribe VERIFY sin parámetros para mostrar la configuración actual de VERIFY.\n" + +STRING_VERIFY_HELP2, "VERIFY está %s.\n" + +STRING_VERIFY_HELP3, "Tienes que especificar ON o OFF." + +STRING_VERSION_HELP1, "Muestra la información de la versión del shell\n\n\ +VER [/C][/R][/W]\n\n\ + /C Muestra los creditos.\n\ + /R Muestra la información de redistribución.\n\ + /W Muestra la información de la garantia." + +STRING_VERSION_HELP2, "Este software Viene con ABSOLUTAMENTE NINGUNA GARANTIA; para más detalles\n\ +escribe: `ver /w'. Este es un software gratuito, y estás invitado a redistribuirlo\n\ +bajo ciertas condiciones; escribe `ver /r' para los detalles. Escribe `ver /c' para una\n\ +lista de los créditos." + +STRING_VERSION_HELP3, "\n Este programa es distribuido con la esperanza de que sea útil,\n\ + pero CON NINGUNA GARANTIA; incluso sin la garantía implícita de\n\ + MERCADERIA o AJUSTE A UN PROPÓSITO PARTICULAR. Mira la\n\ + Licencia Pública General GNU para más detalles." + +STRING_VERSION_HELP4, "\n Este programa es un software gratuito; puedes redistribuirlo y/o modificarlo\n\ + bajo los términos de la Licencia Pública General GNU tal y como establece\n\ + la Fundación de Software Libre; tanto en la versión 2 de la Licencia, o\n\ + (según tu elección) cualquier otra posterior.\n" + +STRING_VERSION_HELP5, "\nManda los informes de bugs a .\n\ +Actualizaciones disponibles en: http://www.reactos.org" + +STRING_VERSION_HELP6, "\nFreeDOS version escrita por:\n" + +STRING_VERSION_HELP7, "\nReactOS version escrita por:\n" + +STRING_VOL_HELP1, " El volumen en la unidad %c: es %s" +STRING_VOL_HELP2, " El volumen en la unidad %c: no tiene etiqueta" +STRING_VOL_HELP3, " El número de serie del volumen es %04X-%04X\n" +STRING_VOL_HELP4, "Muestra la etiqueta del volumen del disco y el número de serie si existen.\n\nVOL [unidad:]" + +STRING_WINDOW_HELP1, "Cambia el aspecto de la ventana de la consola.\n\n\ +WINDOW [/POS[=]left,top,width,heigth]\n\ + [MIN|MAX|RESTORE] ['title']\n\n\ +/POS Especifica la posición y dimensión de la ventana\n\ +MIN minimiza la ventana\n\ +MAX maximiza la ventana\n\ +RESTORE restaura la ventana" + +STRING_WINDOW_HELP2, "Cambia el aspecto de la ventana de la consola.\n\n\ +ACTIVATE 'window' [/POS[=]left,top,width,heigth]\n\ + [MIN|MAX|RESTORE] ['title']\n\n\ +window Título de la ventana en la que realizar las acciónes\n\ +/POS Especifica la posición y dimensión de la ventana\n\ +MIN minimiza la ventana\n\ +MAX maximiza la ventana\n\ +RESTORE restaura la ventana\n\ +title Nuevo título\n" + + +STRING_HELP1, "Lista de todos los comandos disponibles (+ descripción)\n\n\ + comando /? Para más información del comando especificado.\n\n\ +? Muestra todos los comandos disponibles sin la descripción.\n\ +ALIAS Crea, borra o muestra los alias.\n\ +ATTRIB Muestra o cambia los atributos de archivo.\n\ +BEEP Hace un beep con el altavoz.\n\ +CALL Llama a un archivo por lotes desde otro.\n\ +CD Muestra o cambia el directorio actual.\n\ +CHCP Muestra o cambia el código de página activo.\n\ +CHOICE Espera a que el usuario elija una opción de un grupo de opciones.\n\ +CLS Limpia la pantalla.\n\ +CMD Comienza una nueva instancia del intérprete de comandos.\n\ +COLOR Configura el color por defecto de fondo y frente de la consola.\n\ +COPY Copia uno o varios archivos de una localización a otra.\n\ +DATE Muestra y cambia la fecha.\n\ +DELETE Borra uno o más archivos.\n\ +DIR Muestra una lista de los archivos y subdirecctorios en un directorio.\n\ +ECHO Muestra mensajes, o cambia un comando entre mostrarlos o no.\n\ +ERASE Borra uno o más archivos.\n\ +EXIT Sale del programa CMD.EXE (intérprete de comandos).\n\ +FOR Ejecuta un comando específico en un grupo de archivos.\n\ +FREE Espacio libre en disco.\n\ +GOTO Direcciona la ventana del intérprete de comandos a una linea etiquetada\n\ + en un archivo por lotes.\n\ +HELP Proporciona ayuda sobre los comandos para ReactOS.\n\ +HISTORY Muestra todos los comandos que han sido usados.\n\ +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\ +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\ +POPD Restaura el valor anterior del directorio actual guardado por PUSHD.\n\ +PROMPT Cambia el símbolo del sistema del intéprete de comandos.\n\ +PUSHD Guarda el directorio actual y después lo cambia.\n\ +RD Borra un directorio.\n\ +REM Marca comentarios en archivos por lotes.\n\ +REN Renombra un archivo o varios archivos.\n\ +RENAME Renombra un archivo o varios archivos.\n\ +RMDIR Borra un directorio.\n\ +SCREEN Mueve el cursor y opcionalmente escribe un texto.\n\ +SET Muestra, cambia o borra variables del entorno de la ventana.\n\ +SHIFT Marca la posición de parámetros remplazables en un archivo por lotes.\n" + +STRING_HELP2, "START Abre una ventana separada para ejecutar un programa o comando específicod.\n\ + Ejecuta CMD.\n\ +TIME Muestra o cambia la hora del sistema.\n\ +TIMER Permite al usuario diez paradas para ver.\n\ +TITLE Configura el título de la ventama de la sesión de CMD.EXE.\n\ +TYPE Muestra el contenido de un archivo de texto.\n\ +VER Muestra la versión de ReactOS.\n\ +VERIFY Le dice a ReactOS que verifique que cada archivo se escriba.\n\ + corectamente en el disco.\n\ +VOL Muestra la etiqueta de volumen y el número de serie del disco.\n" + + +STRING_CHOICE_OPTION, "SN" +STRING_COPY_OPTION, "SNT" + + +STRING_ALIAS_ERROR, "¡Linea de comandos demasiado larga tras la expansión del alias!\n" +STRING_BATCH_ERROR, "Error abriendo el archivo por lotes\n" +STRING_CHCP_ERROR1, "Página de códigos activa: %u\n" +STRING_CHCP_ERROR4, "Código de página inválido\n" +STRING_CHOICE_ERROR, "Opción inválida. Se esperaba el formato: /C[:]options" +STRING_CHOICE_ERROR_TXT, "Opción inválida. Se esperaba el formato: /T[:]c,nn" +STRING_CHOICE_ERROR_OPTION, "Opción ilegal: %s" +STRING_CMD_ERROR1, "No se puede redirigir la entrada del archivo %s\n" +STRING_CMD_ERROR2, "Error creando archivo temporal para la pila de datos\n" +STRING_CMD_ERROR3, "No se puede redirigir el archivo %s\n" +STRING_CMD_ERROR4, "Ejecutando %s...\n" +STRING_CMD_ERROR5, "Ejecutando cmdexit.bat...\n" +STRING_COLOR_ERROR1, "¡Mismos colores! (El color de frente y de fondo no pueden ser el mismo)" +STRING_COLOR_ERROR2, "Error en la especificación del color" +STRING_COLOR_ERROR3, "Color %x\n" +STRING_COLOR_ERROR4, "¡Error: mismos colores!" +STRING_CONSOLE_ERROR, "Error desconocido: %d\n" +STRING_COPY_ERROR1, "Error: No se puede abrir el origen - %s!\n" +STRING_COPY_ERROR2, "Error: ¡No se puede copiar sobre si mismo!\n" +STRING_COPY_ERROR3, "¡Error escribiendo destino!\n" +STRING_COPY_ERROR4, "Error: ¡No implementado aún!\n" +STRING_DATE_ERROR, "Fecha incorrecta." +STRING_DEL_ERROR5, "¡El archivo %s va a ser borrado!" +STRING_DEL_ERROR6, "¿Estás seguro (S/N)?" +STRING_DEL_ERROR7, "Borrando: %s\n" +STRING_ERROR_ERROR1, "¡Error desconocido! Códige de error: 0x%lx\n" +STRING_ERROR_ERROR2, "Error de sintaxsis" +STRING_FOR_ERROR1, "Falta 'in' para la declaración." +STRING_FOR_ERROR2, "No se encontraron las parénteris." +STRING_FOR_ERROR3, "Falta 'do'." +STRING_FOR_ERROR4, "No hay comando después de 'do'." +STRING_FREE_ERROR1, "Unidad errónea." +STRING_FREE_ERROR2, "Sin etiqueta" +STRING_GOTO_ERROR1, "No se especifico etiqueta para GOTO" +STRING_GOTO_ERROR2, "La etiqueta '%s' no se encuentra\n" + +STRING_MOVE_ERROR1, "[OK]\n" +STRING_MOVE_ERROR2, "[Error]\n" + +STRING_REN_ERROR1, "MoveFile() falló. Error: %lu\n" + +STRING_START_ERROR1, "¡No hay soporte para archivos por lotes en este momento!" + +STRING_TIME_ERROR1, "Hora incorrecta." + +STRING_TYPE_ERROR1, "Opción incorrecta '/%s'\n" + +STRING_WINDOW_ERROR1, "Ventana no encontrada" + + +STRING_ERROR_PARAMETERF_ERROR, "Formato del parámetro incorrecto - %c\n" +STRING_ERROR_INVALID_SWITCH, "Parámetro incorrecto - /%c\n" +STRING_ERROR_TOO_MANY_PARAMETERS, "Demasiados parámetros - %s\n" +STRING_ERROR_PATH_NOT_FOUND, "Ruta no encontrada\n" +STRING_ERROR_FILE_NOT_FOUND, "Archivo no encontrado\n" +STRING_ERROR_REQ_PARAM_MISSING, "Prámetro requerido no encontrado\n" +STRING_ERROR_INVALID_DRIVE, "Especificación de unidad errónea\n" +STRING_ERROR_INVALID_PARAM_FORMAT, "Formato de parámetro erróneo - %s\n" +STRING_ERROR_BADCOMMAND, "Comando o nombre de archivo erróneo\n" +STRING_ERROR_OUT_OF_MEMORY, "Error fuera de memoria.\n" +STRING_ERROR_CANNOTPIPE, "¡Error! ¡No se puede apilar! ¡No se puede abrir el archivo temporal!\n" +STRING_ERROR_D_PAUSEMSG, "Pulsa una tecla para continuar . . ." +STRING_ERROR_DRIVER_NOT_READY, "La unidad no está lista" + +STRING_PATH_ERROR, "CMD: No está en el entorno '%s'\n" + +STRING_CMD_SHELLINFO, "\nIntérprete de comandos de ReactOS" +STRING_VERSION_RUNVER, " corriendo en %s" +STRING_COPY_FILE , " %d archivo(s) copado(s)\n" +STRING_DELETE_WIPE, "Limpiado" +STRING_FOR_ERROR, "Especición de variable errónea." +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_INVALID_OPERAND, "Operador erróneo.\n" +STRING_EXPECTED_CLOSE_PAREN, "Se esperaba ')'.\n" +STRING_EXPECTED_NUMBER_OR_VARIABLE,"Se esperaba un número o nombre de variable.\n" +STRING_SYNTAX_COMMAND_INCORRECT, "La sintaxis del comando es incorrecta.\n" + +} + diff --git a/reactos/base/shell/cmd/Fr.rc b/reactos/base/shell/cmd/Fr.rc new file mode 100644 index 00000000000..8e1c8375edb --- /dev/null +++ b/reactos/base/shell/cmd/Fr.rc @@ -0,0 +1,575 @@ +#include "windows.h" +#include "resource.h" +/* + * French resources + * Sylvain Pétréolle 2005 + */ + +LANGUAGE LANG_FRENCH, SUBLANG_NEUTRAL +STRINGTABLE DISCARDABLE +{ + +STRING_ATTRIB_HELP, "Affiche ou change des attributs de fichiers.\n\n\ +ATTRIB [+R | -R] [+A | -A] [+S | -S] [+H | -H] file ...\n\ + [/S [/D]]\n\n\ + + Positionne un attribut\n\ + - Enlève un attribut\n\ + R Fichier en lecture seule\n\ + A Fichier archive\n\ + S Fichier système\n\ + H Fichier caché\n\ + /S Traite les fichiers correspondants dans le répertoire courant\n\ + et tous les sous-répertoires\n\ + /D Traite également les répertoires\n\n\ +Taper ATTRIB sans paramètre pour afficher les attributs de tous les fichiers." + +STRING_ALIAS_HELP, "Positionne, enlève ou affiche les alias.\n\n\ +ALIAS [alias=[commande]]\n\n\ + alias Nom de l'alias.\n\ + commande Texte à substituer à l'alias.\n\n\ +Pour afficher tous les alias:\n\ + ALIAS\n\n\ +Pour créer ou remplacer un alias existant:\n\ + ALIAS da=dir a:\n\n\ +Pour effacer un alias de la liste des alias :\n\ + ALIAS da=" + +STRING_BEEP_HELP, "Emet un bip par le haut-parleur système.\n\nBEEP" + +STRING_CALL_HELP, "Appelle un programme batch depuis un autre.\n\n\ +CALL [lecteur:][chemin]fichier [paramètre-batch]\n\n\ + paramètre-batch Spécifie les paramètres nécessaires au \n\ + programme batch." + +STRING_CD_HELP, "Change ou affiche le répertoire courant\n\n\ + CHDIR [lecteur:][chemin]\n\ + CHDIR[..|-]\n\ + CD [lecteur:][chemin]\n\ + CD[..|-]\n\n\ + .. répertoire parent\n\ + - répertoire précédent\n\n\ +Taper CD lecteur: pour affiche le répertoire courant sur le disque indiqué.\n\ +Taper CD sans paramètre pour afficher le répertoire courant du disque actuel.\n" + +STRING_CHCP_HELP, "Affiche ou change la page de codes active.\n\n\ +CHCP [nnn]\n\n\ + nnn Indique la page de codes .\n\n\ +Taper CHCP sans paramètre pour afficher la page de codes active." + +STRING_CHOICE_HELP, "Demande à l'utilisateur de choisir parmi plusieurs choix.\n\n\ +CHOICE [/C[:]choix][/N][/S][/T[:]c,nn][texte]\n\n\ + /C[:]choix Spécifier les touches disponibles. Choix par défaut: ON.\n\ + /N Ne pas afficher les choix disponibles et ? à la fin\n\ + du texte d'invite.\n\ + /S Traiter les touches comme différentes si ce sont\n\ + des majuscules ou minuscules.\n\ + /T[:]c,nn Choix par défaut après nn secondes.\n\ + texte Texte d'invite à afficher.\n\n\ +ERRORLEVEL est modifié à l'offset de la touche enfoncée parmi les choix." + +STRING_CLS_HELP, "Efface l'écran.\n\nCLS" + +STRING_CMD_HELP1, "\nCommandes internes disponibles :\n" + +STRING_CMD_HELP2, "\nFonctions disponibles :" + +STRING_CMD_HELP3," [alias]" + +STRING_CMD_HELP4," [historique]" + +STRING_CMD_HELP5," [complétion des noms de fichiers façon unix]" + +STRING_CMD_HELP6," [pile de répertoires]" + +STRING_CMD_HELP7," [redirections et piping]" + +STRING_CMD_HELP8, "Démarre une nouvelle instance de l'interpréteur de commandes de ReactOS.\n\n\ +CMD [/[C|K] commande][/P][/Q][/T:ap]\n\n\ + /C commande Lance la commande spécifiée et se termine.\n\ + /K commande Lance la commande spécifiée et reste en mémoire.\n\ + /P CMD devient permanent et lance autoexec.bat\n\ + (ne peut être terminé).\n\ + /T:ap Changer la couleur d'arrière/premier plan\n\ + (voir la commande COLOR.)" + + +STRING_COLOR_HELP1, "Change les couleurs de premier et d'arrière plan.\n\n\ +COLOR [attr [/F]] \n\n\ + attr Spécifie l'attribut des couleurs de la console\n\ + /F remplit la console avec l'attribut de couleur\n\n\ +Il y a trois façons de spécifier les couleurs :\n\ +1) [bright] nom on [bright] nom (seules les trois premières lettres \n\ +sont nécessaires)\n\ +2) décimal on décimal\n\ +3) deux chiffres hexadécimaux\n\n\ +Les couleurs sont:\n\ +déc hex nom déc hex nom\n\ +0 0 Black(Noir) 8 8 Gray(Bright black)\n\ +1 1 Blue(Bleu) 9 9 Bright Blue\n\ +2 2 Green(Vert) 10 A Bright Green\n\ +3 3 Cyan 11 B Bright Cyan\n\ +4 4 Red(Rouge) 12 C Bright Red\n\ +5 5 Magenta 13 D Bright Magenta\n\ +6 6 Yellow(Jaune) 14 E Bright Yellow\n\ +7 7 White(Blanc) 15 F Bright White" + +STRING_COPY_HELP1, "Ecraser %s (Oui/Non/Tous)? " + +STRING_COPY_HELP2, "Copie un ou plusieurs fichiers vers une autre destination.\n\n\ +COPY [/V][/Y|/-Y][/A|/B] source [/A|/B]\n\ + [+ source [/A|/B] [+ ...]] [destination [/A|/B]]\n\n\ + source Indique le ou les fichiers à copier.\n\ + /A Spécifie qu'il s'agit d'un fichier texte ASCII.\n\ + /B Spécifie qu'il s'agit d'un fichier binaire.\n\ + destination Indique le répertoire ou le nom de fichier\n\ + pour le(s) nouveau(x) fichier(s).\n\ + /V Vérifie que les fichier ont été copiés correctement.\n\ + /Y Supprime l'invite de confirmation en cas d'écrasement\n\ + d'un fichier destination existant.\n\ + /-Y Affiche un invite de confirmation en cas d'écrasement\n\ + d'un fichier destination existant.\n\n\ +Le switch /Y peut être présent dans la variable d'environnement COPYCMD.\n" + +STRING_DATE_HELP1, "\nEntrer la nouvelle date (mm%cdd%cyyyy): " + +STRING_DATE_HELP2, "\nEntrer la nouvelle date (dd%cmm%cyyyy): " + +STRING_DATE_HELP3, "\nEntrer la nouvelle date (yyyy%cmm%cdd): " + +STRING_DATE_HELP4, "Affiche ou règle la date.\n\n\ +DATE [/T][date]\n\n\ + /T affiche seulement\n\n\ +Taper DATE sans paramètre pour afficher la date courante\n\ +et une invite pour entrer la nouvelle date.\n\ +Appuyer sur ENTREE pour conserver la même date." + +STRING_DEL_HELP1, "Efface un ou plusieurs fichiers.\n\n\ +DEL [/N /P /T /Q /W /Y /Z] fichier ...\n\ +DELETE [/N /P /T /Q /W /Y /Z] fichier ...\n\ +ERASE [/N /P /T /Q /W /Y /Z] fichier ...\n\n\ + fichier Specifie le(s) fichier(s) à effacer.\n\n\ + /N Rien.\n\ + /P Demande. Demande avant d'effacer pour chaque fichier.\n\ + /T Total. Affiche le total de fichiers effacés et l'espace disque libéré.\n\ + /Q Silencieux.\n\ + /W Wipe. Ecrase le fichier avec des nombres aléatoire avant d'effacer.\n\ + /Y Oui. Efface, même *.*, sans demander.\n\ + /Z Zap. Efface les fichiers cachés, en lecture seule et systèmes.\n" + +STRING_DEL_HELP2, "Tous les fichiers du répertoire seront effacés!\n\ +Etes vous sûr(e) (O/N)?" +STRING_DEL_HELP3, " %lu fichier effacé\n" +STRING_DEL_HELP4, " %lu fichiers effacés\n" + +STRING_DELAY_HELP, "Attend pendant n secondes ou millisecondes\n\ +DELAY [/m]n\n\n\ + /m spécifie que n est en millisecondes\n\ + sinon n est en secondes" + +STRING_DIR_HELP1, "DIR [lecteur:][chemin][fichier] [/A[[:]attributs]] [/B] [/C] [/D] [/L] [/N]\n\ + [/O[[:]ordredetri]] [/P] [/Q] [/S] [/T[[:]heure]] [/W] [/X] [/4]\n\n\ + [lecteur:][chemin][fichier]\n\ + Spécifie le disque, le répertoire, et/ou les fichiers à lister.\n\n\ + /A Affiche les fichiers avec les attributs indiqués.\n\ + attributs D Répertoires R Fichiers en lecture seule\n\ + H Fichiers cachés A Fichiers prêts à etre archivés\n\ + S Fichiers systèmes - Préfixe signifiant non\n\ + /B Utilise le format court (pas d'informations ni de résumé).\n\ + /C Affiche le séparateur de milliers dans les tailles de fichier.\n\ + C'est l'option par défaut. Utiliser /-C pour désactiver \n\ + l'affichage du séparateur.\n\ + /D Identique au format large mais les fichiers sont triés\n\ + par colonne.\n\ + /L Utilise les minuscules.\n\ + /N Nouveau format de liste longue où les noms de fichiers sont \n\ + sur la droite.\n\ + /O Lister les fichier de façon triée.\n\ + ordre de N Par nom (alphabétique) S Par taille (plus petit d'abord)\n\ + tri E Par extension tique) D Par date (plus vieux d'abord)\n\ + G Répertoires d'abord - Préfixe pour inverser l'ordre\n\ + /P S'arrête après chaque page d'information.\n\ + /Q Affiche le propriétaire du fichier.\n\ + /S Affiche les fichiers dans le répertoire indiqué et\n\ + tous les sous-répertoires.\n\ + /T Contrôle quel champ de temps sera affiché ou utilisé\n\ + pour le tri\n\ + C Création\n\ + A Dernier accès\n\ + W Dernière modification\n\ + /W Utilise le format de liste large.\n\ + /X Ceci affiche les noms de fichiers courts pour les noms \n\ + de fichiers longs. Le format est comme pour /N avec\n\ + le nom de fichier court inséré avant le nom de fichier long.\n\ + S'il n'y a pas de nom court, des espaces seront affichés.\n\ + /4 Affiche l'année sur quatre chiffres.\n\n\ +Les paramètres peuvent être mémorisés dans la variable d'environnement DIRCMD.\n\ +Modifier les paramètres mémorisés avec un - (tiret)--par exemple, /-W.\n" + +STRING_DIR_HELP2, " Le nom de volume du lecteur %c est %s\n" +STRING_DIR_HELP3, " Le lecteur %c n'a pas de nom de volume\n" +STRING_DIR_HELP4, " Le numéro de série du volume est %04X-%04X\n" +STRING_DIR_HELP5, "\n Total de fichiers listés :\n%16i Fichier(s)% 14s octets\n" +STRING_DIR_HELP6, "%16i fichier(s)% 15s octets\n" +STRING_DIR_HELP7, "\n Répertoire de %s\n\n" +STRING_DIR_HELP8, "%16i Rep(s)% 14s octets\n" +STRING_DIRSTACK_HELP1, "Stocke le répertoire courant pour utilisation avec la commande POPD,\n\ +ensuite change de répertoire vers le répertoire spécifié.\n\n\ +PUSHD [chemin | ..]\n\n\ + chemin Spécifie le répertoire qui deviendra le répertoire courant" + +STRING_DIRSTACK_HELP2, "Change de réperoire vers le répertoire stocké par la commande PUSHD\n\nPOPD" + +STRING_DIRSTACK_HELP3, "Affiche le contenu de la pile de répertoires.\n\nDIRS" + +STRING_DIRSTACK_HELP4, "Pile de répertoires vide." + +STRING_ECHO_HELP1, "Affiche un message sans retour chariot ni passage à la ligne.\n\n\ + ECHOS message" + +STRING_ECHO_HELP2, "Affiche un message sur le canal d'erreur.\n\n\ + ECHOERR message\n\ + ECHOERR. Affiche une ligne vide sur le canal d'erreur." + +STRING_ECHO_HELP3, "Affiche un message sur le canal d'erreur sans retour chariot\n\ +ni passage à la ligne.\n\n\ + ECHOSERR message" + +STRING_ECHO_HELP4, "Affiche un message ou bascule l'affichage des commandes sur on ou off.\n\n\ + ECHO [ON | OFF]\n\ + ECHO [message]\n\ + ECHO. Affiche une ligne vide.\n\n\ +Taper ECHO sans paramètre pour afficher le réglage ECHO courant." + +STRING_ECHO_HELP5, "ECHO est %s\n" + +STRING_EXIT_HELP, "Sort de de l'interpréteur de commandes.\n\nEXIT" + +STRING_FOR_HELP1, "Exécute une commande donnée pour chaque fichier d'un ensemble de fichiers.\n\ +FOR %variable IN (ensemble) do commande [paramètres]\n\n\ + %variable Spécife un paramètre remplaçable.\n\ + (ensemble) Spécifie un ensemble d'un ou plusieurs fichiers.\n\ + Des jokers peuvent être utilisés.\n\ + commande Spécifie la commande à éxécuter pour chaque fichier.\n\ + paramètres Spécifie les paramètres ou switchs pour la commande spécifiée.\n\n\ +Pour utiliser la comamnde FOR dans un programme batch,\n\ +utiliser %%variable au lieu de %variable." + +STRING_FREE_HELP1, "\nLe nom de volume du lecteur %s est %-11s\n\ +Le numéro de série est %s\n\ + %16s octets d'espace disque total\n\ + %16s octets utilisés\n\ + %16s octets libres\n" + +STRING_FREE_HELP2, "Affiche les information d'un disque.\n\nFREE [lecteur: ...]" + +STRING_GOTO_HELP1, "Dirige CMD vers une ligne nommée dans un script batch.\n\n\ +GOTO label\n\n\ + label Spécifie un champ texte utilisé dans un script batch comme un label.\n\n\ +Vous écrivez un label seul sur une ligne commençant par un deux-points.\n" + +STRING_IF_HELP1, "Exécute un traitement conditionnel dans des programmes batch.\n\n\ + IF [NOT] ERRORLEVEL nombre commande\n\ + IF [NOT] chaine1==chaine2 commande\n\ + IF [NOT] EXIST nomfichier commande\n\ + IF [NOT] DEFINED variable commande\n\n\ +NOT CMD ne lancera la commande que si la condition est fausse.\n\ +ERRORLEVEL nombre La condition sera vraie si le dernier programme lancé\n\ + a retourné un code sortie égal ou supérieur à celui indiqué.\n\ +commande Indique la commande à lancer si la condition est vérifiée.\n\ +chaine1==chaine2 La condition sera vraie si les deux chaines sont identiques.\n\ +EXIST nomfichier La condition sera vraie si le fichier spécifié existe.\n\ +DEFINED variable La condition sera vraie si la variable indiquée est définie." + +STRING_LABEL_HELP1, "Affiche ou change le nom de volume du disque.\n\nLABEL [disque:][nomdevolume]\n" + +STRING_LABEL_HELP2, "Le nom de volume du disque %c: est %s\n" +STRING_LABEL_HELP3, "Le disque %c: n'a pas de nom de volume\n" +STRING_LABEL_HELP4, "Le numéro de serie du volume est %04X-%04X\n" +STRING_LABEL_HELP5, "Nom de volume (11 Caractères, ENTREE si aucun)? " + +STRING_LOCALE_HELP1, "L'heure actuelle est " + +STRING_MKDIR_HELP, "Crée un répertoire.\n\n\ +MKDIR [lecteur:]chemin\nMD [lecteur:]chemin" + +STRING_MEMMORY_HELP1, "Affiche la quantité de mémoire système.\n\nMEMORY" + +STRING_MEMMORY_HELP2, "\n %12s%% de charge mémoire.\n\n\ + %13s octets de RAM physique au total.\n\ + %13s octets de RAM physique disponible.\n\n\ + %13s octets de fichier d'échange au total.\n\ + %13s octets de fichier d'échange disponible.\n\n\ + %13s octets de mémoire virtuelle au total.\n\ + %13s octets de mémoire virtuelle disponible.\n" + +STRING_MISC_HELP1, "Appuyer sur une touche pour continuer...\n" + +STRING_MOVE_HELP1, "Ecraser %s (Oui/Non/Tous)? " + +STRING_MOVE_HELP2, "Déplace des fichiers ou renomme des fichiers et des répertoires.\n\n\ +Pouur déplacer un ou plusieurs fichiers:\n\ +MOVE [/N][lecteur:][nomfich1[,...] destination\n\n\ +Pour renommer un répertoire:\n\ +MOVE [/N][lecteur:][chemin]nomrep1 nomrep2\n\n\ + [lecteur:][chemin]nomfich1 Indique l'endroit et le nom du ou des fichiers\n\ + que vous voulez déplacer.\n\ + /N Nothing. Do everything but move files or directories.\n\n\ +Limitations actuelles :\n\ + - Vous ne pouvez pas déplacer un fichier/répertoire d'un disque à un autre.\n" + +STRING_MSGBOX_HELP, "Affiche une boite de dialogue et retourne la réponse de l'utilisateur\n\n\ +MSGBOX type ['titre'] prompt\n\n\ +type boutons affichés\n\ + les valeurs possibles sont: OK, OKCANCEL,\n\ + YESNO, YESNOCANCEL\n\ +titre titre de la boite de message\n\ +prompt texte affiché par la boite de dialogue \n\n\n\ +ERRORLEVEL est modifié suivant le bouton pressé:\n\n\ +YES : 10 | NO : 11\n\ +OK : 10 | CANCEL : 12\n" + +STRING_PATH_HELP1, "Affiche ou modifie le chemin de recherche pour les fichiers éxécutables.\n\n\ +PATH [[lecteur:][chemin;...]]\nPATH ;\n\n\ +Taper PATH ; pour effacer tous les réglages courants\n\ +et indiquer à l'interpréteur de commandes\n\ +de chercher seulement dans le répertoire courant.\n\ +Taper PATH sans paramètres pour afficher le chemin courant.\n" + +STRING_PAUSE_HELP1, "Stoppe l'éxécution d'un fichier batch et affiche le message suivant:\n\ +'Appuyer sur une touche pour continuer...' ou un message défini\n\ +par l'utilisateur.\n\n\ +PAUSE\n\ +PAUSE [message]" + +STRING_PROMPT_HELP1, "Change l'invite de commandes.\n\n\ +PROMPT [texte]\n\n\ + texte Indique le nouvel invite de commandes.\n\n\ +L'invite de commandes peut être composé de caractères normaux et\n\ +des caractères spéciaux suivants:\n\n\ + $A & (Et commercial)\n\ + $B | (pipe)\n\ + $C ( (parenthèse ouvrante)\n\ + $D Date courante\n\ + $E Code Escape (code ASCII 27)\n\ + $F ) (parenthèse fermante)\n\ + $G > (signe supérieur à)\n\ + $H Backspace (efface le caractère précédent)\n\ + $L < (signe inférieur à)\n\ + $N Lecteur courant\n\ + $P Lecteur et chemin courants\n\ + $Q = (signe égale)\n\ + $T Heure courante\n\ + $V Numéro de version de ReactOS\n\ + $_ Retour chariot/saut de ligne\n\ + $$ $ (signe dollar)" + +STRING_PROMPT_HELP2, " $+ Affiche la hauteur de la pile de répertoires" + +STRING_PROMPT_HELP3, "\nTaper PROMPT sans paramètres pour changer l'invite à celui défini par défaut." + +STRING_REM_HELP, "Démarrer une ligne de commentaire dans un fichier batch.\n\nREM [Commentaire]" + +STRING_REN_HELP1, "Renomme un(des) fichier(s)/répertoire(s)\n\ +RENAME [/E /N /P /Q /S /T] ancien_nom ... nouveau_nom\n\ +REN [/E /N /P /Q /S /T] ancien_nom ... nouveau_nom\n\n\ + /E Pas de messages d'erreur.\n\ + /N Rien.\n\ + /P Demande de confirmation avant de renommer chaque fichier.\n\ + (Non implémenté!)\n\ + /Q Silencieux.\n\ + /S Renommer les sous-répertoires.\n\ + /T Affiche le nombre total de fichiers renommés.\n\n\ +Vous ne pouvez indiquez un autre lecteur/chemin pour la destination.\n\ +Utiliser la commande MOVE dans ce but." + +STRING_REN_HELP2, " %lu fichier renommé\n" + +STRING_REN_HELP3, " %lu fichiers renommés\n" + +STRING_RMDIR_HELP, "Efface un répertoire.\n\n\ +RMDIR [lecteur:]chemin\nRD [lecteur:]chemin" + +STRING_SCREEN_HELP, "Déplace le curseur, optionnellement affiche du texte\n\n\ +SCREEN lig col [texte]\n\n\ + lig ligne à laquelle déplacer le curseur\n\ + col colonne à laquelle déplacer le curseur" + +STRING_SET_HELP, "Affiche, modifie ou efface des variables d'environnement.\n\n\ +SET [variable[=][chaine]]\n\n\ + variable Indique le nom de la variable d'environnement.\n\ + chaine Indique une série de caractères à assigner à la variable.\n\n\ +Taper SET sans paramètres pour afficher les variables d'environnement courantes.\n" + +STRING_SHIFT_HELP, "Change la position de paramètres remplaçables dans un fichier batch.\n\n\ +SHIFT [DOWN]" + +STRING_START_HELP1, "Lance une commande.\n\n\ +START commande\n\n\ + commande Indique la commande à lancer.\n\n\ +Pour le moment toutes les commandes sont lancées de façon asynchrone.\n" + +STRING_TITLE_HELP, "Change le titre de la fenêtre de l'invite de commandes.\n\n\ +TITLE [chaine]\n\n\ +chaine Indique le titre de la fenêtre de l'invite de commandes." + +STRING_TIME_HELP1, "Affiche ou modifie l'heure système.\n\n\ +TIME [/T][heure]\n\n\ + /T affiche seulement\n\n\ +Taper TIME sans paramètres pour afficher l'heure courante et une invite\n\ +pour la modifier. Presser la touche ENTREE pour garder la même heure." + +STRING_TIME_HELP2, "Entrer la nouvelle heure: " + +STRING_TIMER_HELP1, "Ecoulé %d msecs\n" + +STRING_TIMER_HELP2, "Ecoulé %02d%c%02d%c%02d%c%02d\n" + +STRING_TIMER_HELP3, "Permet l'utilisation de dix chronomètres.\n\n\ +TIMER [ON|OFF] [/S] [/n] [/Fn]\n\n\ + ON Démarre le chronomètre\n\ + OFF Stoppe le chronomètre\n\ + /S Split time. Return stopwach split\n\ + time without changing its value\n\ + /n Indique le numéro du chronomètre.\n\ + Les chronomètres disponibles vont de 0 à 10.\n\ + Si non spécifié, le chronomètre par défaut est 1\n\ + /Fn Format de sortie\n\ + n peut être :\n\ + 0 millisecondes\n\ + 1 hh%cmm%css%cdd\n\n\ +Si aucun de ON, OFF or /S n'est spécifié la commande\n\ +changera l'état du chronomètre sélectionné\n\n" + +STRING_TYPE_HELP1, "Affiche le contenu de fichiers textes.\n\nTYPE [lecteur:][chemin]nomfich" + +STRING_VERIFY_HELP1, "Cette commande ne fait rien!!\n\ +Spécifie s'il faut verifier que vos fichiers sont écrits correctement.\ +\n\n\ +VERIFY [ON | OFF]\n\n\ +Taper VERIFY sans paramètres pour afficher le réglage de VERIFY." + +STRING_VERIFY_HELP2, "VERIFY est %s.\n" + +STRING_VERIFY_HELP3, "Vous devez indiquer ON ou OFF." + +STRING_VERSION_HELP1, "Affiche les information de version du shell\n\n\ +VER [/C][/R][/W]\n\n\ + /C Displays credits.\n\ + /R Displays redistribution information.\n\ + /W Displays warranty information." + +STRING_VERSION_HELP2, " comes with ABSOLUTELY NO WARRANTY; for details\n\ +type: `ver /w'. This is free software, and you are welcome to redistribute\n\ +it under certain conditions; type `ver /r' for details. Type `ver /c' for a\n\ +listing of credits." + +STRING_VERSION_HELP3, "\n This program is distributed in the hope that it will be useful,\n\ + but WITHOUT ANY WARRANTY; without even the implied warranty of\n\ + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n\ + GNU General Public License for more details." + +STRING_VERSION_HELP4, "\n This program is free software; you can redistribute it and/or modify\n\ + it under the terms of the GNU General Public License as published by\n\ + the Free Software Foundation; either version 2 of the License, or\n\ + (at your option) any later version." + +STRING_VERSION_HELP5, "\nEnvoyer les rapports d'erreur à .\n\ +Les mises à jour sont disponibles à : http://www.reactos.org" + +STRING_VERSION_HELP6, "\nVersion FreeDOS écrite par:\n" + +STRING_VERSION_HELP7, "\nVersion ReactOS écrite par:\n" + +STRING_VOL_HELP1, " Le nom de volume du lecteur %c: est %s\n" +STRING_VOL_HELP2, " Le volume dans le lecteur %c: n'a pas de nom\n" +STRING_VOL_HELP3, " Le numéro de série du volume est %04X-%04X\n" +STRING_VOL_HELP4, "Affiche le nom de volume et le numéro de série du disque s'ils existent.\n\nVOL [lecteur:]\n" + +STRING_WINDOW_HELP1, "Change l'aspect de la fenêtre de la console\n\n\ +WINDOW [/POS[=]gauche,haut,largeur,hauteur]\n\ + [MIN|MAX|RESTORE] ['titre']\n\n\ +/POS indique la position et les dimensions de la fenêtre\n\ +MIN minimise la fenêtre\n\ +MAX maximise la fenêtre\n\ +RESTORE restaure la fenêtre" + +STRING_WINDOW_HELP2, "Change l'aspect de la fenêtre de la console\n\n\ +WINDOW [/POS[=]gauche,haut,largeur,hauteur]\n\ + [MIN|MAX|RESTORE] ['titre']\n\n\ +/POS indique la position et les dimensions de la fenêtre\n\ +MIN minimise la fenêtre\n\ +MAX maximise la fenêtre\n\ +RESTORE restaure la fenêtre\n\ +titre titre de la fenêtre" + +STRING_CHOICE_OPTION "ON" +STRING_COPY_OPTION, "ONT" + +STRING_ALIAS_ERROR, "Ligne de commande trop longue après remplacement de l'alias!\n" +STRING_BATCH_ERROR, "Erreur à l'ouverture du fichier batch\n" +STRING_CHCP_ERROR1, "Page de codes actuelle : %u\n" +STRING_ERROR_INVALID_PARAM_FORMAT, "Format de paramètre incorrect - %s\n" +STRING_CHCP_ERROR4, "Page de code invalide \n" +STRING_CHOICE_ERROR, "Option invalide. Format attendu: /C[:]options" +STRING_CHOICE_ERROR_TXT, "Option invalide. Format attendu: /T[:]c,nn" +STRING_CHOICE_ERROR_OPTION, "Option invalide : %s" +STRING_CMD_ERROR1, "Ne peut rediriger l'entrée depuis le fichier %s\n" +STRING_CMD_ERROR2, "Erreur à la création du fichier temporaire pour les données du pipe\n" +STRING_CMD_ERROR3, "Ne peut rediriger vers le fichier %s\n" +STRING_CMD_ERROR4, "Lance %s...\n" +STRING_CMD_ERROR5, "Lance cmdexit.bat...\n" +STRING_COLOR_ERROR1, "L'arrière plan et l'avant plan ne peuvent être de la même couleur" +STRING_COLOR_ERROR2, "Erreur dans la spécification des couleurs" +STRING_COLOR_ERROR3, "Couleur %x\n" +STRING_COLOR_ERROR4, "Erreur: même couleur!" +STRING_CONSOLE_ERROR, "Erreur inconnue: %d\n" +STRING_COPY_ERROR1, "Erreur: Ne peut ouvrir la source - %s!\n" +STRING_COPY_ERROR2, "Erreur: Ne peut copier le fichier sur lui-même!\n" +STRING_COPY_ERROR3, "Erreur à l'écriture de la destination!\n" +STRING_COPY_ERROR4, "Erreur: Non implémenté actuellement!\n" +STRING_DATE_ERROR, "Date invalide." +STRING_DEL_ERROR5, "Le fichier %s va être effacé ! " +STRING_DEL_ERROR6, "Etes vous sûr (O/N)?" +STRING_DEL_ERROR7, "Efface : %s\n" +STRING_ERROR_ERROR1, "Erreur inconnue! Code d'erreur : 0x%lx\n" +STRING_ERROR_ERROR2, "Erreur de syntaxe" +STRING_FOR_ERROR1, "'in' manquant." +STRING_FOR_ERROR2, "pas de parenthèse trouvée." +STRING_FOR_ERROR3, "'do' manquant." +STRING_FOR_ERROR4, "pas de commande après 'do'." +STRING_FREE_ERROR1, "Lecteur invalide" +STRING_FREE_ERROR2, "sans nom" +STRING_GOTO_ERROR1, "Pas de label indiqué pour GOTO" +STRING_GOTO_ERROR2, "Label '%s' non trouvé\n" + +STRING_MOVE_ERROR1, "[OK]\n" +STRING_MOVE_ERROR2, "[Erreur]\n" + +STRING_PATH_ERROR, "CMD: Pas dans l'environnement '%s'\n" + +STRING_REN_ERROR1, "MoveFile() a échoué. Erreur: %lu\n" + +STRING_START_ERROR1, "No batch support at the moment!" + +STRING_TIME_ERROR1, "Heure invalide." + +STRING_TYPE_ERROR1, "Option invalide '/%s'\n" + +STRING_WINDOW_ERROR1, "Fenêtre non trouvée" + + +STRING_ERROR_PARAMETERF_ERROR, "Format du paramètre incorrect - %c\n" +STRING_ERROR_INVALID_SWITCH, "Paramètre invalide - /%c\n" +STRING_ERROR_TOO_MANY_PARAMETERS, "Trop de paramètres - %s\n" +STRING_ERROR_PATH_NOT_FOUND, "Chemin non trouvé\n" +STRING_ERROR_FILE_NOT_FOUND, "Fichier non trouvé\n" +STRING_ERROR_REQ_PARAM_MISSING, "Paramètre requis manquant\n" +STRING_CMD_SHELLINFO, "\n Interpréteur de ligne de commandes ReactOS" +STRING_VERSION_RUNVER, " tournant sur %s" +STRING_COPY_FILE, " %d fichier(s) copié(s)\n" +STRING_DELETE_WIPE, "effacé(s)" +STRING_FOR_ERROR, "mauvaise variable spécifiée." +STRING_SCREEN_COL, "valeur invalide pour col" +STRING_SCREEN_ROW, "valeur invalide pour lig" +STRING_TIMER_TIME "Le timer n°%d est %s: " +} diff --git a/reactos/base/shell/cmd/Hu.rc b/reactos/base/shell/cmd/Hu.rc new file mode 100644 index 00000000000..1f1b9c92e08 --- /dev/null +++ b/reactos/base/shell/cmd/Hu.rc @@ -0,0 +1,623 @@ +#include "resource.h" +#include "windows.h" +/* + * Moved all hardcoded strings to En.rc. + * By Magnus Olsen 2005 + * Hungarian resource állomány for ntvdm + * Translation by Robert Horvath (talley at cubeclub.hu) 2005 + */ + +LANGUAGE LANG_HUNGARIAN, SUBLANG_NEUTRAL +STRINGTABLE DISCARDABLE +{ + +STRING_ATTRIB_HELP, "Állományok attribútumok megjelenítése vagy beállításai.\n\n\ +ATTRIB [+R | -R] [+A | -A] [+S | -S] [+H | -H] állomány ...\n\ + [/S [/D]]\n\n\ + + bekapcsol egy attribútumot\n\ + - kikapcsol egy attribútumot\n\ + R Írásvédett állomány\n\ + A Archiválandó állomány\n\ + S Rendszer állomány\n\ + H Rejtett állomány\n\ + /S Minden állomány módosítása a mappában és minden\n\ + almappábanban\n\ + /D Mappákra is érvényesíti\n\n\ +Ha ATTRIB-ot paraméter nélkül írod be, megjeleníti a mappában található összes állományt és annak attribútumát.\n" + +STRING_ALIAS_HELP, "Aliasok megjelenítése, hozzáadása és törlése\n\n\ +ALIAS [alias=[parancs]]\n\n\ + alias Alias neve.\n\ + parancs A szöveg amit behelyettesít.\n\n\ +Aliasok megjelenítése:\n\ + ALIAS\n\n\ +Egy új hozzáadása vagy meglévõ helyettesítlse:\n\ + ALIAS da=dir a:\n\n\ +Egy alias törlése:\n\ + ALIAS da=" + +STRING_BEEP_HELP, "Hangjelzés leadása a speakerbõl.\n\nBEEP\n" + +STRING_CALL_HELP, "Kötegelt parancsfájl meghívása egy másikból.\n\n\ +CALL [kötet:][elérési_út]állomány [paraméterek]\n\n\ + paraméterek Itt adható meg a szükséges paraméterlista" + +STRING_CD_HELP, "Az aktuális mappa nevének a megjelenítése vagy váltás másikra\n\n\ +CHDIR [/D][meghajtó:][elérési_út]\n\ +CHDIR[..|.]\n\ +CD [/D][meghajtó:][elérési_út]\n\ +CD[..|.]\n\n\ + .. Szülõ mappa\n\ + /D Megváltoztatja az aktuális mappát és meghajtót is.\n\n\ +Írd be, hogy 'CD meghajtó:' hogy ki írja az aktuális mappát.\n\ +Írd be a CD-t paraméterek nélkül, hogy megjelenítse az aktuális meghajtót és mappát (ugyanaz mint az elõzõ).\n" + +STRING_CHCP_HELP, "Megjeleníti vagy megváltoztatja az aktív kódlapot.\n\n\ +CHCP [nnn]\n\n\ + nnn A használni kívánt kódlap száma.\n\n\ +Írd be a CHCP paraméterek nélkül, hogy megjelenítse az aktív kódlapot.\n" + +STRING_CHOICE_HELP, "Vár a felhasználóra, hogy válasszon a felkínált lehetõségek közül.\n\n\ +CHOICE [/C[:]választási lehetõségek][/N][/S][/T[:]c,nn][szöveg]\n\n\ + /C[:]választási lehetõségek Megengedett billentyûk. Alapértelmezett: YN. <-- Yes->Igen\n\ + /N Elrejti a választási lehetõségeket és a kérdõjelet.\n\ + /S Kis- és nagybetûk megkülönböztetése.\n\ + /T[:]v,nn A v lehetõséget választja nn másodperc után.\n\ + szöveg Megjelenítendõ szöveg.\n\n\ +Az ERRORLEVEL a válasz sorszámára lesz beállítva.\n" + +STRING_CLS_HELP, "Törli a képernyõt.\n\nCLS\n" + +STRING_CMD_HELP1, "\nElérhetõ belsõ parancsok:\n" + +STRING_CMD_HELP2, "\nElérhetõ lehetõségek:" + +STRING_CMD_HELP3," [aliasok]" + +STRING_CMD_HELP4," [elõzmények]" + +STRING_CMD_HELP5," [unix típusú állománynév kiegészítés]" + +STRING_CMD_HELP6," [mappa tár]" + +STRING_CMD_HELP7," [átirányítások és csõvezetékek]" + +STRING_CMD_HELP8, "Elindít egy új ReactOS parancssor értelmezõ.\n\n\ +CMD [/[C|K] parancs][/P][/Q][/T:eh]\n\n\ + /C parancs Végrehajtja a parancsot, majd kilép.\n\ + /K parancs Végrehajtja a parancsot, és tovább fut az értelmezõ.\n\ + /P Értelmezi az autoexec.bat állományt és a memóriában marad.\n\ + /T:eh COLOR parancs használata.\n" + +STRING_COLOR_HELP1, "A konzol elõ- és háttérszínét állítja be.\n\n\ +COLOR [eh [/-F]] \n\n\ + eh A konzol elõ- és háttérszínét állítja be.\n\ + /-F Nem frissíti az egész képernyõt\n\n\ +A színt két hexadecimális számjeggyel lehet beállítani\n\n\ +Az elérhetõ színek:\n\ +hex név hex név\n\ +0 Fekete 8 Szürke\n\ +1 Sötétkék 9 Kék\n\ +2 Sötétzöld A Zöld\n\ +3 Sötétlila B Türkízkék\n\ +4 Bordó C Vörös\n\ +5 Ciklámen D Ciklámen\n\ +6 Olíva E Sárga\n\ +7 Világos szürke F Fehér\n" + +STRING_COPY_HELP1, "Felülírja a következõt: %s (Igen/Nem/Mind)? " + +STRING_COPY_HELP2, "Egy vagy több állományt másol a megadott helyre.\n\n\ +COPY [/V][/Y|/-Y][/A|/B] forrás [/A|/B]\n\ + [+ forrás [/A|/B] [+ ...]] [cél [/A|/B]]\n\n\ + forrás Megadott állomány(ok)at fogja másolni.\n\ + /A Ez ASCII szöveg állomány.\n\ + /B Ez bináris állomány.\n\ + cél Megadja a cél mappát és/vagy az (új) állománynevet.\n\ + /V Ellenõrzi a másolást.\n\ + /Y Igennel válaszol kérdésnél.\n\ + /-Y Nemmel válaszol kérdésnél.\n\n\ +Az /Y kapcsolót a COPYCMD környezeti változóban is használható.\n" + +STRING_DATE_HELP1, "\nÚj dátum (hh%cnn%céééé): " + +STRING_DATE_HELP2, "\nÚj dátum (nn%chh%céééé): " + +STRING_DATE_HELP3, "\nÚj dátum (éééé%chh%cnn): " + +STRING_DATE_HELP4, "Megjeleníti vagy beállítja a rendszerdátumot.\n\n\ +DATE [/T][dátum]\n\n\ + /T Csak megjeleníti\n\n\ +Írd be a DATE parancsot paraméter nélkül, hogy megjelenítse a rendszer dátumot és bekérjen egy újat.\n\ +Nyomj ENTERT-t, ha nem akarsz változtatni.\n" + +STRING_DEL_HELP1, "Eltávolít egy vagy több állományt.\n\n\ +DEL [/N /P /T /Q /S /W /Y /Z /A[[:]attribútumok]] állomány ...\n\ +DELETE [/N /P /T /Q /S /W /Y /Z /A[[:]attribútumok]] állomány ...\n\ +ERASE [/N /P /T /Q /S /W /Y /Z /A[[:]attribútumok]] állomány ...\n\n\ + állomány Törlésre kijelöl állomány(ok).\n\n\ + /N Nem csinál semmit.\n\ + /P Rákérdezés minden állománynál.\n\ + /T Statisztika megjelenítése a végén.\n\ + /Q Csendes üzemmód.\n\ + /W Wipe. Overwrite the állomány with random numbers before deleting it.\n\ + /Y Minden válaszra igen. Figyelem, *.*-ot is törli!!\n\ + /F Rejtett, csak olvasható és rendszer állományokat is töröl.\n\ + /S Almappákban is törli az állományokat\n\ + /A Attribútumok alapján törli az állományokat.\n\ + attributes\n\ + R Csak olvasható állománys\n\ + S Rendszer állomány\n\ + A Archivált állomány\n\ + H Rejtett állománys\n\ + - ""Nem"" prefix\n" + +STRING_DEL_HELP2, "Minden állomány törölve lesz a mappában!\nBiztosan ezt akarod (I/N)?" +STRING_DEL_HELP3, " %lu állomány törölve\n" +STRING_DEL_HELP4, " %lu állomány törölve\n" + +STRING_DELAY_HELP, "pause for n seconds or milliseconds\n\ +DELAY [/m]n\n\n\ + /m specifiy than n are milliseconds\n\ + otherwise n are seconds\n" + +STRING_DIR_HELP1, "DIR [meghajtó:][elérési_út][állománynév] [/A[[:]attribútumok]] [/B] [/C] [/D] [/L] [/N]\n\ + [/O[[:]rendezési_feltétel]] [/P] [/Q] [/S] [/T[[:]idõ]] [/W] [/X] [/4]\n\n\ + [meghajtó:][elérési_út][állományname]\n\ + Az adott hely állományait és mappáit jeleníti meg.\n\n\ + /A A megadott attribútumu állományokat jeleníti csak meg.\n\ + attributes D Mappák R Csak olvasható állomány\n\ + H Rejtett állomány A Archiválandó állomány\n\ + S Rendszer állomány - ""Nem"" prefix\n\ + /B Fejléc és összefoglaló nélkül.\n\ + /C Ezres elválasztó jel használata. Ez az alapértelmezett, /-C a kikapcsolása.\n\ + /D Széles megjelenítés, oszlop szerint rendezve.\n\ + /L Kisbetûk használata.\n\ + /N New long list format where állománynames are on the far right.\n\ + /O Rendezés az alábbiak szerint.\n\ + sortorder N Név alapján (ABC sorrend) S Méret alapján (növekvõ)\n\ + E Kiterjesztés alapján (ABC sorrend) D Dátum/idõ alapján (legrégebbi elején)\n\ + G Mappák legelõl - ""Nem"" prefixel fordított rendezés\n\ + /P Csak egy képernyõnyi adat megjelenítése egyszerre.\n\ + /Q Állomány tulajdonsosának megjelenítése.\n\ + /S Almappák tartalmát is megjeleníti.\n\ + /T Controls which time field displayed or used for sorting\n\ + timefield C Létrehozás\n\ + A Utolsó megtekintés\n\ + W Utolsó módosítás\n\ + /W Széles megjelenítés.\n\ + /X This displays the short names generated for non-8dot3 állomány\n\ + names. The format is that of /N with the short name inserted\n\ + before the long name. If no short name is present, blanks are\n\ + displayed in its place.\n\ + /4 Négy számjegyû év\n\n\ +A kapcsolók a DIRCMD környezeti változóban is lehetnek.\n" + +STRING_DIR_HELP2, " A (%c) meghajtóban található kötet %s\n" +STRING_DIR_HELP3, " A (%c) meghajtóban található kötetnek nincs címkéje.\n" +STRING_DIR_HELP4, " A kötet sorozatszáma: %04X-%04X\n" +STRING_DIR_HELP5, "\n Összes állomány:\n%16i Állomány(ok)% 14s bájt\n" +STRING_DIR_HELP6, "%16i Mappa %15s bájt" +STRING_DIR_HELP7, "\n %s tartalma\n\n" +STRING_DIR_HELP8, "%16i Állomány %14s bájt\n" + +STRING_DIRSTACK_HELP1, "Megjegyzi az aktuális mappát, majd átvált egy máasikra.\n\n\ +PUSHD [elérési_út | ..]\n\n\ + elérési_út Ebbe a mappába fog átváltani\n" + +STRING_DIRSTACK_HELP2, "Visszalép a PUSHD által megjegyzett mappába.\n\nPOPD" + +STRING_DIRSTACK_HELP3, "Megjeleníti a megjegyzett mappákat.\n\nDIRS" + +STRING_DIRSTACK_HELP4, "Üres a tár" + +STRING_ECHO_HELP1, "Megjeleníti a szöveget új sor nélkül.\n\n\ + ECHOS szöveg" + +STRING_ECHO_HELP2, "Displays a message to the standard error.\n\n\ + ECHOERR szöveg\n\ + ECHOERR. Új sor" + +STRING_ECHO_HELP3, "Prints a messages to standard error output without trailing carridge return and line feed.\n\n\ + ECHOSERR message" + +STRING_ECHO_HELP4, "Megjelenít egy szöveget, vagy beállítja a visszhangot.\n\n\ + ECHO [ON | OFF]\n\ + ECHO [üzenet]\n\ + ECHO. Új sor\n\n\ +Paraméter nélkül megjeleníti a visszang állapotát." + +STRING_ECHO_HELP5, "Az ECHO %s\n" + +STRING_EXIT_HELP, "Kilép a parancssor értelmezõbõl.\n\nEXIT\n" + +STRING_FOR_HELP1, "Végrehajt egy parancsot az összes fájlban a megadott mappákban\n\n\ +FOR %változó IN (csoport) DO parancs [paraméterek]\n\n\ + %változó A cserélhetõ paraméter.\n\ + (csoport) Állományok csoportja. Joker-karakterek megengedettek EZT KURVÁRA ÁTKELL FORDÍTANI :)) wildcardok helyett?.\n\ + parancs Ezt a parancsot hajtja végre minden egyes állománnyal.\n\ + paraméterek Ezeket a paramétereket adja meg a parancsnak.\n\n\ +A batch állományban való haszálathoz %%változó kell a %változó helyett.\n" + +STRING_FREE_HELP1, "\nA (%s) meghajtóban lévõ kötet címkéje %-11s\n\ + Sorozatszám: %s\n\ + %16s bájt a teljes hely\n\ + %16s bájt használva\n\ + %16s bájt szabad\n" + +STRING_FREE_HELP2, "Kötet méret információk.\n\nFREE [meghajtó: ...]\n" + +STRING_IF_HELP1, "Performs conditional processing in batch programs.\n\n\ + IF [NOT] ERRORLEVEL number command\n\ + IF [NOT] string1==string2 command\n\ + IF [NOT] EXIST állományname command\n\ + IF [NOT] DEFINED variable command\n\n\ +NOT Specifies that CMD should carry out the command only if\n\ + the condition is false\n\ +ERRORLEVEL number Specifies a true condition if the last program run returned\n\ + an exit code equal or greater than the number specified.\n\ +command Specifies the command to carry out if the condition is met.\n\ +string1==string2 Specifies a true condition if the specified text strings\n\ + match.\n\ +EXIST állományname Specifies a true condition if the specified állományname exists.\n\ +DEFINED variable Specifies a true condition if the specified variable is\n\ + defined.\n" + +STRING_GOTO_HELP1, "Átirányít egy másik címkére a batch állományban.\n\n\ +GOTO címke\n\n\ + címke A megadott címkére fog ugrani az értelmezõ.\n\n\ +Egy címkét egy sorban lehet megadni, ':' -tal kezdve." + +STRING_LABEL_HELP1, "A kötet címkéjét megjeleníti, vagy megváltoztatja.\n\n\ +LABEL [meghajtó:] [új_címke]\n" + +STRING_LABEL_HELP2, "A (%c) meghajtóban lévõ kötet címkéje %s\n" +STRING_LABEL_HELP3, "A (%c) megjajtóban lévõ kötetnek nincs címkéje.\n" +STRING_LABEL_HELP4, "A kötet sorozatszáma %04X-%04X\n" +STRING_LABEL_HELP5, "Új kötetcímke (11 betû, ENTER ha üres)? " + +STRING_LOCALE_HELP1, "Az aktuális idõ:" + +STRING_MKDIR_HELP, "Létrehoz egy új mappát.\n\n\ +MKDIR [meghajtó:]path\nMD [meghajtó:]path" + +STRING_MEMMORY_HELP1, "Megjeleníti a memória statisztikát.\n\nMEMORY" + +STRING_MEMMORY_HELP2, "\n A memória %12s%%-a foglalt.\n\n\ + %13s bájtnyi teljes fizikai memória.\n\ + %13s bájtnyi elérhetõ memória.\n\n\ + %13s bájt a lapozóállomány.\n\ + %13s bájtnyi elérhetõ a lapozóállományban.\n\n\ + %13s bájt a teljes virtuális memória.\n\ + %13s bájtnyi elérhetõ a virtuális memóriából.\n" + +STRING_MISC_HELP1, "A folytatáshoz nyomj meg egy billentyût . . .\n" + +STRING_MOVE_HELP1, "Felülírja %s (Igen/Nem/Mind)? " + +STRING_MOVE_HELP2, "Áthelyezi és átnevezi az állományokat a mappákban.\n\n\ +Egy vagy több állomány áthelyezéséhez:\n\ +MOVE [/N][meghajtó:][elérési_út]állomány1[,...] cél\n\n\ +Mappa átnevezése:\n\ +MOVE [/N][meghajtó:][elérési_út]mappa1 mappa2\n\n\ + [meghajtó:][elérési_út]állomány1 Átnevezendõ állományok forrása.\n\ + /N Nem helyez át semmit.\n\n\ +Hiányosságok:\n\ + - Nem lehet meghajtók között áthelyezni állományokat.\n" + +STRING_MSGBOX_HELP, "display a message box and return user responce\n\n\ +MSGBOX type ['title'] prompt\n\n\ +type button displayed\n\ + possible values are: OK, OKCANCEL,\n\ + YESNO, YESNOCANCEL\n\ +title title of message box\n\ +prompt text displayed by the message box\n\n\n\ +ERRORLEVEL is set according the button pressed:\n\n\ +YES : 10 | NO : 11\n\ +OK : 10 | CANCEL : 12\n" + +STRING_PATH_HELP1, "Megjeleníti vagy beállítja a keresési útvonalakat.\n\n\ +PATH [[meghajtó:]elérési_út[;...]]\n\ +PATH ; Keresési útvonalak törlése\n\n\ +A PATH törléséhez a következõt írd be: PATH ;\n\ +Így csak az aktuális mappában fog keresni a CMD.\ +Paraméterek nélkül az érvényes keresési útvonalakat mutatja meg.\n" + +STRING_PROMPT_HELP1, "Parancssor beállítása.\n\n\ +PROMPT [szöveg]\n\n\ + szöveg Az új parancssor megadása.\n\n\ +A parancssor speciális kódokat is tartalmazhat:\n\n\ + $A & (és jel)\n\ + $B | (csõ)\n\ + $C ( (kezdõ rázójel)\n\ + $D Aktuális dátum\n\ + $E Escape-kód (ASCII 27-es kód)\n\ + $F ) (záró zárójel)\n\ + $G > ('nagyobb' jel)\n\ + $H Törlés (elötte lévõ karaktert törli)\n\ + $L < ('kissebb' jel)\n\ + $N Aktuális meghajtó\n\ + $P Aktuális meghajtó és mappa\n\ + $Q = (egyenlõség jel)\n\ + $T Aktuális idõ\n\ + $V OS verziószám\n\ + $_ Újsor\n\ + $$ $ (dollár jel)\n" + +STRING_PAUSE_HELP1, "Felfüggeszti a futást, és vár a felhasználóra. A következõ üzenet jelenik meg:\n\ +'A folytatáshoz nyomj meg egy billentyût . . .' vagy egy általad választott üzenet.\n\n\ +PAUSE [message]" + +STRING_PROMPT_HELP2, " $+ Displays the current depth of the directory stack" + +STRING_PROMPT_HELP3, "\nHa paraméter nélkül beírod a PROMPT parancsot, vissza áll az alapértelmezettre a kijelzés." + +STRING_REM_HELP, "Megjegyzést jelölõ sor batch fájlokban.\n\nREM [megjegyzés]" + +STRING_RMDIR_HELP, "Eltávolít egy mappát.\n\n\ +RMDIR [meghajtó:]elérési_út\nRD [meghajtó:]elérési_út" + +STRING_REN_HELP1, "Átnevez egy állományt.\n\n\ +RENAME [/E /N /P /Q /S /T] régi_név ... új_név\n\ +REN [/E /N /P /Q /S /T] régi_név ... új_név\n\n\ + /E Hibaüzenetek elrejtése.\n\ + /N Ne csináljon semmit .\n\ + /P Minden állománynál rákérdez. (Még NEM mûködik!!)\n\ + /Q Csendes mûködés.\n\ + /S Almappákat is átnevez.\n\ + /T Összes átnevezett fájl és állomány.\n\n\ +Csak az aktuális meghajtón és mappában fog mûködni.\n\ +Ha ez nem elég, használd a MOVE parancsot." + +STRING_REN_HELP2, " %lu állomány átnevezve\n" + +STRING_REN_HELP3, " %lu állomány átnevezve\n" + +STRING_SHIFT_HELP, "Eltolja a helyettesíthetõ paraméterek pozícióját a batch állományban.\n\n\ +SHIFT [DOWN]" + +STRING_SCREEN_HELP, "Megváltoztatja a kurzos pozícióját, vagy megjelenít adott pozícióban egy szöveget.\n\n\ +SCREEN sor oszlop [szöveg]\n\n\ + sor Ugrás sora\n\ + oszlop Ugrás oszlopa" + +STRING_SET_HELP, "Megjeleníti vagy beállítja a környezeti változókat.\n\n\ +SET [változó[=][érték]]\n\n\ + változó Környezeti változó neve.\n\ + érték A beállítandó érték.\n\n\ +Paraméterek nélkül megjeleníti az összes környezetiváltozót.\n" + +STRING_START_HELP1, "Végrehajt egy parancsot.\n\n\ +START parancs\n\n\ + parancs Végrehajtja a megadott parancsot.\n\n\ +Jelenleg minden parancs aszinkron hajtódik végre.\n" + +STRING_TITLE_HELP, "Beállítja az ablak címsorának szövegét.\n\n\ +TITLE [szöveg]\n\n\ +szöveg Beállítja az ablak címsorának szövegét.\n" + +STRING_TIME_HELP1, "Megjeleníti vagy beállítja a rendszeridõt.\n\n\ +TIME [/T][idõ]\n\n\ + /T Csaj megjeleníti\n\n\ +Paraméterek nélkül megjeleníti az aktuális idõt és kér egy újat.\n\ +Csak egy ENTER megnyomásával nem állítja át.\n" + +STRING_TIME_HELP2, "Új idõ: " + +STRING_TIMER_HELP1, "Eltelt %d ezred másodperc\n" + +STRING_TIMER_HELP2, "Eltelt: %02d%c%02d%c%02d%c%02d\n" + +STRING_TIMER_HELP3, "allow the use of ten stopwaches.\n\n\ +TIMER [ON|OFF] [/S] [/n] [/Fn]\n\n\ + ON Stopper bekapcsolása\n\ + OFF Stopper kikapcsolása\n\ + /S Split time. Return stopwatch split\n\ + time without changing its value\n\ + /n Stopper azonosító megadása.\n\ + Stopwaches avaliable are 0 to 9\n\ + If it is not specified default is 1\n\ + /Fn Format for output\n\ + n can be:\n\ + 0 milliseconds\n\ + 1 hh%cmm%css%cdd\n\n\ +if none of ON, OFF or /S is specified the command\n\ +will toggle stopwach state\n\n" + +STRING_TYPE_HELP1, "Megjeleníti az állományok tartalmát.\n\n\ +TYPE [meghajtó:][elérési_út]állománynév \n\ + /P Csak egy képernyõnyi tartalmat jelenít meg egyszerre.\n" + +STRING_VERIFY_HELP1, "Ez a parancs még nem mûködik!!\n\ +Lemezre írás utáni ellenõrzést állítja be.\n\n\ +VERIFY [ON | OFF]\n\n\ +Írd be a VERIFY-t paraméterek nélkül, hogy megjelenítse aktuális állapotát.\n" + +STRING_VERIFY_HELP2, "Az ellenõrzés jelenleg %s.\n" + +STRING_VERIFY_HELP3, "Csak az ON vagy OFF elfogadott." + +STRING_VERSION_HELP1, "A ReactOS verzióinformációit jeleníti meg\n\n\ +VER [/C][/R][/W]\n\n\ + /C Készítõk névsora.\n\ + /R Terjesztési információk.\n\ + /W Jótállási információk." + +STRING_VERSION_HELP2, " comes with ABSOLUTELY NO WARRANTY; for details\n\ +type: `ver /w'. This is free software, and you are welcome to redistribute\n\ +it under certain conditions; type `ver /r' for details. Type `ver /c' for a\n\ +listing of credits." + +STRING_VERSION_HELP3, "\n This program is distributed in the hope that it will be useful,\n\ + but WITHOUT ANY WARRANTY; without even the implied warranty of\n\ + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n\ + GNU General Public License for more details." + +STRING_VERSION_HELP4, "\n This program is free software; you can redistribute it and/or modify\n\ + it under the terms of the GNU General Public License as published by\n\ + the Free Software Foundation; either version 2 of the License, or\n\ + (at your option) any later version.\n" + +STRING_VERSION_HELP5, "\nHibákról E-Maileket ide küldhetsz: .\n\ +Frissítések és egyéb információk: http://www.reactos.org" + +STRING_VERSION_HELP6, "\nA FreeDOS készítõi:\n" + +STRING_VERSION_HELP7, "\nA ReactOS készítõi:\n" + +STRING_VOL_HELP1, " A (%c) meghajtóban lévõ kötet: %s\n" +STRING_VOL_HELP2, " A (%c) meghajtóban lévõ kötetnek nincs címkéje" +STRING_VOL_HELP3, " A kötet sorozatszáma %04X-%04X\n" +STRING_VOL_HELP4, "A kötet címkéjének és sorozatszámának megjelenítése, ha léteznek.\n\nVOL [meghajtó:]" + +STRING_WINDOW_HELP1, "change console window aspect\n\n\ +WINDOW [/POS[=]left,top,width,heigth]\n\ + [MIN|MAX|RESTORE] ['title']\n\n\ +/POS specify window placement and dimensions\n\ +MIN minimize the window\n\ +MAX maximize the window\n\ +RESTORE restore the window" + +STRING_WINDOW_HELP2, "change console window aspect\n\n\ +ACTIVATE 'window' [/POS[=]left,top,width,heigth]\n\ + [MIN|MAX|RESTORE] ['title']\n\n\ +window tile of window on wich perform actions\n\ +/POS specify window placement and dimensions\n\ +MIN minimize the window\n\ +MAX maximize the window\n\ +RESTORE restore the window\n\ +title new title\n" + + +STRING_HELP1, "Támogatott parancsok megjelenítése\n\n\ + parancs /? Több (részletes) információ megtekintéséhez használd ezt.\n\n\ +? Minden támogatott parancs megjelenítése (részletek nélkül).\n\ +ALIAS Megjeleníti, vagy megváltoztatja az aliasokat.\n\ +ATTRIB Megjeleníti vagy megváltoztatja az állományok attribútumát.\n\ +BEEP Megszólaltatja a hangszórót.\n\ +CALL Batch állományból egy másik batch állomány meghívása.\n\ +CD Megjeleníti vagy átvált egy másik mappába.\n\ +CHCP Megjeleníti vagy megváltoztatja az aktív kódlapot.\n\ +CHOICE Vár a felhasználóra, hogy válasszon a felkínált lehetõségek közül.\n\ +CLS Letörli a képernyõt.\n\ +CMD Egy új példányt indít a ReactOS parancsértelmezõjébõl.\n\ +COLOR A konzol elõ- és háttérszínét állítja be.\n\ +COPY Egy vagy több állományt másol a megadott helyre.\n\ +DATE Megjeleníti vagy beállítja a rendszerdátumot.\n\ +DELETE Eltávolít egy vagy több állományt.\n\ +DIR Megjeleníti a mappában található almappákat és állományokat.\n\ +ECHO Megjelenít egy szöveget, vagy beállítja a visszhangot.\n\ +ERASE Eltávolít egy vagy több fájlt.\n\ +EXIT Kilép a parancssor értelmezõbõl.\n\ +FOR Végrehajt egy parancsot az összes fájlban a megadott mappákban.\n\ +FREE Megjeleníti a szabad hely méretét.\n\ +GOTO Átirányít egy másik címkére a batch állományban.\n\ +HELP Segítséget ad a ReactOS parancsairól.\n\ +HISTORY Megjeleníti az ebben az ablakban kiadott parancsok listáját.\n\ +IF Feltételes végrehajtás batch állományokban.\n\ +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\ +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\ +POPD Visszalép a PUSHD által megjegyzett mappába.\n\ +PROMPT Parancssor beállítása.\n\ +PUSHD Megjegyzi az aktuális mappát, majd átvált egy máasikra.\n\ +RD Töröl egy mappát.\n\ +REM Megjegyzést jelölõ sor batch fájlokban.\n\ +REN Átnevez egy állományt.\n\ +RENAME Átnevez egy állományt.\n\ +RMDIR Töröl egy mappát.\n\ +SCREEN Megváltoztatja a kurzos pozícióját, vagy megjelenít adott pozícióban egy szöveget.\n\ +SET Megjeleníti vagy beállítja a környezeti változókat.\n\ +SHIFT Eltolja a helyettesíthetõ paraméterek pozícióját a batch állományban.\n" +STRING_HELP2, "START Egy új ablakban hajtha végre a parancsot.\n\ +TIME Megjeleníti vagy beállítja a rendszeridõt.\n\ +TIMER Idõzítõk kezelését teszi lehetõve.\n\ +TITLE Beállítja az ablak címsorának szövegét.\n\ +TYPE Megjeleníti egy állomány tartalmát.\n\ +VER Megjeleníti a ReactOS verzió információját.\n\ +VERIFY Írási mûveletek ellenõrzését vezérli\n\ +VOL Megjeleníti egy kötet címkéjét és sorozatszámát.\n" + + +STRING_CHOICE_OPTION, "IN" +STRING_COPY_OPTION, "INM" + + +STRING_ALIAS_ERROR, "A parancssor túl hosszú az alias kibontásakor!\n" +STRING_BATCH_ERROR, "Hiba a batch állomány megnyitásakor\n" +STRING_CHCP_ERROR1, "Aktív kódlap: %u\n" +STRING_CHCP_ERROR4, "Érvénytelen kódlap\n" +STRING_CHOICE_ERROR, "Érvénytelen paraméter. Várt formátum: /C[:]választási lehetõségek" +STRING_CHOICE_ERROR_TXT, "Érvénytelen paraméter. Várt formátum: /T[:]v,nn" +STRING_CHOICE_ERROR_OPTION, "Érvénytelen paraméter: %s" +STRING_CMD_ERROR1, "Nem lehet átirányítani a bevitelt a(z) %s állományból\n" +STRING_CMD_ERROR2, "Hiba a csõvezetékhez tartozó ideiglenes állomány létrehozásakor\n" +STRING_CMD_ERROR3, "Nem lehet a(z) %s állományba átirányítani\n" +STRING_CMD_ERROR4, "%s futtatása...\n" +STRING_CMD_ERROR5, "cmdexit.bat futtatása...\n" +STRING_COLOR_ERROR1, "Ugyanaz a szín nem lehet! (Az elõ- és háttérszín nem lehet ugyanolyan)" +STRING_COLOR_ERROR2, "Hibás szín megadás" +STRING_COLOR_ERROR3, "Szín %x\n" +STRING_COLOR_ERROR4, "Ugyanaz a szín nem lehet!" +STRING_CONSOLE_ERROR, "Ismeretlen hiba: %d\n" +STRING_COPY_ERROR1, "Hiba: a forrás nem nyitható meg - %s!\n" +STRING_COPY_ERROR2, "Hiba: nem másolhatod önmagára az állományt!\n" +STRING_COPY_ERROR3, "Hiba a cél írása közben!\n" +STRING_COPY_ERROR4, "Hiba: ez még nem mûködik!\n" +STRING_DATE_ERROR, "Érvénytelen dátum." +STRING_DEL_ERROR5, "A(z) %s állomány törölve lesz! " +STRING_DEL_ERROR6, "Biztos vagy benne (I/N)?" +STRING_DEL_ERROR7, "Törlés: %s\n" +STRING_ERROR_ERROR1, "Ismeretlen hiba! Hiba kód: 0x%lx\n" +STRING_ERROR_ERROR2, "Szintaxis hiba" +STRING_FOR_ERROR1, "az 'in' után hiányzik a feltétel." +STRING_FOR_ERROR2, "nincs zárójel megadva." +STRING_FOR_ERROR3, "a 'do' hiányzik." +STRING_FOR_ERROR4, "nincs parancs a 'do' után." +STRING_FREE_ERROR1, "Érvénytelen meghajtó" +STRING_FREE_ERROR2, "nincs cimkézve" +STRING_GOTO_ERROR1, "Nem lett cimke megadva a GOTO után" +STRING_GOTO_ERROR2, "A '%s' cimke nem található\n" + +STRING_MOVE_ERROR1, "[OK]\n" +STRING_MOVE_ERROR2, "[HIBA]\n" + +STRING_REN_ERROR1, "MoveÁllomány() sikertelen. Hiba: %lu\n" + +STRING_START_ERROR1, "Nincs batch támogatás jelenleg!" + +STRING_TIME_ERROR1, "Érvénytelen idõ." + +STRING_TYPE_ERROR1, "Érvénytelen beállítás '/%s'\n" + +STRING_WINDOW_ERROR1, "Az ablak nem található" + + +STRING_ERROR_PARAMETERF_ERROR, "A paraméter megadás hibás - %c\n" +STRING_ERROR_INVALID_SWITCH, "Érvénytelen kapcsoló - /%c\n" +STRING_ERROR_TOO_MANY_PARAMETERS, "Túl sok paraméter - %s\n" +STRING_ERROR_PATH_NOT_FOUND, "Az elérési_út nem halálható\n" +STRING_ERROR_FILE_NOT_FOUND, "Az állomány nem található\n" +STRING_ERROR_REQ_PARAM_MISSING, "Egy szükséges paraméter hiányzik\n" +STRING_ERROR_INVALID_DRIVE, "Érvénytelen meghajtó\n" +STRING_ERROR_INVALID_PARAM_FORMAT, "Érvénytelen paraméter megadás - %s\n" +STRING_ERROR_BADCOMMAND, "Ismeretlen parancs vagy állomány név\n" +STRING_ERROR_OUT_OF_MEMORY, "Nincs elég memória.\n" +STRING_ERROR_CANNOTPIPE, "Error! Cannot pipe! Cannot open temporary állomány!\n" +STRING_ERROR_D_PAUSEMSG, "A folytatáshoz nyomj meg egy billentyût . . ." +STRING_ERROR_DRIVER_NOT_READY, "A meghajtó nem áll készen" + +STRING_PATH_ERROR, "CMD: Not in environment '%s'\n" + +STRING_CMD_SHELLINFO, "\nReactOS Parancssor értelmezõ" +STRING_VERSION_RUNVER, " running on %s" +STRING_COPY_FILE , " %d állomány másolva\n" +STRING_DELETE_WIPE, "wiped" +STRING_FOR_ERROR, "Hibás változó." +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: " +} diff --git a/reactos/base/shell/cmd/Ja.rc b/reactos/base/shell/cmd/Ja.rc new file mode 100644 index 00000000000..f8c1077e35b --- /dev/null +++ b/reactos/base/shell/cmd/Ja.rc @@ -0,0 +1,658 @@ +#include "windows.h" +#include "resource.h" +/* + * Moved all hardcoded strings to En.rc. + * By Magnus Olsen 2005 + */ + +LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT +STRINGTABLE DISCARDABLE +{ + +STRING_ATTRIB_HELP, "ƒtƒ@ƒCƒ‹‘®«‚ð•\\Ž¦‚Ü‚½‚Í•ÏX‚µ‚Ü‚·B\n\n\ +ATTRIB [+R | -R] [+A | -A] [+S | -S] [+H | -H] [ƒtƒ@ƒCƒ‹] ...\n\ + [/S [/D]]\n\n\ + + ‘®«‚ðݒ肵‚Ü‚·B\n\ + - ‘®«‚ð‰ðœ‚µ‚Ü‚·B\n\ + R “Ç‚Ý‚Æ‚èê—p‘®«B\n\ + A ƒA[ƒJƒCƒu‘®«B\n\ + S ƒVƒXƒeƒ€ ƒtƒ@ƒCƒ‹‘®«B\n\ + H ‰B‚µƒtƒ@ƒCƒ‹‘®«B\n\ + /S Œ»Ý‚̃tƒHƒ‹ƒ_‚Æ‚·‚ׂẴTƒuƒtƒHƒ‹ƒ_‚̈ê’v‚·‚éƒtƒ@ƒCƒ‹‚ð\n\ + ˆ—‚µ‚Ü‚·B\n\ + /D ƒtƒHƒ‹ƒ_‚àˆ—‚µ‚Ü‚·B\n\n\ +ƒpƒ‰ƒ[ƒ^‚ðŽw’肵‚È‚¢‚Å ATTRIB ‚Æ“ü—Í‚·‚é‚ÆA‚·‚ׂẴtƒ@ƒCƒ‹‚Ì‘®«‚ð•\\Ž¦‚µ‚Ü‚·B\n" + +STRING_ALIAS_HELP, "ƒGƒCƒŠƒAƒX‚ÌÝ’è‚â‰ðœ‚ð‚µ‚½‚èAƒGƒCƒŠƒAƒX‚ð•\\Ž¦‚µ‚½‚肵‚Ü‚·B\n\n\ +ALIAS [ƒGƒCƒŠƒAƒX=[ƒRƒ}ƒ“ƒh]]\n\n\ + ƒGƒCƒŠƒAƒX ƒGƒCƒŠƒAƒX‚Æ‚µ‚¯‚é–¼‘OB\n\ + ƒRƒ}ƒ“ƒh ƒGƒCƒŠƒAƒX‚Æ‚µ‚ÄÝ’è‚·‚镶Žš—ñB\n\n\ +‚·‚ׂẴGƒCƒŠƒAƒX‚ðˆê——•\\Ž¦‚·‚é‚É‚Í:\n\ + ALIAS\n\n\ +V‚½‚ɃGƒCƒŠƒAƒX‚ðݒ肵‚½‚èAŠù‘¶‚̃GƒCƒŠƒAƒX‚ð’u‚«Š·‚¦‚é‚É‚Í:\n\ + ALIAS da=dir a:\n\n\ +ƒGƒCƒŠƒAƒX‚̃ŠƒXƒg‚©‚çƒGƒCƒŠƒAƒX‚ðŽæ‚蜂­‚É‚Í:\n\ + ALIAS da=" + +STRING_BEEP_HELP, "ƒXƒs[ƒJ‚©‚çƒr[ƒv‰¹‚ð–‚炵‚Ü‚·B\n\nBEEP\n" + +STRING_CALL_HELP, "ƒoƒbƒ` ƒvƒƒOƒ‰ƒ€‚ð•Ê‚̃oƒbƒ` ƒvƒƒOƒ‰ƒ€‚©‚çŒÄ‚Ño‚µ‚Ü‚·B\n\n\ +CALL [ƒhƒ‰ƒCƒu:][ƒpƒX]ƒtƒ@ƒCƒ‹–¼ [ƒoƒbƒ`ƒpƒ‰ƒ[ƒ^]\n\n\ + ƒoƒbƒ`ƒpƒ‰ƒ[ƒ^ ƒoƒbƒ` ƒvƒƒOƒ‰ƒ€‚Å•K—v‚ȃRƒ}ƒ“ƒh ƒ‰ƒCƒ“î•ñ‚ð\n\ + Žw’肵‚Ü‚·B" + +STRING_CD_HELP, "Œ»Ý‚̃fƒBƒŒƒNƒgƒŠ‚ð•ÏX‚µ‚½‚èAƒfƒBƒŒƒNƒgƒŠ–¼‚ð•\\Ž¦‚µ‚½‚肵‚Ü‚·B\n\n\ +CHDIR [/D][ƒhƒ‰ƒCƒu:][ƒpƒX]\n\ +CHDIR[..|.]\n\ +CD [/D][ƒhƒ‰ƒCƒu:]ƒpƒX]\n\ +CD[..|.]\n\n\ + .. eƒfƒBƒŒƒNƒgƒŠ\n\ + . Œ»Ý‚̃fƒBƒŒƒNƒgƒŠ\n\ + /D Œ»Ý‚̃hƒ‰ƒCƒu‚ƃfƒBƒŒƒNƒgƒŠ‚Ì—¼•û‚ð•ÏX‚µ‚Ü‚·B\n\n\ +CD ƒhƒ‰ƒCƒu: ‚Æ“ü—Í‚·‚é‚ÆŽw’肳‚ꂽƒhƒ‰ƒCƒu‚ÌŒ»Ý‚̃fƒBƒŒƒNƒgƒŠ‚ª•\\Ž¦‚³‚ê‚Ü‚·B\n\ +ƒpƒ‰ƒ[ƒ^‚ðŽw’肵‚È‚¢‚Å CD ‚Æ“ü—Í‚·‚é‚ÆAŒ»Ý‚̃hƒ‰ƒCƒu‚ƃfƒBƒŒƒNƒgƒŠ‚ª•\\Ž¦‚³‚ê‚Ü‚·B\n" + +STRING_CHCP_HELP, "Œ»Ý‚̃R[ƒh ƒy[ƒW”Ô†‚ð•\\Ž¦‚Ü‚½‚Íݒ肵‚Ü‚·B\n\n\ +CHCP [nnn]\n\n\ + nnn ƒR[ƒh ƒy[ƒW”Ô†‚ðŽw’肵‚Ü‚·B\n\n\ +Œ»Ý‚̃R[ƒh ƒy[ƒW”Ô†‚ð•\\Ž¦‚·‚é‚Æ‚«‚ÍAƒpƒ‰ƒ[ƒ^‚ðŽw’肹‚¸‚É CHCP ‚Æ“ü—Í‚µ‚Ä‚­‚¾‚³‚¢B\n" + +STRING_CHOICE_HELP, "ƒ†[ƒU[‚ª‘I‘ðŽˆ‚©‚çˆê‚‚ð‘I‘ð‚·‚é‚Ì‚ð‘Ò‚¿‚Ü‚·B\n\n\ +CHOICE [/C[:]‘I‘ðŽˆ][/N][/S][/T[:]c,nn][•¶Žš—ñ]\n\n\ + /C[:]‘I‘ðŽˆ ‹–‚³‚ê‚éƒL[“ü—Í‚ðŽw’肵‚Ü‚·BƒfƒtƒHƒ‹ƒg‚Í YN ‚Å‚·B\n\ + /N ƒvƒƒ“ƒvƒg‚Ì•¶Žš—ñ‚ÌÅŒã‚ÉA‘I‘ðŽˆ‚Æ ? ‚ð•\\Ž¦‚µ‚Ü‚¹‚ñB\n\ + /S ƒL[“ü—͂̑啶ŽšE¬•¶Žš‚ð‹æ•Ê‚µ‚Ü‚·B\n\ + /T[:]c,nn nn •bŒo‰ß‚·‚é‚ÆŽ©“®“I‚É c ‚ð‘I‘ð‚µ‚Ü‚·B\n\ + •¶Žš—ñ •\\Ž¦‚·‚éƒvƒƒ“ƒvƒg‚Ì•¶Žš—ñ‚Å‚·B\n\n\ +ƒ†[ƒU[‚ª‘I‘ðŽˆ‚É‚ ‚éƒL[‚ð‰Ÿ‚·‚ÆA‚»‚̃IƒtƒZƒbƒg‚ª ERRORLEVEL ‚ɃZƒbƒg‚³‚ê‚Ü‚·B\n" + +STRING_CLS_HELP, "‰æ–Ê‚ðÁ‹Ž‚µ‚Ü‚·B\n\nCLS\n" + +STRING_CMD_HELP1, "\n—˜—p‚Å‚«‚é“à•”ƒRƒ}ƒ“ƒh:\n" + +STRING_CMD_HELP2, "\n—˜—p‚Å‚«‚é‹@”\\:" + +STRING_CMD_HELP3," [ƒGƒCƒŠƒAƒX]" + +STRING_CMD_HELP4," [ƒqƒXƒgƒŠ]" + +STRING_CMD_HELP5," [UNIX ƒtƒ@ƒCƒ‹–¼•âŠ®]" + +STRING_CMD_HELP6," [ƒfƒBƒŒƒNƒgƒŠ ƒXƒ^ƒbƒN]" + +STRING_CMD_HELP7," [ƒŠƒ_ƒCƒŒƒNƒg‚ƃpƒCƒv]" + +STRING_CMD_HELP8, "ReactOS ƒRƒ}ƒ“ƒh ƒ‰ƒCƒ“ ƒCƒ“ƒ^[ƒvƒŠƒ^‚ÌV‚µ‚¢ƒCƒ“ƒXƒ^ƒ“ƒX‚ðŠJŽn‚µ‚Ü‚·B\n\n\ +CMD [/[C|K] ƒRƒ}ƒ“ƒh][/P][/Q][/T:bf]\n\n\ + /C ƒRƒ}ƒ“ƒh Žw’肳‚ꂽƒRƒ}ƒ“ƒh‚ðŽÀs‚µ‚½ŒãAI—¹‚µ‚Ü‚·B\n\ + /K ƒRƒ}ƒ“ƒh Žw’肳‚ꂽƒRƒ}ƒ“ƒh‚ðŽÀs‚µ‚Ü‚·‚ªAI—¹‚µ‚Ü‚¹‚ñB\n\ + /P CMD ‚͉i‘±“I‚É“®ì‚ð‚µAautoexec.bat ‚ðŽÀs‚µ‚Ü‚·\n\ + (I—¹‚³‚¹‚邱‚Æ‚Í‚Å‚«‚Ü‚¹‚ñ)B\n\ + /T:bf ‘OŒiF‚¨‚æ‚Ñ”wŒiF‚ðݒ肵‚Ü‚· (Ú×‚Í COLOR /? ‚ðŽQÆ‚µ‚Ä\n\ + ‚­‚¾‚³‚¢)B\n" + +STRING_COLOR_HELP1, "ƒRƒ“ƒ\\[ƒ‹‚̃fƒtƒHƒ‹ƒg‚Ì‘OŒiF‚¨‚æ‚Ñ”wŒiF‚ðݒ肵‚Ü‚·B\n\n\ +COLOR [‘®« [/-F]] \n\n\ + ‘®« ƒRƒ“ƒ\\[ƒ‹o—Í‚ÌF‘®«‚ðŽw’肵‚Ü‚·B\n\ + /-F ƒRƒ“ƒ\\[ƒ‹‚̋󂢂Ă¢‚é‹óŠÔ‚É‚ÍF‘®«‚ð“K—p‚µ‚È‚¢B\n\n\ +F‚ÍŽŸ‚Ì 3 Ží—Þ‚Ì•û–@‚ÅŽw’è‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚·B\n\ +1) [F–¼] on [F–¼] (•K—v‚È‚Ì‚Íʼn‚Ì 3 •¶Žš‚¾‚¯‚Å‚·)\n\ +2) [10 i”] on [10 i”]\n\ +3) 2 Œ…‚Ì 16 i”\n\n\ +F–¼:\n\ +10i 16i F–¼ 10i 16i F–¼\n\ +0 0 • 8 8 ŠDF (–¾‚é‚¢•)\n\ +1 1  9 9 –¾‚é‚¢Â\n\ +2 2 —Î 10 A –¾‚é‚¢—Î\n\ +3 3 …F 11 B –¾‚é‚¢…F\n\ +4 4 Ô 12 C –¾‚é‚¢Ô\n\ +5 5 Ž‡ 13 D –¾‚é‚¢Ž‡\n\ +6 6 ‰©F 14 E –¾‚é‚¢‰©F\n\ +7 7 ”’ 15 F ‹P‚­”’\n" + +STRING_COPY_HELP1, "%s ‚ðã‘‚«‚µ‚Ü‚·‚ªA‚æ‚낵‚¢‚Å‚·‚©? (Yes/No/All)? " + +STRING_COPY_HELP2, "1 ‚‚܂½‚Í•¡”‚̃tƒ@ƒCƒ‹‚ð•Ê‚ÌꊂɃRƒs[‚µ‚Ü‚·B\n\n\ +COPY [/V][/Y|/-Y][/A|/B] ƒRƒs[Œ³ [/A|/B]\n\ + [+ ƒRƒs[Œ³ [/A|/B] [+ ...]] [ƒRƒs[æ [/A|/B]]\n\n\ + ƒRƒs[Œ³ ƒRƒs[‚·‚éƒtƒ@ƒCƒ‹ (•¡”‰Â) ‚ðŽw’肵‚Ü‚·B\n\ + /A ASCII ƒeƒLƒXƒg ƒtƒ@ƒCƒ‹‚Æ‚µ‚Ĉµ‚¢‚Ü‚·B\n\ + /B ƒoƒCƒiƒŠ ƒtƒ@ƒCƒ‹‚Æ‚µ‚Ĉµ‚¢‚Ü‚·B\n\ + ƒRƒs[æ V‚µ‚¢ƒtƒ@ƒCƒ‹‚̃fƒBƒŒƒNƒgƒŠ‚Ü‚½‚̓tƒ@ƒCƒ‹–¼ (•¡”‰Â) ‚ð\n\ + Žw’肵‚Ü‚·B\n\ + /V V‚µ‚¢ƒtƒ@ƒCƒ‹‚ª³‚µ‚­‘‚«ž‚܂ꂽ‚©ŒŸ¸‚µ‚Ü‚·B\n\ + /Y Žó‚¯‘¤‚ÌŠù‘¶‚̃tƒ@ƒCƒ‹‚ðã‘‚«‚·‚é‘O‚ÉŠm”F‚̃ƒbƒZ[ƒW‚ð\n\ + •\\Ž¦‚µ‚Ü‚¹‚ñB\n\ + /-Y Žó‚¯‘¤‚ÌŠù‘¶‚̃tƒ@ƒCƒ‹‚ðã‘‚«‚·‚é‘O‚ÉŠm”F‚̃ƒbƒZ[ƒW‚ð\n\ + •\\Ž¦‚µ‚Ü‚·B\n\n\ +TŠÂ‹«•Ï” COPYCMD ‚ŃXƒCƒbƒ` /Y ‚ªÝ’肳‚ê‚Ä‚¢‚éꇂª‚ ‚è‚Ü‚·B\n\ +...\n" + +STRING_DATE_HELP1, "\nV‚µ‚¢“ú•t‚ð“ü—Í‚µ‚Ä‚­‚¾‚³‚¢ (mm%cdd%cyyyy): " + +STRING_DATE_HELP2, "\nV‚µ‚¢“ú•t‚ð“ü—Í‚µ‚Ä‚­‚¾‚³‚¢ (dd%cmm%cyyyy): " + +STRING_DATE_HELP3, "\nV‚µ‚¢“ú•t‚ð“ü—Í‚µ‚Ä‚­‚¾‚³‚¢ (yyyy%cmm%cdd): " + +STRING_DATE_HELP4, "“ú•t‚ð•\\Ž¦‚Ü‚½‚Íݒ肵‚Ü‚·B\n\n\ +DATE [/T][“ú•t]\n\n\ + /T “ú•t‚Ì•\\Ž¦‚Ì‚Ýs‚¢‚Ü‚·B\n\n\ +ƒpƒ‰ƒ[ƒ^‚ÌŽw’肪‚È‚¢ê‡‚ÍAŒ»Ý‚Ì“ú•t‚ª•\\Ž¦‚³‚êAV‚µ‚¢“ú•t‚Ì“ü—Í‚ð\n\ +‹‚ß‚ç‚ê‚Ü‚·B•ÏX‚µ‚È‚¢ê‡‚ÍAEnter ƒL[‚ð‰Ÿ‚µ‚Ü‚·B\n" + +STRING_DEL_HELP1, "1 ‚‚܂½‚Í•¡”‚̃tƒ@ƒCƒ‹‚ð휂µ‚Ü‚·B\n\n\ +DEL [/N /P /T /Q /S /W /Y /Z /A[[:]‘®«]] ƒtƒ@ƒCƒ‹–¼ ...\n\ +DELETE [/N /P /T /Q /S /W /Y /Z /A[[:]‘®«]] ƒtƒ@ƒCƒ‹–¼ ...\n\ +ERASE [/N /P /T /Q /S /W /Y /Z /A[[:]‘®«]] ƒtƒ@ƒCƒ‹–¼ ...\n\n\ + ƒtƒ@ƒCƒ‹–¼\n\ + 휂·‚éƒtƒ@ƒCƒ‹ (•¡”‰Â) ‚ðŽw’肵‚Ü‚·B\n\n\ + /N Nothing. ‰½‚à‚µ‚Ü‚¹‚ñB\n\ + /P Prompt. Šeƒtƒ@ƒCƒ‹‚ð휂·‚é‘O‚ÉŠm”F‚̃ƒbƒZ[ƒW‚ð•\\Ž¦‚µ‚Ü‚·B\n\ + /T Total. 휂³‚ꂽƒtƒ@ƒCƒ‹‚Ì‘”‚Ɖð•ú‚³‚ꂽƒfƒBƒXƒN—̈æ‚ð•\\Ž¦‚µ‚Ü‚·B\n\ + /Q Quiet.\n\ + /W Wipe. 휂·‚é‘O‚ÉAƒtƒ@ƒCƒ‹‚ð—”‚Åã‘‚«‚µ‚Ü‚·B\n\ + /Y Yes. ƒƒCƒ‹ƒhƒJ[ƒh‚ðŽg—p‚µ‚Ĉꊇ휂·‚é‚Æ‚«‚àAŠm”F‚̃ƒbƒZ[ƒW‚ð\n\ + •\\Ž¦‚¹‚¸‚É휂µ‚Ü‚·B\n\ + /F “Ç‚Ý‚Æ‚èê—pƒtƒ@ƒCƒ‹‚âƒVƒXƒeƒ€ ƒtƒ@ƒCƒ‹‚ð‹­§“I‚É휂µ‚Ü‚·B\n\ + /S Žw’肳‚ꂽƒtƒ@ƒCƒ‹‚ð‚·‚×‚Ä‚ÌƒTƒuƒfƒBƒŒƒNƒgƒŠ‚©‚ç휂µ‚Ü‚·B\n\ + /A ‘®«‚É‚æ‚è휂·‚éƒtƒ@ƒCƒ‹‚ð‘I‘ð‚µ‚Ü‚·B\n\ + ‘®«\n\ + R “Ç‚ÝŽæ‚èê—p\n\ + S ƒVƒXƒeƒ€ ƒtƒ@ƒCƒ‹\n\ + A ƒA[ƒJƒCƒu\n\ + H ‰B‚µƒtƒ@ƒCƒ‹\n\ + - ‚»‚Ì‘®«ˆÈŠO\n" + +STRING_DEL_HELP2, "ƒfƒBƒŒƒNƒgƒŠ‚Ì‚·‚ׂẴtƒ@ƒCƒ‹‚ªíœ‚³‚ê‚Ü‚·!\n‚æ‚낵‚¢‚Å‚·‚© (Y/N)?" +STRING_DEL_HELP3, " %lu ŒÂ‚̃tƒ@ƒCƒ‹‚ð휂µ‚Ü‚µ‚½\n" +STRING_DEL_HELP4, " %lu ŒÂ‚̃tƒ@ƒCƒ‹‚ð휂µ‚Ü‚µ‚½\n" + +STRING_DELAY_HELP, "n •bA‚Ü‚½‚Í n ƒ~ƒŠ•b‘Ò‹@‚µ‚Ü‚·B\n\ +DELAY [/m]n\n\n\ + /m ’PˆÊ‚ðƒ~ƒŠ•b‚ÉŽw’肵‚Ü‚·B\n\ + Žw’肵‚È‚¢ê‡A’PˆÊ‚É‚Í•b‚ªŽg‚í‚ê‚Ü‚·B\n" + +STRING_DIR_HELP1, "ƒfƒBƒŒƒNƒgƒŠ’†‚̃tƒ@ƒCƒ‹‚ƃTƒuƒfƒBƒŒƒNƒgƒŠ‚ðˆê——•\\Ž¦‚µ‚Ü‚·B\n\n\ +DIR [ƒhƒ‰ƒCƒu:][ƒpƒX][ƒtƒ@ƒCƒ‹–¼] [/A[[:]‘®«]] [/B] [/C] [/D] [/L] [/N]\n\ + [/O[[:]ƒ\\[ƒg‡]] [/P] [/Q] [/S] [/T[[:]ƒ^ƒCƒ€ƒtƒB[ƒ‹ƒh]] [/W] [/X] [/4]\n\n\ + [ƒhƒ‰ƒCƒu:][ƒpƒX][ƒtƒ@ƒCƒ‹–¼]\n\ + ˆê——•\\Ž¦‚·‚éƒhƒ‰ƒCƒuAƒfƒBƒŒƒNƒgƒŠA‚Ü‚½‚̓tƒ@ƒCƒ‹‚ðŽw’肵‚Ü‚·B\n\ + /A Žw’肳‚ꂽ‘®«‚̃tƒ@ƒCƒ‹‚ð•\\Ž¦‚µ‚Ü‚·B\n\ + ‘®« D ƒfƒBƒŒƒNƒgƒŠ R “Ç‚ÝŽæ‚èê—p\n\ + H ‰B‚µƒtƒ@ƒCƒ‹ A ƒA[ƒJƒCƒu\n\ + S ƒVƒXƒeƒ€ ƒtƒ@ƒCƒ‹ - ‚»‚Ì‘®«ˆÈŠO\n\ + /B ƒtƒ@ƒCƒ‹–¼‚Ì‚Ý‚ð•\\Ž¦‚µ‚Ü‚· (Œ©o‚µ‚â—v–ñ‚ª•t‚«‚Ü‚¹‚ñ)B\n\ + /C ƒtƒ@ƒCƒ‹ ƒTƒCƒY‚ðŒ…‹æØ‚è•\\Ž¦‚µ‚Ü‚·B‚±‚ê‚Í\n\ + ƒfƒtƒHƒ‹ƒg‚ÌÝ’è‚Å‚·B/-C ‚Æ‚·‚é‚ÆŒ…‹æØ‚è•\\Ž¦‚³‚ê‚Ü‚¹‚ñB\n\ + /D /W ‚Æ“¯‚¶‚Å‚·‚ªAƒtƒ@ƒCƒ‹‚ð—ñ‚Å•À‚בւ¦‚½ˆê——‚ð•\\Ž¦‚µ‚Ü‚·B\n\ + /L ¬•¶Žš‚Å•\\Ž¦‚µ‚Ü‚·B\n\ + /N ƒtƒ@ƒCƒ‹–¼‚ð‰E’[‚É•\\Ž¦‚·‚éV‚µ‚¢ˆê——Œ`Ž®‚ðŽg—p‚µ‚Ü‚·B\n\ + /O ƒtƒ@ƒCƒ‹‚ð•À‚בւ¦‚Ä•\\Ž¦‚µ‚Ü‚·B\n\ + ƒ\\[ƒg‡ N –¼‘O‡ (ƒAƒ‹ƒtƒ@ƒxƒbƒg) S ƒTƒCƒY‡ (¬‚³‚¢‚Ù‚¤‚©‚ç)\n\ + E Šg’£Žq‡ (ƒAƒ‹ƒtƒ@ƒxƒbƒg) D “úŽž‡ (ŒÃ‚¢‚Ù‚¤‚©‚ç)\n\ + G ƒOƒ‹[ƒv (ƒfƒBƒŒƒNƒgƒŠ‚©‚ç) - ~‡\n\ + /P 1 ‰æ–Ê‚²‚Æ‚É’âŽ~‚µ‚Ä•\\Ž¦‚µ‚Ü‚·B\n\ + /Q ƒtƒ@ƒCƒ‹‚ÌŠ—LŽÒ‚ð•\\Ž¦‚µ‚Ü‚·B\n\ + /S Žw’肳‚ꂽƒfƒBƒŒƒNƒgƒŠ‚¨‚æ‚Ñ‚»‚̃TƒuƒfƒBƒŒƒNƒgƒŠ‚Ì‚·‚ׂĂÌ\n\ + ƒtƒ@ƒCƒ‹‚ð•\\Ž¦‚µ‚Ü‚·B\n\ + /T ‚ǂ̃^ƒCƒ€ƒtƒB[ƒ‹ƒh‚ð•\\Ž¦‚·‚é‚©A‚Ü‚½‚Í•À‚בւ¦‚ÉŽg—p‚·‚é‚©‚ð\n\ + Žw’肵‚Ü‚·B\n\ + ƒ^ƒCƒ€ƒtƒB[ƒ‹ƒh C ì¬n\n\ + A ÅIƒAƒNƒZƒX\n\ + W ÅIXV\n\ + /W ƒƒCƒhˆê——Œ`Ž®‚Å•\\Ž¦‚µ‚Ü‚·B\n\ + /X ‚±‚̃IƒvƒVƒ‡ƒ“‚Í MS-DOS Œ`Ž® (8.3) ˆÈŠO‚̃tƒ@ƒCƒ‹–¼‚ɑ΂·‚é’Z‚¢\n\ + –¼‘O‚ð•\\Ž¦‚µ‚Ü‚·B’·‚¢–¼‘O‚Ì‘O‚É’Z‚¢–¼‘O‚ð•\\Ž¦‚·‚é“_‚𜂯‚ÎA\n\ + /N ƒIƒvƒVƒ‡ƒ“‚Æ“¯‚¶‚Å‚·B’Z‚¢–¼‘O‚ª‚È‚¢ê‡‚ÍAƒuƒ‰ƒ“ƒN‚É\n\ + ‚È‚è‚Ü‚·B\n\ + /4 4 ‚‚̔Žš‚Å”N‚ð•\\Ž¦‚µ‚Ü‚·B\n\n\ +ŠÂ‹«•Ï” DIRCMD ‚ɃXƒCƒbƒ`‚ðÝ’è‚Å‚«‚Ü‚·B\n\ +/-W ‚̂悤‚É - (ƒnƒCƒtƒ“) ‚ð‘O‚ɂ‚¯‚é‚ÆA‚»‚̃XƒCƒbƒ`‚Í–³Œø‚É‚È‚è‚Ü‚·B\n" + +STRING_DIR_HELP2, " ƒhƒ‰ƒCƒu %c ‚̃{ƒŠƒ…[ƒ€ ƒ‰ƒxƒ‹‚Í %s ‚Å‚·\n" +STRING_DIR_HELP3, " ƒhƒ‰ƒCƒu %c ‚ɂ̓{ƒŠƒ…[ƒ€ ƒ‰ƒxƒ‹‚ª‚ ‚è‚Ü‚¹‚ñB\n" +STRING_DIR_HELP4, " ƒ{ƒŠƒ…[ƒ€ ƒVƒŠƒAƒ‹”Ô†‚Í %04X-%04X ‚Å‚·\n" +STRING_DIR_HELP5, "\n ƒtƒ@ƒCƒ‹‚Ì‘”:\n%16i ŒÂ‚̃tƒ@ƒCƒ‹% 14s ƒoƒCƒg\n" +STRING_DIR_HELP6, "%16i ŒÂ‚̃fƒBƒŒƒNƒgƒŠ% 15s ƒoƒCƒg\n" +STRING_DIR_HELP7, "\n %s ‚̃fƒBƒŒƒNƒgƒŠ\n\n" +STRING_DIR_HELP8, "%16i ŒÂ‚̃tƒ@ƒCƒ‹% 14s ƒoƒCƒg\n" + +STRING_DIRSTACK_HELP1, "POPD ƒRƒ}ƒ“ƒh‚ÅŽg—p‚·‚邽‚ß‚ÉŒ»Ý‚̃fƒBƒŒƒNƒgƒŠ‚ð•Û‘¶‚µA\n\ +Žw’肵‚½ƒfƒBƒŒƒNƒgƒŠ‚É•ÏX‚µ‚Ü‚·B\n\n\ +PUSHD [ƒpƒX | ..]\n\n\ + ƒpƒX Œ»Ý‚̃fƒBƒŒƒNƒgƒŠ‚Æ‚µ‚ÄÝ’è‚·‚éƒfƒBƒŒƒNƒgƒŠ‚ðŽw’肵‚Ü‚·B\n" + +STRING_DIRSTACK_HELP2, "PUSHD ƒRƒ}ƒ“ƒh‚Å‹L‰¯‚³‚ꂽƒfƒBƒŒƒNƒgƒŠ‚É•ÏX‚µ‚Ü‚·B\n\nPOPD" + +STRING_DIRSTACK_HELP3, "ƒfƒBƒŒƒNƒgƒŠ ƒXƒ^ƒbƒN‚̈ꗗ‚ð•\\Ž¦‚µ‚Ü‚·B\n\nDIRS" + +STRING_DIRSTACK_HELP4, "ƒfƒBƒŒƒNƒgƒŠ ƒXƒ^ƒbƒN‚Í‹ó‚Å‚·B" + +STRING_ECHO_HELP1, "ƒƒbƒZ[ƒW‚ð•\\Ž¦‚µ‚Ü‚·‚ªA‘O‚ɃLƒƒƒŠƒbƒW ƒŠƒ^[ƒ“‚ƃ‰ƒCƒ“ƒtƒB[ƒh‚ð‚‚¯‚Ü‚¹‚ñB\n\n\ + ECHOS ƒƒbƒZ[ƒW" + +STRING_ECHO_HELP2, "•W€ƒGƒ‰[‚ɃƒbƒZ[ƒW‚ð•\\Ž¦‚µ‚Ü‚·B\n\n\ + ECHOERR ƒƒbƒZ[ƒW\n\ + ECHOERR. ‹ós‚ðo—Í‚µ‚Ü‚·B" + +STRING_ECHO_HELP3, "•W€ƒGƒ‰[‚ɃƒbƒZ[ƒW‚ð•\\Ž¦‚µ‚Ü‚·‚ªA‘O‚ɃLƒƒƒŠƒbƒW ƒŠƒ^[ƒ“‚Æ\n\ +ƒ‰ƒCƒ“ƒtƒB[ƒh‚ð‚‚¯‚Ü‚¹‚ñB\n\n\ + ECHOSERR ƒƒbƒZ[ƒW" + +STRING_ECHO_HELP4, "ƒƒbƒZ[ƒW‚ð•\\Ž¦‚µ‚½‚èAƒRƒ}ƒ“ƒh ƒGƒR[‚Ì ON ‚Æ OFF ‚ðØ‚è‘Ö‚¦‚Ü‚·B\n\n\ + ECHO [ON | OFF]\n\ + ECHO [ƒƒbƒZ[ƒW]\n\ + ECHO. ‹ós‚ðo—Í‚µ‚Ü‚·B\n\n\ +Œ»Ý‚̃GƒR[Ý’è‚ð•\\Ž¦‚·‚é‚É‚ÍAƒpƒ‰ƒ[ƒ^‚ðŽw’肹‚¸‚É ECHO ‚Æ“ü—Í‚µ‚Ä‚­‚¾‚³‚¢B" + +STRING_ECHO_HELP5, "ECHO ‚Í %s ‚Å‚·B\n" + +STRING_EXIT_HELP, "ƒRƒ}ƒ“ƒh ƒCƒ“ƒ^[ƒvƒŠƒ^‚ðI—¹‚µ‚Ü‚·B\n\nEXIT\n" + +STRING_FOR_HELP1, "Žw’肳‚ꂽƒRƒ}ƒ“ƒh‚ðƒtƒ@ƒCƒ‹ ƒZƒbƒg‚ÌŠeƒtƒ@ƒCƒ‹‚ɑ΂µ‚ÄŽÀs‚µ‚Ü‚·B\n\n\ +FOR %%•Ï” IN (ƒZƒbƒg) DO ƒRƒ}ƒ“ƒh [ƒpƒ‰ƒ[ƒ^]\n\n\ + %%•Ï” ’Pˆê•¶Žš‚Ì’u‚«Š·‚¦‰Â”\\‚ȃpƒ‰ƒ[ƒ^‚ðŽw’肵‚Ü‚·B\n\ + (ƒZƒbƒg) ƒtƒ@ƒCƒ‹ ƒZƒbƒg‚ðŽw’肵‚Ü‚·BƒƒCƒ‹ƒhƒJ[ƒh‚ðŽg—p‚Å‚«‚Ü‚·B\n\ + ƒRƒ}ƒ“ƒh Šeƒtƒ@ƒCƒ‹‚²‚Æ‚ÉŽÀs‚·‚éƒRƒ}ƒ“ƒh‚ðŽw’肵‚Ü‚·B\n\ + ƒpƒ‰ƒ[ƒ^ Žw’肳‚ꂽƒRƒ}ƒ“ƒh‚̃pƒ‰ƒ[ƒ^‚Ü‚½‚̓XƒCƒbƒ`‚ðŽw’肵‚Ü‚·B\n\n\ +ƒoƒbƒ` ƒvƒƒOƒ‰ƒ€‚Å FOR ƒRƒ}ƒ“ƒh‚ðŽg—p‚·‚é‚Æ‚«‚ÍA%%•Ï”‚Ì‘ã‚í‚è‚ÉA\n\ +%%%%•Ï”‚ðŽg—p‚µ‚Ä‚­‚¾‚³‚¢B\n" + +STRING_FREE_HELP1, "\nƒhƒ‰ƒCƒu %c ‚̃{ƒŠƒ…[ƒ€ ƒ‰ƒxƒ‹‚Í %-11s ‚Å‚·\n\ + ƒVƒŠƒAƒ‹”Ô†‚Í %s ‚Å‚·\n\ + %16s ƒoƒCƒg: ‘SƒfƒBƒXƒN—e—Ê\n\ + %16s ƒoƒCƒg: Žg—p’†\n\ + %16s ƒoƒCƒg: ‹ó‚«—e—Ê\n" + +STRING_FREE_HELP2, "ƒhƒ‰ƒCƒu‚ÉŠÖ‚·‚éî•ñ‚ð•\\Ž¦‚µ‚Ü‚·B\n\nFREE [ƒhƒ‰ƒCƒu: ...]\n" + +STRING_IF_HELP1, "ƒoƒbƒ` ƒvƒƒOƒ‰ƒ€’†‚ÅðŒˆ—‚ðŽÀs‚µ‚Ü‚·B\n\n\ + IF [NOT] ERRORLEVEL ”Ô† ƒRƒ}ƒ“ƒh\n\ + IF [NOT] •¶Žš—ñ1==•¶Žš—ñ2 ƒRƒ}ƒ“ƒh\n\ + IF [NOT] EXIST ƒtƒ@ƒCƒ‹–¼ ƒRƒ}ƒ“ƒh\n\ + IF [NOT] DEFINED •Ï” ƒRƒ}ƒ“ƒh\n\n\ +NOT ðŒ‚ª‹U‚Ìꇂɂ¾‚¯ACMD ‚ªƒRƒ}ƒ“ƒh‚ðŽÀs‚·‚邱‚Æ‚ð\n\ + Žw’肵‚Ü‚·B\n\ +ERRORLEVEL ”Ô† ÅŒã‚̃vƒƒOƒ‰ƒ€‚ÌŽÀs‚ÅŽw’肳‚ꂽ”Ô†ˆÈã‚ÌI—¹ƒR[ƒh\n\ + ‚ª•Ô‚³‚ꂽ‚Æ‚«‚ÉAðŒ‚ª^‚É‚È‚é‚悤‚ÉŽw’肵‚Ü‚·B\n\ +ƒRƒ}ƒ“ƒh ðŒ‚ª^‚Ì‚Æ‚«‚ÉŽÀs‚·‚éƒRƒ}ƒ“ƒh‚ðŽw’肵‚Ü‚·B\n\ +•¶Žš—ñ1==•¶Žš—ñ2 ƒeƒLƒXƒg•¶Žš—ñ‚ªˆê’v‚·‚é‚Æ‚«‚ÉðŒ‚ª^‚É‚È‚é‚悤‚ÉŽw’è\n\ + ‚µ‚Ü‚·B\n\ +EXIST ƒtƒ@ƒCƒ‹–¼ Žw’肵‚½ƒtƒ@ƒCƒ‹–¼‚ª‘¶Ý‚·‚é‚Æ‚«‚ÉðŒ‚ª^‚É‚È‚é‚悤‚É\n\ + Žw’肵‚Ü‚·B\n\ +DEFINED •Ï” Žw’肵‚½•Ï”‚ª’è‹`‚³‚ê‚Ä‚¢‚é‚Æ‚«‚ÉðŒ‚ª^‚É‚È‚é‚悤‚É\n\ + Žw’肵‚Ü‚·B\n" + +STRING_GOTO_HELP1, "ƒoƒbƒ` ƒvƒƒOƒ‰ƒ€“à‚ÌAƒ‰ƒxƒ‹‚ÅŽw’肳‚ê‚Ä‚¢‚és‚Ö§Œä‚ðˆÚ“®‚µ‚Ü‚·B\n\n\ +GOTO ƒ‰ƒxƒ‹\n\n\ + ƒ‰ƒxƒ‹ ƒoƒbƒ` ƒvƒƒOƒ‰ƒ€‚щƒxƒ‹‚Æ‚µ‚ÄŽg—p‚·‚éƒeƒLƒXƒg•¶Žš—ñ‚ðŽw’肵‚Ü‚·B\n\n\ +ƒ‰ƒxƒ‹‚Ì擪‚É‚Í : (ƒRƒƒ“) ‚ðŽw’肵Aƒ‰ƒxƒ‹‚¾‚¯‚ð’P“Æ‚Å 1 s‚É“ü—Í‚µ‚Ä‚­‚¾\n\ +‚³‚¢B" + +STRING_LABEL_HELP1, "ƒfƒBƒXƒN‚̃{ƒŠƒ…[ƒ€ ƒ‰ƒxƒ‹‚ð•\\Ž¦‚Ü‚½‚Í•ÏX‚µ‚Ü‚·B\n\nLABEL [ƒhƒ‰ƒCƒu:][ƒ‰ƒxƒ‹]\n" + +STRING_LABEL_HELP2, "ƒhƒ‰ƒCƒu %c: ‚̃{ƒŠƒ…[ƒ€ ƒ‰ƒxƒ‹‚Í %s ‚Å‚·\n" +STRING_LABEL_HELP3, "ƒhƒ‰ƒCƒu %c: ‚ɂ̓{ƒŠƒ…[ƒ€ ƒ‰ƒxƒ‹‚ª‚ ‚è‚Ü‚¹‚ñl\n" +STRING_LABEL_HELP4, "ƒ{ƒŠƒ…[ƒ€ ƒVƒŠƒAƒ‹”Ô†‚Í %04X-%04X\n ‚Å‚·" +STRING_LABEL_HELP5, "ƒ{ƒŠƒ…[ƒ€ ƒ‰ƒxƒ‹‚ð 11 •¶ŽšˆÈ“à‚Å“ü—Í‚µ‚Ä‚­‚¾‚³‚¢B\n•K—v‚È‚¯‚ê‚Î Enter ƒL[‚ð‰Ÿ‚µ‚Ä‚­‚¾‚³‚¢: " + +STRING_LOCALE_HELP1, "Œ»ÝŽž‚Í" + +STRING_MKDIR_HELP, "ƒfƒBƒŒƒNƒgƒŠ‚ð쬂µ‚Ü‚·B\n\n\ +MKDIR [ƒhƒ‰ƒCƒu:]ƒpƒX\n\ +MD [ƒhƒ‰ƒCƒu:]ƒpƒX" + +STRING_MEMMORY_HELP1, "ƒVƒXƒeƒ€ ƒƒ‚ƒŠ‚Ì—Ê‚ð•\\Ž¦‚µ‚Ü‚·B\n\nMEMORY" + +STRING_MEMMORY_HELP2, "\n %12s%% ‚̃ƒ‚ƒŠ‚ªŽg—p‚³‚ê‚Ä‚¢‚Ü‚·B\n\n\ + %13s ƒoƒCƒg: ‘S•¨—ƒƒ‚ƒŠ\n\ + %13s ƒoƒCƒg: —˜—p‰Â”\\‚È•¨—ƒƒ‚ƒŠ\n\n\ + %13s ƒoƒCƒg: ‘Sƒy[ƒWƒtƒ@ƒCƒ‹\n\ + %13s ƒoƒCƒg: —˜—p‰Â”\\‚ȃy[ƒWƒtƒ@ƒCƒ‹\n\n\ + %13s ƒoƒCƒg: ‘S‰¼‘zƒƒ‚ƒŠ\n\ + %13s ƒoƒCƒg: —˜—p‰Â”\\‚ȉ¼‘zƒƒ‚ƒŠ\n" + +STRING_MISC_HELP1, "‘±s‚·‚é‚ɂ͉½‚©ƒL[‚ð‰Ÿ‚µ‚Ä‚­‚¾‚³‚¢ ...\n" + +STRING_MOVE_HELP1, "%s ‚ðã‘‚«‚µ‚Ü‚·‚ª‚æ‚낵‚¢‚Å‚·‚© (Yes/No/All)? " + +STRING_MOVE_HELP2, "ƒtƒ@ƒCƒ‹‚ðˆÚ“®‚¨‚æ‚уtƒ@ƒCƒ‹‚ƃfƒBƒŒƒNƒgƒŠ–¼‚ð•ÏX‚µ‚Ü‚·B\n\n\ +1 ‚‚܂½‚Í•¡”‚̃tƒ@ƒCƒ‹‚ðˆÚ“®‚·‚é‚É‚Í:\n\ +MOVE [/N][ƒhƒ‰ƒCƒu:][ƒpƒX]ƒtƒ@ƒCƒ‹–¼1[,...] ˆÚ“®æ\n\n\ +ƒfƒBƒŒƒNƒgƒŠ–¼‚ð•ÏX‚·‚é‚É‚Í:\n\ +MOVE [/N][ƒhƒ‰ƒCƒu:][ƒpƒX]•ÏX‘O •ÏXŒã\n\n\ + [ƒhƒ‰ƒCƒu:][ƒpƒX]ƒtƒ@ƒCƒ‹–¼1\n\ + ˆÚ“®‚·‚éƒtƒ@ƒCƒ‹‚ÌꊂƖ¼‘O‚ðŽw’肵‚Ü‚·B\n\ + /N Nothing. ƒtƒ@ƒCƒ‹‚ƃfƒBƒŒƒNƒgƒŠ‚̈ړ®ˆÈŠO‚Ì‚·‚ׂĂðs‚¢‚Ü‚·B\n\n\ +Œ»’iŠK‚ł̧ŒÀ:\n\ + - ƒtƒ@ƒCƒ‹‚âƒfƒBƒŒƒNƒgƒŠ‚ðAˆÙ‚È‚éƒhƒ‰ƒCƒu‚ð‚Ü‚½‚ª‚Á‚Ĉړ®‚·‚邱‚Æ‚Í\n\ + ‚Å‚«‚Ü‚¹‚ñB\n" + +STRING_MSGBOX_HELP, "ƒƒbƒZ[ƒW ƒ{ƒbƒNƒX‚ð•\\Ž¦‚µAƒ†[ƒU[‚É•Ô“š‚ð‹‚ß‚Ü‚·B\n\n\ +MSGBOX ƒ^ƒCƒv ['ƒ^ƒCƒgƒ‹'] ƒƒbƒZ[ƒW\n\n\ +ƒ^ƒCƒv •\\Ž¦‚³‚ê‚éƒ{ƒ^ƒ“‚̃^ƒCƒv‚Å‚·B\n\ + ŽŸ‚Ì’l‚ªŽg—p‚Å‚«‚Ü‚·: OK, OKCANCEL,\n\ + YESNO, YESNOCANCEL\n\ +ƒ^ƒCƒgƒ‹ ƒƒbƒZ[ƒW ƒ{ƒbƒNƒX‚̃^ƒCƒgƒ‹‚Å‚·B\n\ +ƒƒbƒZ[ƒW ƒƒbƒZ[ƒW ƒ{ƒbƒNƒX‚É•\\Ž¦‚³‚ê‚郃bƒZ[ƒW‚Å‚·B\n\n\n\ +‰Ÿ‚³‚ꂽƒ{ƒ^ƒ“‚É‚æ‚èAŽŸ‚Ì ERRORLEVEL ‚ªÝ’肳‚ê‚Ü‚·:\n\n\ +YES : 10 | NO : 11\n\ +OK : 10 | CANCEL : 12\n" + +STRING_PATH_HELP1, "ŽÀs‰Â”\\ƒtƒ@ƒCƒ‹‚ÌŒŸõƒpƒX‚ð•\\Ž¦‚Ü‚½‚Íݒ肵‚Ü‚·B\n\n\ +PATH [[ƒhƒ‰ƒCƒu:]ƒpƒX[;...]]\nPATH ;\n\n\ +ƒpƒ‰ƒ[ƒ^‚Æ‚µ‚Ä ; (ƒZƒ~ƒRƒƒ“) ‚¾‚¯‚ðŽw’è‚·‚é‚ÆA‚·‚ׂĂ̌ŸõƒpƒX‚Í\n\ +ƒNƒŠƒA‚³‚ê‚ÄŒ»Ý‚̃fƒBƒŒƒNƒgƒŠ‚¾‚¯‚ªŒŸõ‚³‚ê‚Ü‚·B\n\ +ƒpƒ‰ƒ[ƒ^‚ðŽw’肹‚¸‚É PATH ‚Æ“ü—Í‚·‚é‚ÆAŒ»Ý‚̃pƒX‚ª•\\Ž¦‚³‚ê‚Ü‚·B\n" + +STRING_PROMPT_HELP1, "ƒRƒ}ƒ“ƒh ƒvƒƒ“ƒvƒg‚ð•ÏX‚µ‚Ü‚·B\n\n\ +PROMPT [•¶Žš—ñ]\n\n\ + •¶Žš—ñ V‚µ‚¢ƒRƒ}ƒ“ƒh ƒvƒƒ“ƒvƒg‚ðŽw’肵‚Ü‚·B\n\n\ +PROMPT ‚É‚Í’Êí‚Ì•¶Žš‚ÆŽŸ‚ÉŽ¦‚·“ÁŽêƒR[ƒh‚ðŽg—p‚Å‚«‚Ü‚·:\n\n\ + $A & (ƒAƒ“ƒpƒTƒ“ƒh)\n\ + $B | (ƒpƒCƒv)\n\ + $C ( (¶‚©‚Á‚±)\n\ + $D Œ»Ý‚Ì“ú•t\n\ + $E ƒGƒXƒP[ƒv ƒR[ƒh (ASCII ƒR[ƒh‚Ì 27)\n\ + $F ) (‰E‚©‚Á‚±)\n\ + $G > (•s“™† (‘å‚È‚è))\n\ + $H ƒoƒbƒNƒXƒy[ƒX (’¼‘O‚Ì•¶Žš‚ð휂µ‚Ü‚·)\n\ + $L < (•s“™† (¬‚È‚è))\n\ + $N Œ»Ý‚̃hƒ‰ƒCƒu\n\ + $P Œ»Ý‚̃hƒ‰ƒCƒu‚ƃpƒX\n\ + $Q = (“™†)\n\ + $T Œ»Ý‚ÌŽž\n\ + $V OS ‚̃o[ƒWƒ‡ƒ“”Ô†\n\ + $_ ƒLƒƒƒŠƒbƒW ƒŠƒ^[ƒ“‚ƃ‰ƒCƒ“ƒtƒB[ƒh\n\ + $$ $ (ƒhƒ‹‹L†)\n" + +STRING_PAUSE_HELP1, "ƒoƒbƒ` ƒvƒƒOƒ‰ƒ€‚̈—‚ðˆêŽž’âŽ~‚µAŽŸ‚̃ƒbƒZ[ƒW‚ð•\\Ž¦‚µ‚Ü‚·B:\n\ +'‘±s‚·‚é‚ɂ͉½‚©ƒL[‚ð‰Ÿ‚µ‚Ä‚­‚¾‚³‚¢ ...' ‚Ü‚½‚̓†[ƒU[‚ª’è‹`‚µ‚½ƒƒbƒZ[ƒWB\n\n\ +PAUSE [ƒƒbƒZ[ƒW]" + +STRING_PROMPT_HELP2, " $+ Œ»Ý‚̃fƒBƒŒƒNƒgƒŠ ƒXƒ^ƒbƒN‚Ì[‚³‚ð•\\Ž¦‚µ‚Ü‚·" + +STRING_PROMPT_HELP3, "\nƒpƒ‰ƒ[ƒ^‚ðŽw’肹‚¸‚É PROMPT ‚Æ“ü—Í‚·‚é‚ÆAƒvƒƒ“ƒvƒg‚Ìݒ肪ƒfƒtƒHƒ‹ƒg‚ɃŠƒZƒbƒg‚³‚ê‚Ü‚·B" + +STRING_REM_HELP, "ƒoƒbƒ` ƒtƒ@ƒCƒ‹‚ɃRƒƒ“ƒg (’Žß) ‚ð‹L˜^‚µ‚Ü‚·B\n\nREM [ƒRƒƒ“ƒg]" + +STRING_RMDIR_HELP, "ƒfƒBƒŒƒNƒgƒŠ‚ð휂µ‚Ü‚·B\n\n\ +RMDIR [ƒhƒ‰ƒCƒu:]ƒpƒX\nRD [ƒhƒ‰ƒCƒu:]ƒpƒX\n\ + /S Žw’肳‚ꂽƒfƒBƒŒƒNƒgƒŠ“à‚É‚ ‚éƒtƒ@ƒCƒ‹‚âƒtƒHƒ‹ƒ_‚à‚·‚ׂÄ휂µ‚Ü‚·B\n\ + /Q Šm”F‚̃ƒbƒZ[ƒW‚ð•\\Ž¦‚µ‚Ü‚¹‚ñB\n" +STRING_RMDIR_HELP2, "ƒfƒBƒŒƒNƒgƒŠ‚ª‹ó‚Å‚Í‚ ‚è‚Ü‚¹‚ñ!\n" + +STRING_REN_HELP1, "ƒtƒ@ƒCƒ‹‚âƒfƒBƒŒƒNƒgƒŠ (•¡”‰Â) ‚Ì–¼‘O‚ð•ÏX‚µ‚Ü‚·B\n\n\ +RENAME [/E /N /P /Q /S /T] Œ³‚̃tƒ@ƒCƒ‹–¼ ... Vƒtƒ@ƒCƒ‹–¼\n\ +REN [/E /N /P /Q /S /T] Œ³‚̃tƒ@ƒCƒ‹–¼ ... Vƒtƒ@ƒCƒ‹–¼\n\n\ + /E ƒGƒ‰[ƒƒbƒZ[ƒW‚ð•\\Ž¦‚µ‚Ü‚¹‚ñB\n\ + /N ‰½‚à‚µ‚Ü‚¹‚ñB\n\ + /P ƒtƒ@ƒCƒ‹‚Ì–¼‘O‚ð•ÏX‚·‚é‘O‚É‚»‚ꂼ‚êŠm”F‚ð‹‚ß‚Ü‚·B\n\ + (‚Ü‚¾ŽÀ‘•‚³‚ê‚Ä‚¢‚Ü‚¹‚ñ!)\n\ + /Q Quiet.\n\ + /S ƒTƒuƒfƒBƒŒƒNƒgƒŠ‚Ì–¼‘O‚ð•ÏX‚·‚éB\n\ + /T –¼‘O‚ð•ÏX‚µ‚½ƒtƒ@ƒCƒ‹‚Ì‘”‚ð•ñ‚·‚éB\n\n\ +Vƒtƒ@ƒCƒ‹–¼ ‚É‚ÍV‚µ‚¢ƒhƒ‰ƒCƒu‚àƒpƒX‚àŽw’è‚Å‚«‚È‚¢‚Ì‚Å’ˆÓ‚µ‚Ä‚­‚¾‚³‚¢B\n\ +‚»‚¤‚¢‚Á‚½–Ú“I‚É‚Í MOVE ƒRƒ}ƒ“ƒh‚ð—p‚¢‚Ä‚­‚¾‚³‚¢B\n" + +STRING_REN_HELP2, " %lu ŒÂ‚̃tƒ@ƒCƒ‹‚Ì–¼‘O‚ª•ÏX‚³‚ê‚Ü‚µ‚½\n" + +STRING_REN_HELP3, " %lu ŒÂ‚̃tƒ@ƒCƒ‹‚Ì–¼‘O‚ª•ÏX‚³‚ê‚Ü‚µ‚½\n" + +STRING_SHIFT_HELP, "ƒoƒbƒ` ƒtƒ@ƒCƒ‹’†‚Ì’u‚«Š·‚¦‰Â”\\‚ȃpƒ‰ƒ[ƒ^‚̈ʒu‚ð•ÏX‚µ‚Ü‚·B\n\n\ +SHIFT [DOWN]" + +STRING_SCREEN_HELP, "ƒJ[ƒ\\ƒ‹‚ðˆÚ“®‚³‚¹‚Ü‚·BˆÚ“®ŒãA•¶Žš—ñ‚ð“ü—Í‚·‚邱‚Æ‚à‚Å‚«‚Ü‚·B\n\n\ +SCREEN —ñ s [ƒeƒLƒXƒg]\n\n\ + —ñ ƒJ[ƒ\\ƒ‹‚ðˆÚ“®‚³‚¹‚é—ñ‚Å‚·B\n\ + s ƒJ[ƒ\\ƒ‹‚ðˆÚ“®‚³‚¹‚és‚Å‚·B" + +STRING_SET_HELP, "ŠÂ‹«•Ï”‚ð•\\Ž¦AÝ’èA‚Ü‚½‚Í휂µ‚Ü‚·B\n\n\ +SET [•Ï”–¼[=]•¶Žš—ñ]]\n\n\ + •Ï”–¼ ŠÂ‹«•Ï”–¼‚ðŽw’肵‚Ü‚·B\n\ + •¶Žš—ñ •Ï”‚ÉŠ„‚è“–‚Ă镶Žš—ñ‚ðŽw’肵‚Ü‚·B\n\n\ +Œ»Ý‚̊‹«•Ï”‚ð•\\Ž¦‚·‚é‚É‚ÍAƒpƒ‰ƒ[ƒ^‚ðŽw’肹‚¸‚É SET ‚Æ“ü—Í‚µ‚Ä‚­‚¾‚³‚¢B\n" + +STRING_START_HELP1, "•Ê‚̃EƒBƒ“ƒhƒE‚ð‹N“®‚µAŽw’肵‚½ƒvƒƒOƒ‰ƒ€‚Ü‚½‚̓Rƒ}ƒ“ƒh‚ðŽÀs‚µ‚Ü‚·B\n\n\ +START ƒRƒ}ƒ“ƒh\n\n\ + ƒRƒ}ƒ“ƒh ŽÀs‚·‚éƒRƒ}ƒ“ƒh‚ðŽw’肵‚Ü‚·B\n\n\ +Œ»Žž“_‚Å‚ÍAƒRƒ}ƒ“ƒh‚Í‚·‚ׂē¯Šú‚¹‚¸‚ÉŠJŽn‚³‚ê‚Ü‚·B\n" + +STRING_TITLE_HELP, "ƒRƒ}ƒ“ƒh ƒvƒƒ“ƒvƒg ƒEƒBƒ“ƒhƒE‚̃EƒBƒ“ƒhƒE ƒ^ƒCƒgƒ‹‚ðݒ肵‚Ü‚·B\n\n\ +TITLE [•¶Žš—ñ]\n\n\ +•¶Žš—ñ ƒRƒ}ƒ“ƒh ƒvƒƒ“ƒvƒg ƒEƒBƒ“ƒhƒE‚̃^ƒCƒgƒ‹‚ðŽw’肵‚Ü‚·B\n" + +STRING_TIME_HELP1, "ƒVƒXƒeƒ€Žž‚ð•\\Ž¦‚Ü‚½‚Íݒ肵‚Ü‚·B\n\n\ +TIME [/T][Žž]\n\n\ + /T Œ»ÝŽž‚Ì•\\Ž¦‚Ì‚Ýs‚¢‚Ü‚·B\n\n\ +ƒpƒ‰ƒ[ƒ^‚ÌŽw’肪‚È‚¯‚ê‚ÎAŒ»Ý‚Ìݒ肪•\\Ž¦‚³‚êAV‚µ‚¢Žž‚ð“ü—Í‚Å‚«‚é\n\ +ƒvƒƒ“ƒvƒg‚É‚È‚è‚Ü‚·B•ÏX‚µ‚È‚¢ê‡‚ÍAEnter ƒL[‚ð‰Ÿ‚µ‚Ä‚­‚¾‚³‚¢B\n" + +STRING_TIME_HELP2, "V‚µ‚¢Žž‚ð“ü—Í‚µ‚Ä‚­‚¾‚³‚¢: " + +STRING_TIMER_HELP1, "%d ƒ~ƒŠ•b‚ªŒo‰ßB\n" + +STRING_TIMER_HELP2, "%02d%c%02d%c%02d%c%02d ‚ªŒo‰ßB\n" + +STRING_TIMER_HELP3, "10 ŒÂ‚܂ł̃XƒgƒbƒvƒEƒHƒbƒ`‚ðŽg‚¤‚±‚Æ‚ª‚Å‚«‚Ü‚·B\n\n\ +TIMER [ON|OFF] [/S] [/n] [/Fn]\n\n\ + ON ƒXƒgƒbƒvƒEƒHƒbƒ`‚ð ON ‚É‚µ‚Ü‚·B\n\ + OFF ƒXƒgƒbƒvƒEƒHƒbƒ`‚ð OFF ‚É‚µ‚Ü‚·B\n\ + /S Split time. ƒXƒgƒbƒvƒEƒHƒbƒ`‚Ì’l‚ð•ÏX‚·‚邱‚Æ‚È‚­A\n\ + Œ»Ý‚ñ‚Å‚¢‚鎞ŠÔ‚ð•\\Ž¦‚µ‚Ü‚·B\n\ + /n ƒXƒgƒbƒvƒEƒHƒbƒ`”Ô†‚ðŽw’肵‚Ü‚·B\n\ + ƒXƒgƒbƒvƒEƒHƒbƒ`‚Í 0 ‚©‚ç 9 ‚Ü‚Å‚ª—˜—p‚Å‚«‚Ü‚·B\n\ + Žw’肵‚È‚¢ê‡AƒfƒtƒHƒ‹ƒg‚Æ‚µ‚Ä 1 ‚ðŽg‚¢‚Ü‚·B\n\ + /Fn o—Í‚Ì‘Ž®\n\ + n ‚É‚ÍŽŸ‚Ì“ñ‚‚̒l‚ð—p‚¢‚邱‚Æ‚ª‚Å‚«‚Ü‚·:\n\ + 0 ƒ~ƒŠ•b\n\ + 1 hh%cmm%css%cdd\n\n\ +ONAOFFA/S ‚Ì‚¢‚¸‚ê‚àŽw’肵‚È‚©‚Á‚½ê‡‚É‚ÍAƒXƒgƒbƒvƒEƒHƒbƒ`‚Ì\n\ +ó‘Ô‚ðØ‚è‘Ö‚¦‚Ü‚·B\n\n" + +STRING_TYPE_HELP1, "ƒeƒLƒXƒg ƒtƒ@ƒCƒ‹‚Ü‚½‚̓tƒ@ƒCƒ‹‚Ì“à—e‚ð•\\Ž¦‚µ‚Ü‚·B\n\nTYPE [ƒhƒ‰ƒCƒu:][ƒpƒX]ƒtƒ@ƒCƒ‹–¼ \n\ + /P 1 “x‚É 1 ‰æ–Ê‚¸‚•\\Ž¦‚µ‚Ü‚·B\n" + +STRING_VERIFY_HELP1, "‚±‚̃Rƒ}ƒ“ƒh‚̓_ƒ~[‚Å‚·!!\n\ +ƒtƒ@ƒCƒ‹‚ªƒfƒBƒXƒN‚ɳ‚µ‚­‘‚«ž‚܂ꂽ‚±‚Æ‚ðƇ‚·‚é‚©‚Ç‚¤‚©‚ðŽwŽ¦‚µ‚Ü‚·B\n\n\ +VERIFY [ON | OFF]\n\n\ +Œ»Ý‚ÌÝ’è‚ð•\\Ž¦‚·‚é‚Æ‚«‚ÍAƒpƒ‰ƒ[ƒ^‚ðŽw’肹‚¸‚É VERIFY ‚Æ“ü—Í‚µ‚Ä‚­‚¾‚³‚¢B\n" + +STRING_VERIFY_HELP2, "VERIFY ‚Í %s ‚Å‚·B\n" + +STRING_VERIFY_HELP3, "ON ‚© OFF ‚Ì‚Ç‚¿‚ç‚©‚ðŽw’肵‚Ä‚­‚¾‚³‚¢B" + +STRING_VERSION_HELP1, "ƒVƒFƒ‹‚̃o[ƒWƒ‡ƒ“î•ñ‚ð•\\Ž¦‚µ‚Ü‚·B\n\n\ +VER [/C][/R][/W]\n\n\ + /C ƒNƒŒƒWƒbƒg‚ð•\\Ž¦‚µ‚Ü‚·B\n\ + /R Ä”z•z‚ÉŠÖ‚·‚éî•ñ‚ð•\\Ž¦‚µ‚Ü‚·B\n\ + /W •ÛØ‚ÉŠÖ‚·‚éî•ñ‚ð•\\Ž¦‚µ‚Ü‚·B" + +STRING_VERSION_HELP2, " ‚Í *‘S‚­‚Ì–³•ÛØ* ‚Å’ñ‹Ÿ‚³‚ê‚Ü‚·BÚ‚µ‚­‚Í\n\ +'ver /w' ‚ƃ^ƒCƒv‚µ‚ĉº‚³‚¢B‚±‚ê‚̓tƒŠ[ƒ\\ƒtƒgƒEƒFƒA‚Å‚ ‚èA‚ ‚éðŒ‚̉º‚Å\n\ +ĔЕz‚·‚邱‚Æ‚ª§—コ‚ê‚Ä‚¢‚Ü‚·BÚ‚µ‚­‚Í 'ver /r' ‚ƃ^ƒCƒv‚µ‚ĉº‚³‚¢B\n\ +ƒNƒŒƒWƒbƒg‚̈ꗗ‚ðŒ©‚é‚É‚Í 'ver /c' ‚ƃ^ƒCƒv‚µ‚ĉº‚³‚¢B" + +STRING_VERSION_HELP3, "\n ‚±‚̃vƒƒOƒ‰ƒ€‚Í—L—p‚Å‚ ‚邱‚Æ‚ðŠè‚Á‚ĔЕz‚³‚ê‚Ü‚·‚ªA*‘S‚­‚Ì–³•ÛØ*\n\ + ‚Å‚·B¤‹Æ‰Â”\\«‚Ì•ÛØ‚â“Á’è‚Ì–Ú“I‚Ö‚Ì“K‡«‚ÍAŒ¾ŠO‚ÉŽ¦‚³‚ꂽ‚à‚Ì‚àŠÜ\n\ + ‚ß‘S‚­‘¶Ý‚µ‚Ü‚¹‚ñBÚ‚µ‚­‚Í GNU General Public License ‚ð‚²——‚­‚¾‚³‚¢B" + +STRING_VERSION_HELP4, "\n ‚±‚̃vƒƒOƒ‰ƒ€‚̓tƒŠ[ƒ\\ƒtƒgƒEƒFƒA‚Å‚·B‚ ‚È‚½‚Í‚±‚ê‚ðAƒtƒŠ[ƒ\\ƒtƒgƒEƒF\n\ + ƒAà’c‚É‚æ‚Á‚Ä”­s‚³‚ꂽ GNU General Public License (ƒo[ƒWƒ‡ƒ“ 2 ‚©A\n\ + Šó–]‚É‚æ‚Á‚Ä‚Í‚»‚êˆÈ~‚̃o[ƒWƒ‡ƒ“‚Ì‚¤‚¿‚Ç‚ê‚©) ‚Ì’è‚ß‚éðŒ‚̉º‚ÅÄ”Ð\n\ + •z‚Ü‚½‚͉ü•Ï‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚·B\n" + +STRING_VERSION_HELP5, "\nƒoƒO•ñ‚Í ‚Ö‘—‚Á‚Ä‚­‚¾‚³‚¢B\n\ +ÅV‚̃o[ƒWƒ‡ƒ“‚ÍŽŸ‚̃y[ƒW‚©‚ç“üŽè‚Å‚«‚Ü‚·: http://www.reactos.org" + +STRING_VERSION_HELP6, "\nFreeDOS version written by:\n" + +STRING_VERSION_HELP7, "\nReactOS version written by:\n" + +STRING_VOL_HELP1, " ƒhƒ‰ƒCƒu %c: ‚̃{ƒŠƒ…[ƒ€ ƒ‰ƒxƒ‹‚Í %s ‚Å‚·B\n" +STRING_VOL_HELP2, " ƒhƒ‰ƒCƒu %c: ‚ɂ̓{ƒŠƒ…[ƒ€ ƒ‰ƒxƒ‹‚ª‚ ‚è‚Ü‚¹‚ñB\n" +STRING_VOL_HELP3, " ƒ{ƒŠƒ…[ƒ€ ƒVƒŠƒAƒ‹”Ô†‚Í %04X-%04X ‚Å‚·B\n" +STRING_VOL_HELP4, "‘¶Ý‚·‚é‚È‚ç‚ÎAƒfƒBƒXƒN‚̃{ƒŠƒ…[ƒ€ ƒ‰ƒxƒ‹‚ƃVƒŠƒAƒ‹”Ô†‚ð•\\Ž¦‚µ‚Ü‚·B\n\nVOL [ƒhƒ‰ƒCƒu:]" + +STRING_WINDOW_HELP1, "ƒRƒ“ƒ\\[ƒ‹ ƒEƒBƒ“ƒhƒE‚ÌŠOŒ©‚ð•ÏX‚µ‚Ü‚·B\n\n\ +WINDOW [/POS[=]¶,ã,•,‚‚³]\n\ + [MIN|MAX|RESTORE] ['title']\n\n\ +/POS ƒEƒBƒ“ƒhƒE‚̈ʒu‚Æ‘å‚«‚³‚ðŽw’肵‚Ü‚·B\n\ +MIN ƒEƒBƒ“ƒhƒE‚ðŬ‰»‚µ‚Ü‚·B\n\ +MAX ƒEƒBƒ“ƒhƒE‚ðő剻‚µ‚Ü‚·B\n\ +RESTORE ƒEƒBƒ“ƒhƒE‚ðŒ³‚ÌƒTƒCƒY‚É–ß‚µ‚Ü‚·B" + +STRING_WINDOW_HELP2, "ƒRƒ“ƒ\\[ƒ‹ ƒEƒBƒ“ƒhƒE‚ÌŠOŒ©‚ð•ÏX‚µ‚Ü‚·B\n\n\ +ACTIVATE 'ƒEƒBƒ“ƒhƒE' [/POS[=]¶,ã,•,‚‚³]\n\ + [MIN|MAX|RESTORE] ['ƒ^ƒCƒgƒ‹']\n\n\ +ƒEƒBƒ“ƒhƒE ŠOŒ©‚ð•ÏX‚·‚éƒEƒBƒ“ƒhƒE‚̃^ƒCƒgƒ‹‚Å‚·B\n\ +/POS ƒEƒBƒ“ƒhƒE‚̈ʒu‚Æ‘å‚«‚³‚ðŽw’肵‚Ü‚·B\n\ +MIN ƒEƒBƒ“ƒhƒE‚ðŬ‰»‚µ‚Ü‚·B\n\ +MAX ƒEƒBƒ“ƒhƒE‚ðő剻‚µ‚Ü‚·B\n\ +RESTORE ƒEƒBƒ“ƒhƒE‚ðŒ³‚ÌƒTƒCƒY‚É–ß‚µ‚Ü‚·B\n\ +ƒ^ƒCƒgƒ‹ V‚µ‚¢ƒ^ƒCƒgƒ‹‚Å‚·B\n" + + +STRING_HELP1, "—˜—p‰Â”\\‚È‚·‚ׂẴRƒ}ƒ“ƒh‚̈ꗗ‚ÆA‚»‚Ìà–¾B\n\n\ + ƒRƒ}ƒ“ƒh /? “Á’è‚̃Rƒ}ƒ“ƒh‚ÉŠÖ‚·‚éÚ×î•ñ\n\n\ +? —˜—p‰Â”\\‚È‚·‚ׂẴRƒ}ƒ“ƒh‚̈ꗗ (à–¾‚È‚µ)B\n\ +ALIAS ƒGƒCƒŠƒAƒX‚ÌÝ’è‚â‰ðœ‚ð‚µ‚½‚èAƒGƒCƒŠƒAƒX‚ð•\\Ž¦‚µ‚½‚肵‚Ü‚·B\n\ +ATTRIB ƒtƒ@ƒCƒ‹‘®«‚ð•\\Ž¦‚Ü‚½‚Í•ÏX‚µ‚Ü‚·B\n\ +BEEP ƒXƒs[ƒJ‚©‚çƒr[ƒv‰¹‚ð–‚炵‚Ü‚·B\n\ +CALL ƒoƒbƒ` ƒvƒƒOƒ‰ƒ€‚ð•Ê‚̃oƒbƒ` ƒvƒƒOƒ‰ƒ€‚©‚çŒÄ‚Ño‚µ‚Ü‚·B\n\ +CD Œ»Ý‚̃fƒBƒŒƒNƒgƒŠ‚ð•ÏX‚µ‚½‚èAƒfƒBƒŒƒNƒgƒŠ–¼‚ð•\\Ž¦‚µ‚½‚肵‚Ü‚·B\n\ +CHCP Œ»Ý‚̃R[ƒh ƒy[ƒW”Ô†‚ð•\\Ž¦‚Ü‚½‚Íݒ肵‚Ü‚·B\n\ +CHOICE ƒ†[ƒU[‚ª‘I‘ðŽˆ‚©‚çˆê‚‚ð‘I‘ð‚·‚é‚Ì‚ð‘Ò‚¿‚Ü‚·B\n\ +CLS ‰æ–Ê‚ðÁ‹Ž‚µ‚Ü‚·B\n\ +CMD ReactOS ƒRƒ}ƒ“ƒh ƒCƒ“ƒ^[ƒvƒŠƒ^‚ÌV‚µ‚¢ƒCƒ“ƒXƒ^ƒ“ƒX‚ðŠJŽn‚µ‚Ü‚·B\n\ +COLOR ƒRƒ“ƒ\\[ƒ‹‚̃fƒtƒHƒ‹ƒg‚Ì‘OŒiF‚¨‚æ‚Ñ”wŒiF‚ðݒ肵‚Ü‚·B\n\ +COPY 1 ‚‚܂½‚Í•¡”‚̃tƒ@ƒCƒ‹‚ð•Ê‚ÌꊂɃRƒs[‚µ‚Ü‚·B\n\ +DATE “ú•t‚ð•\\Ž¦‚Ü‚½‚Íݒ肵‚Ü‚·B\n\ +DELAY n •bA‚Ü‚½‚Í n ƒ~ƒŠ•b‘Ò‹@‚µ‚Ü‚·B\n\ +DELETE 1 ‚‚܂½‚Í•¡”‚̃tƒ@ƒCƒ‹‚ð휂µ‚Ü‚·B\n\ +DIR ƒfƒBƒŒƒNƒgƒŠ’†‚̃tƒ@ƒCƒ‹‚ƃTƒuƒfƒBƒŒƒNƒgƒŠ‚ðˆê——•\\Ž¦‚µ‚Ü‚·B\n\ +ECHO ƒƒbƒZ[ƒW‚ð•\\Ž¦‚µ‚½‚èAƒRƒ}ƒ“ƒh ƒGƒR[‚Ì ON ‚Æ OFF ‚ðØ‚è‘Ö‚¦‚Ü‚·B\n\ +ERASE 1 ‚‚܂½‚Í•¡”‚̃tƒ@ƒCƒ‹‚ð휂µ‚Ü‚·B\n\ +EXIT CMD.exe (ƒRƒ}ƒ“ƒh ƒ‰ƒCƒ“ ƒCƒ“ƒ^[ƒvƒŠƒ^) ‚ðI—¹‚µ‚Ü‚·B\n\ +FOR Žw’肳‚ꂽƒRƒ}ƒ“ƒh‚ðƒtƒ@ƒCƒ‹ ƒZƒbƒg‚ÌŠeƒtƒ@ƒCƒ‹‚ɑ΂µ‚ÄŽÀs‚µ‚Ü‚·B\n\ +FREE ƒfƒBƒXƒN‚Ì‹ó‚«—e—Ê\n\ +GOTO ƒoƒbƒ` ƒvƒƒOƒ‰ƒ€“à‚ÌAƒ‰ƒxƒ‹‚ÅŽw’肳‚ê‚Ä‚¢‚és‚Ö§Œä‚ðˆÚ“®‚µ‚Ü‚·B\n\ +HELP ReactOS ƒRƒ}ƒ“ƒh‚̃wƒ‹ƒvî•ñ‚ð’ñ‹Ÿ‚µ‚Ü‚·B\n\ +HISTORY Žg—p‚³‚ꂽ‚·‚ׂẴRƒ}ƒ“ƒh‚ðˆê——•\\Ž¦‚µ‚Ü‚·B\n\ +IF ƒoƒbƒ` ƒvƒƒOƒ‰ƒ€’†‚ÅðŒˆ—‚ðŽÀs‚µ‚Ü‚·B\n\ +LABEL ƒfƒBƒXƒN‚̃{ƒŠƒ…[ƒ€ ƒ‰ƒxƒ‹‚ð•\\Ž¦‚Ü‚½‚Í•ÏX‚µ‚Ü‚·B\n\ +MD ƒfƒBƒŒƒNƒgƒŠ‚ð쬂µ‚Ü‚·B\n\ +MKDIR ƒfƒBƒŒƒNƒgƒŠ‚ð쬂µ‚Ü‚·B\n\ +MOVE ƒtƒ@ƒCƒ‹‚ðˆÚ“®‚¨‚æ‚уtƒ@ƒCƒ‹‚ƃfƒBƒŒƒNƒgƒŠ–¼‚ð•ÏX‚µ‚Ü‚·B\n\ +PATH ŽÀs‰Â”\\ƒtƒ@ƒCƒ‹‚ÌŒŸõƒpƒX‚ð•\\Ž¦‚Ü‚½‚Íݒ肵‚Ü‚·B\n\ +PAUSE ƒoƒbƒ` ƒvƒƒOƒ‰ƒ€‚̈—‚ðˆêŽž’âŽ~‚µAƒƒbƒZ[ƒW‚ð•\\Ž¦‚µ‚Ü‚·B\n\ +POPD Œ»Ý‚̃fƒBƒŒƒNƒgƒŠ‚ð PUSHD ƒRƒ}ƒ“ƒh‚Å‹L‰¯‚³‚ꂽƒfƒBƒŒƒNƒgƒŠ‚É\n\ + •ÏX‚µ‚Ü‚·B\n\ +PROMPT ƒRƒ}ƒ“ƒh ƒvƒƒ“ƒvƒg‚ð•ÏX‚µ‚Ü‚·B\n\ +PUSHD Œ»Ý‚̃fƒBƒŒƒNƒgƒŠ‚ð•Û‘¶‚µAŽw’肵‚½ƒfƒBƒŒƒNƒgƒŠ‚É•ÏX‚µ‚Ü‚·B\n\ +RD ƒfƒBƒŒƒNƒgƒŠ‚ð휂µ‚Ü‚·B\n\ +REM ƒoƒbƒ` ƒtƒ@ƒCƒ‹‚ɃRƒƒ“ƒg (’Žß) ‚ð‹L˜^‚µ‚Ü‚·B\n\ +REN 1 ‚‚܂½‚Í•¡”‚̃tƒ@ƒCƒ‹‚Ì–¼‘O‚ð•ÏX‚µ‚Ü‚·B\n\ +RENAME 1 ‚‚܂½‚Í•¡”‚̃tƒ@ƒCƒ‹‚Ì–¼‘O‚ð•ÏX‚µ‚Ü‚·B\n\ +RMDIR ƒfƒBƒŒƒNƒgƒŠ‚ð휂µ‚Ü‚·B\n\ +SCREEN ƒJ[ƒ\\ƒ‹‚ðˆÚ“®‚³‚¹‚Ü‚·BˆÚ“®ŒãA•¶Žš—ñ‚ð“ü—Í‚·‚邱‚Æ‚à‚Å‚«‚Ü‚·B\n\ +SET ŠÂ‹«•Ï”‚ð•\\Ž¦AÝ’èA‚Ü‚½‚Í휂µ‚Ü‚·B\n\ +SHIFT ƒJ[ƒ\\ƒ‹‚ðˆÚ“®‚³‚¹‚Ü‚·BˆÚ“®ŒãA•¶Žš—ñ‚ð“ü—Í‚·‚邱‚Æ‚à‚Å‚«‚Ü‚·B\n" +STRING_HELP2, "START •Ê‚̃EƒBƒ“ƒhƒE‚ð‹N“®‚µAŽw’肵‚½ƒvƒƒOƒ‰ƒ€‚Ü‚½‚̓Rƒ}ƒ“ƒh‚ðŽÀs‚µ‚Ü‚·B\n\ +TIME ƒVƒXƒeƒ€Žž‚ð•\\Ž¦‚Ü‚½‚Íݒ肵‚Ü‚·B\n\ +TIMER 10 ŒÂ‚܂ł̃XƒgƒbƒvƒEƒHƒbƒ`‚ðŽg‚¤‚±‚Æ‚ª‚Å‚«‚Ü‚·B\n\ +TITLE ƒRƒ}ƒ“ƒh ƒvƒƒ“ƒvƒg ƒEƒBƒ“ƒhƒE‚̃EƒBƒ“ƒhƒE ƒ^ƒCƒgƒ‹‚ðݒ肵‚Ü‚·B\n\ +TYPE ƒeƒLƒXƒg ƒtƒ@ƒCƒ‹‚Ü‚½‚̓tƒ@ƒCƒ‹‚Ì“à—e‚ð•\\Ž¦‚µ‚Ü‚·B\n\ +VER ReactOS ‚̃o[ƒWƒ‡ƒ“‚ð•\\Ž¦‚µ‚Ü‚·B\n\ +VERIFY ƒtƒ@ƒCƒ‹‚ªƒfƒBƒXƒN‚ɳ‚µ‚­‘‚«ž‚܂ꂽ‚±‚Æ‚ðƇ‚·‚é‚©‚Ç‚¤‚©‚ð\n\ + ŽwŽ¦‚µ‚Ü‚·B\n\ +VOL ƒfƒBƒXƒN‚̃{ƒŠƒ…[ƒ€ ƒ‰ƒxƒ‹‚ƃVƒŠƒAƒ‹”Ô†‚ð•\\Ž¦‚µ‚Ü‚·B\n" + + +STRING_CHOICE_OPTION, "YN" +STRING_COPY_OPTION, "YNA" + + +STRING_ALIAS_ERROR, "ƒGƒCƒŠƒAƒX“WŠJŒã‚̃Rƒ}ƒ“ƒh ƒ‰ƒCƒ“‚ª’·‚·‚¬‚Ü‚·!\n" +STRING_BATCH_ERROR, "ƒoƒbƒ` ƒtƒ@ƒCƒ‹‚ðŠJ‚­‚Æ‚«‚ɃGƒ‰[‚ª”­¶‚µ‚Ü‚µ‚½B\n" +STRING_CHCP_ERROR1, "Œ»Ý‚̃R[ƒh ƒy[ƒW: %u\n" +STRING_CHCP_ERROR4, "–³Œø‚ȃR[ƒh ƒy[ƒW‚Å‚·\n" +STRING_CHOICE_ERROR, "–³Œø‚ȃIƒvƒVƒ‡ƒ“‚Å‚·BŠú‘Ò‚³‚ê‚é‘Ž®: /C[:]ƒIƒvƒVƒ‡ƒ“" +STRING_CHOICE_ERROR_TXT, "–³Œø‚ȃIƒvƒVƒ‡ƒ“‚Å‚·BŠú‘Ò‚³‚ê‚é‘Ž®: /T[:]c,nn" +STRING_CHOICE_ERROR_OPTION, "–³Œø‚ȃIƒvƒVƒ‡ƒ“‚Å‚·: %s" +STRING_CMD_ERROR1, "ƒtƒ@ƒCƒ‹ %s ‚©‚烊ƒ_ƒCƒŒƒNƒg“ü—Í‚Å‚«‚Ü‚¹‚ñB\n" +STRING_CMD_ERROR2, "ƒf[ƒ^‚ðƒpƒCƒv‚·‚邽‚߂̈ꎞƒtƒ@ƒCƒ‹ì¬‚Ì‚Æ‚«‚ɃGƒ‰[‚ª”­¶‚µ‚Ü‚µ‚½B\n" +STRING_CMD_ERROR3, "ƒtƒ@ƒCƒ‹ %s ‚ւƃŠƒ_ƒCƒŒƒNƒg‚Å‚«‚Ü‚¹‚ñB\n" +STRING_CMD_ERROR4, "%s ‚ðŽÀs‚µ‚Ä‚¢‚Ü‚·...\n" +STRING_CMD_ERROR5, "cmdexit.bat ‚ðŽÀs‚µ‚Ä‚¢‚Ü‚·...\n" +STRING_COLOR_ERROR1, "ƒGƒ‰[! “¯‚¶F‚ªŽw’肳‚ê‚Ü‚µ‚½B\n (‘OŒiF‚Æ”wŒiF‚𓯂¶F‚É‚·‚邱‚Æ‚Í‚Å‚«‚Ü‚¹‚ñ)" +STRING_COLOR_ERROR2, "F‚ÌŽw’è‚É–â‘肪‚ ‚è‚Ü‚·B" +STRING_COLOR_ERROR3, "Color %x\n" +STRING_COLOR_ERROR4, "ƒGƒ‰[! “¯‚¶F‚ªŽw’肳‚ê‚Ü‚µ‚½B" +STRING_CONSOLE_ERROR, "•s–¾‚ȃGƒ‰[: %d\n" +STRING_COPY_ERROR1, "ƒGƒ‰[: Œ³‚̃tƒ@ƒCƒ‹ %s ‚ðŠJ‚¯‚Ü‚¹‚ñ!\n" +STRING_COPY_ERROR2, "ƒGƒ‰[: ƒRƒs[Œ³‚ƃRƒs[悪ˆê‚Å‚·!\n" +STRING_COPY_ERROR3, "Žw’èæ‚Ö‚Ì‘‚«ž‚݂ŃGƒ‰[‚ª”­¶‚µ‚Ü‚µ‚½!\n" +STRING_COPY_ERROR4, "ƒGƒ‰[: ‚Ü‚¾ŽÀ‘•‚³‚ê‚Ä‚¢‚Ü‚¹‚ñ!\n" +STRING_DATE_ERROR, "–³Œø‚È“ú•t‚Å‚·B" +STRING_DEL_ERROR5, "ƒtƒ@ƒCƒ‹ %s ‚Í휂³‚ê‚Ü‚·! " +STRING_DEL_ERROR6, "‚æ‚낵‚¢‚Å‚·‚© (Y/N)?" +STRING_DEL_ERROR7, "휂µ‚Ä‚¢‚Ü‚·: %s\n" +STRING_ERROR_ERROR1, "•s–¾‚ȃGƒ‰[‚Å‚·! ƒGƒ‰[ ƒR[ƒh: 0x%lx\n" +STRING_ERROR_ERROR2, "\\•¶ƒGƒ‰[" +STRING_FOR_ERROR1, "–½—ß•¶’†‚É 'in' ‚ª•s‘«‚µ‚Ä‚¢‚Ü‚·B" +STRING_FOR_ERROR2, "Š‡ŒÊ‚ªŒ©‚‚©‚è‚Ü‚¹‚ñB" +STRING_FOR_ERROR3, "'do' ‚ª•s‘«‚µ‚Ä‚¢‚Ü‚·B" +STRING_FOR_ERROR4, "'do' ‚ÌŒã‚ɃRƒ}ƒ“ƒh‚ª‚ ‚è‚Ü‚¹‚ñB" +STRING_FREE_ERROR1, "–³Œø‚ȃhƒ‰ƒCƒu‚Å‚·B" +STRING_FREE_ERROR2, "ƒ‰ƒxƒ‹‚ª‚ ‚è‚Ü‚¹‚ñB" +STRING_GOTO_ERROR1, "GOTO ‚Ƀ‰ƒxƒ‹‚ªŽw’肳‚ê‚Ä‚¢‚Ü‚¹‚ñB" +STRING_GOTO_ERROR2, "ƒ‰ƒxƒ‹ '%s' ‚ªŒ©‚‚©‚è‚Ü‚¹‚ñ‚Å‚µ‚½B\n" + +STRING_MD_ERROR, "‚·‚łɃfƒBƒŒƒNƒgƒŠ“à‚ɃTƒuƒfƒBƒŒƒNƒgƒŠ‚©ƒtƒ@ƒCƒ‹‚ª‘¶Ý‚µ‚Ä‚¢‚Ü‚·B\n" +STRING_MD_ERROR2, "V‚µ‚¢ƒtƒHƒ‹ƒ_‚ւ̃pƒX‚ª‘¶Ý‚µ‚Ä‚¢‚Ü‚¹‚ñB\n" +STRING_MOVE_ERROR1, "[OK]\n" +STRING_MOVE_ERROR2, "[ƒGƒ‰[]\n" + +STRING_REN_ERROR1, "MoveFile() failed. ƒGƒ‰[: %lu\n" + +STRING_START_ERROR1, "Œ»Žž“_‚ł̓oƒbƒ`‚̓Tƒ|[ƒg‚³‚ê‚Ä‚¢‚Ü‚¹‚ñ!" + +STRING_TIME_ERROR1, "–³Œø‚ÈŽž‚Å‚·B" + +STRING_TYPE_ERROR1, "'/%s' ‚Í–³Œø‚ȃIƒvƒVƒ‡ƒ“‚Å‚·\n" + +STRING_WINDOW_ERROR1, "ƒEƒBƒ“ƒhƒE‚ªŒ©‚‚©‚è‚Ü‚¹‚ñB" + + +STRING_ERROR_PARAMETERF_ERROR, "ƒpƒ‰ƒ[ƒ^‚Ì‘Ž®‚ªŠÔˆá‚Á‚Ä‚¢‚Ü‚·B - %c\n" +STRING_ERROR_INVALID_SWITCH, "–³Œø‚ȃXƒCƒbƒ`‚Å‚·B - /%c\n" +STRING_ERROR_TOO_MANY_PARAMETERS, "ƒpƒ‰ƒ[ƒ^‚ª‘½‚·‚¬‚Ü‚·B - %s\n" +STRING_ERROR_PATH_NOT_FOUND, "ƒpƒX‚ªŒ©‚‚©‚è‚Ü‚¹‚ñB\n" +STRING_ERROR_FILE_NOT_FOUND, "ƒtƒ@ƒCƒ‹‚ªŒ©‚‚©‚è‚Ü‚¹‚ñB\n" +STRING_ERROR_REQ_PARAM_MISSING, "•K—v‚ȃpƒ‰ƒ[ƒ^‚ª•s‘«‚µ‚Ä‚¢‚Ü‚·B\n" +STRING_ERROR_INVALID_DRIVE, "–³Œø‚ȃhƒ‰ƒCƒuŽw’è‚Å‚·B\n" +STRING_ERROR_INVALID_PARAM_FORMAT, "–³Œø‚ȃpƒ‰ƒ[ƒ^‚Ì‘Ž®‚Å‚·B - %s\n" +STRING_ERROR_BADCOMMAND, "ƒRƒ}ƒ“ƒh‚Ü‚½‚̓tƒ@ƒCƒ‹–¼‚ªŠÔˆá‚Á‚Ä‚¢‚Ü‚·B\n" +STRING_ERROR_OUT_OF_MEMORY, "ƒƒ‚ƒŠ•s‘«ƒGƒ‰[B\n" +STRING_ERROR_CANNOTPIPE, "ƒGƒ‰[! ƒpƒCƒv‚Å‚«‚Ü‚¹‚ñ! ˆêŽžƒtƒ@ƒCƒ‹‚ðŠJ‚¯‚Ü‚¹‚ñ!\n" +STRING_ERROR_D_PAUSEMSG, "‘±s‚·‚é‚ɂ͉½‚©ƒL[‚ð‰Ÿ‚µ‚Ä‚­‚¾‚³‚¢ . . ." +STRING_ERROR_DRIVER_NOT_READY, "ƒhƒ‰ƒCƒu‚Ì€”õ‚ª‚Å‚«‚Ä‚¢‚Ü‚¹‚ñB" + +STRING_PATH_ERROR, "CMD: Not in environment '%s'\n" + +STRING_CMD_SHELLINFO, "\nReactOS Command Line Interpreter" +STRING_VERSION_RUNVER, " running on %s" +STRING_COPY_FILE , " %d ŒÂ‚̃tƒ@ƒCƒ‹‚ªƒRƒs[‚³‚ê‚Ü‚µ‚½\n" +STRING_DELETE_WIPE, "Š®‘S‚ÉÁ‹Ž‚³‚ê‚Ü‚µ‚½B" +STRING_FOR_ERROR, "–³Œø‚È•Ï”‚ªŽw’肳‚ê‚Ü‚µ‚½B" +STRING_SCREEN_COL, "s‚Ì’l‚ª–³Œø‚Å‚·B" +STRING_SCREEN_ROW, "—ñ‚Ì’l‚ª–³Œø‚Å‚·B" +STRING_TIMER_TIME "ƒ^ƒCƒ}[ %d ‚Í %s ‚Å‚·B: " + +STRING_INVALID_OPERAND, "–³Œø‚ȃIƒyƒ‰ƒ“ƒh‚Å‚·B" +STRING_EXPECTED_CLOSE_PAREN, "Expected ')'" +STRING_EXPECTED_NUMBER_OR_VARIABLE,"Expected number or variable name." +STRING_SYNTAX_COMMAND_INCORRECT, "ƒRƒ}ƒ“ƒh‚Ì\\•¶‚ªŠÔˆá‚Á‚Ä‚¢‚Ü‚·B" + +} diff --git a/reactos/base/shell/cmd/Ru.rc b/reactos/base/shell/cmd/Ru.rc new file mode 100644 index 00000000000..a4645b971fc --- /dev/null +++ b/reactos/base/shell/cmd/Ru.rc @@ -0,0 +1,656 @@ +#include "windows.h" +#include "resource.h" +/* + * Russian language file by + * Andrey Korotaev (unC0Rr@inbox.ru) + * and + * Aleksey Bragin (aleksey@reactos.com) + * Copyright 2005 + */ + + +LANGUAGE LANG_RUSSIAN, SUBLANG_NEUTRAL +STRINGTABLE DISCARDABLE +{ + +STRING_ATTRIB_HELP, "Âûâîä è èçìåíåíèå àòðèáóòîâ ôàéëîâ.\n\n\ +ATTRIB [+R | -R] [+A | -A] [+S | -S] [+H | -H] ôàéë ...\n\ + [/S [/D]]\n\n\ + + Óñòàíîâêà àòðèáóòà.\n\ + - Ñíÿòèå àòðèáóòà.\n\ + R Àòðèáóò ""Òîëüêî ÷òåíèå"".\n\ + A Àòðèáóò ""Àðõèâíûé"".\n\ + S Àòðèáóò ""Ñèñòåìíûé"".\n\ + H Àòðèáóò ""Ñêðûòûé"".\n\ + /S Îáðàáîòêà ôàéëîâ ñ óêàçàííûìè èìåíàìè â òåêóùåé ïàïêå\n\ +è âî âñåõ åå ïîäïàïêàõ.\n\ + /D Îáðàáîòêà è ôàéëîâ, è ïàïîê.\n\n\ +ATTRIB áåç ïàðàìåòðîâ âûâîäèò àòðèáóòû âñåõ ôàéëîâ.\n" + +STRING_ALIAS_HELP, "Âûâîä, óñòàíîâêà èëè óäàëåíèå ïñåâäîíèìîâ.\n\n\ +ALIAS [ïñåâäîíèì=[êîìàíäà]]\n\n\ + ïñåâäîíèì Íàèìåíîâàíèå ïñåâäîíèìà.\n\ + êîìàíäà Òåêñò, ïîäñòàâëÿåìûé âìåñòî ïñåâäîíèìà.\n\n\ +Âûâîä ñïèñêà âñåõ ïñåâäîíèìîâ:\n\ + ALIAS\n\n\ +Óñòàíîâêà èëè èçìåíåíèå ñóùåñòâóþùåãî ïñåâäîíèìà:\n\ + ALIAS da=dir a:\n\n\ +Óäàëåíèå ïñåâäîíèìà èç ñïèñêà:\n\ + ALIAS da=" + +STRING_BEEP_HELP, "Çâóêîâîé ñèãíàë.\n\nBEEP\n" + +STRING_CALL_HELP, "Âûçîâ îäíîãî ïàêåòíîãî ôàéëà èç äðóãîãî.\n\n\ +CALL [äèñê:][ïóòü]èìÿ_ôàéëà [ïàðàìåòðû]\n\n\ + ïàðàìåòðû Íàáîð ïàðàìåòðîâ êîìàíäíîé ñòðîêè, íåîáõîäèìûõ\n\ + ïàêåòíîìó ôàéëó." + +STRING_CD_HELP, "Âûâîä èìåíè ëèáî ñìåíà òåêóùåãî êàòàëîãà.\n\n\ +CHDIR [/D][äèñê:][ïóòü]\n\ +CHDIR[..|.]\n\ +CD [/D][äèñê:][ïóòü]\n\ +CD[..|.]\n\n\ + .. îáîçíà÷àåò ðîäèòåëüñêèé êàòàëîã\n\ + . îáîçíà÷àåò òåêóùèé êàòàëîã\n\ + /D Îäíîâðåìåííàÿ ñìåíà òåêóùèõ äèñêà è êàòàëîãà.\n\n\ +Êîìàíäà CD äèñê: îòîáðàæàåò èìÿ òåêóùåãî êàòàëîãà óêàçàííîãî äèñêà.\n\ +Êîìàíäà CD áåç ïàðàìåòðîâ îòîáðàæàåò èìåíà òåêóùèõ äèñêà è êàòàëîãà.\n" + +STRING_CHCP_HELP, "Âûâîä èëè ñìåíà òåêóùåãî íîìåðà êîäîâîé ñòðàíèöû.\n\n\ +CHCP [nnn]\n\n\ + nnn Íîìåð êîäîâîé ñòðàíèöû.\n\n\ +Êîìàíäà CHCP áåç ïàðàìåòðà âûâîäèò òåêóùèé íîìåð êîäîâîé ñòðàíèöû.\n" + +STRING_CHOICE_HELP, "Æä¸ò, ïîêà ïîëüçîâàòåëü íå âûáåðåò îäèí èç óêàçàííûõ â ñïèñêå ñèìâîëîâ.\n\n\ +CHOICE [/C[:]ñïèñîê_ñèìâîëîâ][/N][/S][/T[:]c,nn][òåêñò]\n\n\ + /C[:]ñïèñîê_ñèìâîëîâ Óêàçûâàåò äîïóñòèìûå ñèìâîëû. Ïî óìîë÷àíèþ ýòî YN.\n\ + /N Íå âûâîäèòü ñïèñîê ñèìâîëîâ è ? ïîñëå ïîäñêàçêè.\n\ + /S Òðàêòîâàòü ñèìâîëû êàê ÷óâñòâèòåëüíûå ê ðåãèñòðó.\n\ + /T[:]c,nn Ïî óìîë÷àíèþ âûáîð c ïî èñòå÷åíèè nn ñåêóíä.\n\ + text Ïîäñêàçêà.\n\n\ +ERRORLEVEL óñòàíàâëèâàåòñÿ ðàâíûì íîìåðó âûáðàííîãî ñèìâîëà.\n" + +STRING_CLS_HELP, "Î÷èñòêà ýêðàíà.\n\nCLS\n" + +STRING_CMD_HELP1, "\nÄîñòóïíûå âíóòðåííèå êîìàíäû:\n" + +STRING_CMD_HELP2, "\nÄîñòóïíûå âîçìîæíîñòè:" + +STRING_CMD_HELP3," [ïñåâäîíèìû]" + +STRING_CMD_HELP4," [èñòîðèÿ]" + +STRING_CMD_HELP5," [çàâåðøåíèå èìåí ôàéëîâ unix]" + +STRING_CMD_HELP6," [ñòåê äèðåêòîðèé]" + +STRING_CMD_HELP7," [ïåðåíàïðàâëåíèå è piping]" + +STRING_CMD_HELP8, "Çàïóñê íîâîé êîïèè èíòåðïðåòàòîðà êîìàíä ReactOS.\n\n\ +CMD [/[C|K] êîìàíäà][/P][/Q][/T:bf]\n\n\ + /C êîìàíäà Âûïîëíåíèå óêàçàííîé êîìàíäû ñ ïîñëåäóþùèì çàâåðøåíèåì.\n\ + /K êîìàíäà Âûïîëíåíèå óêàçàííîé êîìàíäû áåç ïîñëåäóþùåãî çàâåðøåíèÿ.\n\ + /P CMD ñòàíîâèòñÿ ïåðìàíåíòíûì è çàïóñêàåò autoexec.bat\n\ + (ïðîöåññ íåìîæåò áûòü çàâåðøåí).\n\ + /T:öâ Âûáîð öâåòà òåêñòà/ôîíà (áîëåå ïîäðîáíî ñì. COLOR /?).\n" + +STRING_COLOR_HELP1, "Óñòàíîâêà öâåòîâ ïî óìîë÷àíèþ äëÿ òåêñòà è ôîíà.\n\n\ +COLOR [öâåòà [/-F]] \n\n\ + öâåòà Àòðèáóòû öâåòîâ äëÿ òåêñòîâûõ îêîí\n\ + /-F Íå çàëèâàòü íåçàïîëíåííûå ìåñòà öâåòîì\n\n\ +Åñòü òðè ñïîñîáà îáîçíà÷àòü öâåòà:\n\ +1) ïî íàçâàíèþ íà àíãëèéñêîì ÿçûêå (òðåáóþòñÿ òîëüêî ïåðâûå òðè áóêâû öâåòà)\n\ +2) â âèäå äåñÿòè÷íûõ ÷èñåë (decimal on decimal)\n\ +3) äâà øåñòíàäöàòåðè÷íûõ ÷èñëà\n\n\ +Òàáëèöà öâåòîâ:\n\ +äåñ. øåñò.íàçâàíèå äåñ. øåñò.íàçâàíèå\n\ + 0 0 = ×åðíûé 8 8 = Ñåðûé\n\ + 1 1 = Ñèíèé 9 9 = Ñâåòëî-ñèíèé\n\ + 2 2 = Çåëåíûé 10 A = Ñâåòëî-çåëåíûé\n\ + 3 3 = Ãîëóáîé 11 B = Ñâåòëî-ãîëóáîé\n\ + 4 4 = Êðàñíûé 12 C = Ñâåòëî-êðàñíûé\n\ + 5 5 = Ëèëîâûé 13 D = Ñâåòëî-ëèëîâûé\n\ + 6 6 = Æåëòûé 14 E = Ñâåòëî-æåëòûé\n\ + 7 7 = Áåëûé 15 F = ßðêî-áåëûé\n" + +STRING_COPY_HELP1, "Ïåðåçàïèñàòü %s (Yes/No/All)? " + +STRING_COPY_HELP2, "Êîïèðîâàíèå îäíîãî èëè íåñêîëüêèõ ôàéëîâ â äðóãîå ìåñòî.\n\n\ +COPY [/V][/Y|/-Y][/A|/B] èñòî÷íèê [/A|/B]\n\ + [+ èñòî÷íèê [/A|/B] [+ ...]] [ðåçóëüòàò [/A|/B]]\n\n\ + èñòî÷íèê Èìåíà îäíîãî èëè íåñêîëüêèõ êîïèðóåìûõ ôàéëîâ.\n\ + /A Ôàéë ÿâëÿåòñÿ òåêñòîâûì ôàéëîì ASCII.\n\ + /B Ôàéë ÿâëÿåòñÿ äâîè÷íûì ôàéëîì.\n\ + ðåçóëüòàò Êàòàëîã è/èëè èìÿ äëÿ êîíå÷íûõ ôàéëîâ.\n\ + /V Ïðîâåðêà ïðàâèëüíîñòè êîïèðîâàíèÿ ôàéëîâ.\n\ + /Y Ïîäàâëåíèå çàïðîñà ïîäòâåðæäåíèÿ íà ïåðåçàïèñü ñóùåñòâóþùåãî\n\ + ðåçóëüòèðóþùåãî ôàéëà.\n\ + /-Y Îáÿçàòåëüíûé çàïðîñ ïîäòâåðæäåíèÿ íà ïåðåçàïèñü ñóùåñòâóþùåãî\n\ + ðåçóëüòèðóþùåãî ôàéëà.\n\n\ +Êëþ÷ /Y ìîæíî óñòàíîâèòü ÷åðåç ïåðåìåííóþ ñðåäû COPYCMD.\n\ +...\n" + +STRING_DATE_HELP1, "\nÂâåäèòå íîâóþ äàòó (ìì%cää%cãããã): " + +STRING_DATE_HELP2, "\nÂâåäèòå íîâóþ äàòó (ää%cìì%cãããã): " + +STRING_DATE_HELP3, "\nÂâåäèòå íîâóþ äàòó (ãããã%cìì%cää): " + +STRING_DATE_HELP4, "Âûâîä èëè èçìåíåíèå äàòû.\n\n\ +DATE [/T][äàòà]\n\n\ + /T Íå çàïðàøèâàòü ââîä íîâîé äàòû\n\n\ +Êîìàíäà DATE áåç ïàðàìåòðîâ îòîáðàæàåò òåêóùóþ äàòó è çàïðàøèâàåò ââîä\n\ +íîâîé äàòû. Äëÿ ñîõðàíåíèÿ òåêóùåé äàòû íàæìèòå êëàâèøó ENTER.\n" + +STRING_DEL_HELP1, "Óäàëåíèå îäíîãî èëè íåñêîëüêèõ ôàéëîâ.\n\n\ +DEL [/N /P /T /Q /S /W /Y /Z /A[[:]àòðèáóòû]] èìåíà_ôàéëîâ ...\n\ +DELETE [/N /P /T /Q /S /W /Y /Z /A[[:]àòðèáóòû]] èìåíà_ôàéëîâ ...\n\ +ERASE [/N /P /T /Q /S /W /Y /Z /A[[:]àòðèáóòû]] èìåíà_ôàéëîâ ...\n\n\ + èìåíà_ôàéëîâ Èìåíà îäíîãî èëè íåñêîëüêèõ ôàéëîâ.\n\n\ + /N Íåâûïîëíÿòü íåïîñðåäñòâåííî îïåðàöèþ óäàëåíèÿ ôàéëà.\n\ + /P Çàïðîñ íà ïîäòâåðæäåíèå ïåðåä óäàëåíèåì êàæäîãî ôàéëà.\n\ + /T Ïîêàçûâàåò êîëè÷åñòâî óäàë¸ííûõ ôàéëîâ è îñâîáîäèâøåãîñÿ\n\ + äèñêîâîãî ïðîñòðàíñòâà.\n\ + /Q Îòêëþ÷åíèå çàïðîñà íà ïîäòâåðæäåíèå ïðè óäàëåíèè ôàéëîâ.\n\ + /W Ïåðåïèñàòü ôàéë ñëó÷àéíûìè äàííûìè ïåðåä óäàëåíèåì.\n\ + /Y Îòêëþ÷åíèå çàïðîñà íà ïîäòâåðæäåíèå ïðè óäàëåíèè ôàéëîâ\n\ + äàæå äëÿ ìàñêè *.*.\n\ + /F Ïðèíóäèòåëüíîå óäàëåíèå ôàéëîâ, äîñòóïíûõ òîëüêî äëÿ ÷òåíèÿ.\n\ + /S Óäàëÿòü ôàéë èç âñåõ ïîääèðåêòîðèé\n\ + /A Îòáîð ôàéëîâ äëÿ óäàëåíèÿ ïî àòðèáóòàì.\n\ + R Äîñòóïíûé òîëüêî äëÿ ÷òåíèÿ\n\ + S Ñèñòåìíûå ôàéëû\n\ + A Ôàéëû äëÿ àðõèâèðîâàíèÿ\n\ + H Ñêðûòûå ôàéëû\n\ + Ïðåôèêñ ""-"" èìååò çíà÷åíèå ÍÅ\n" + +STRING_DEL_HELP2, "Âñå ôàéëû â êàòàëîãå áóäóò óäàëåíû!\nÂû óâåðåíû (Y/N)?" +STRING_DEL_HELP3, " %lu ôàéë óäàë¸í\n" +STRING_DEL_HELP4, " %lu ôàéëîâ óäàëåíî\n" + +STRING_DELAY_HELP, "ïàóçà íà n ñåêóíä èëè ìèëëèñåêóíä\n\ +DELAY [/m]n\n\n\ + /m óêàçûâàåò, ÷òî n îçíà÷àåò êîëè÷åñòâî ìèëëèñåêóíä\n\ + èíà÷å n îçíà÷àåò êîëè÷åñòâî ñåêóíä\n" + +STRING_DIR_HELP1, "DIR [äèñê:][ïóòü][èìÿ_ôàéëà] [/A[[:]àòðèáóòû]] [/B] [/C] [/D] [/L] [/N]\n\ + [/O[[:]sortorder]] [/P] [/Q] [/S] [/T[[:]timefield]] [/W] [/X] [/4]\n\n\ + [äèñê:][ïóòü][èìÿ_ôàéëà]\n\ + Äèñê, êàòàëîã è/èëè ôàéëû, êîòîðûå ñëåäóåò âêëþ÷èòü â ñïèñîê.\n\n\ + /A Âûâîä ôàéëîâ ñ óêàçàííûìè àòðèáóòàìè.\n\ + àòðèáóòû D Êàòàëîãè R Äîñòóïíûå òîëüêî äëÿ ÷òåíèÿ\n\ + H Ñêðûòûå ôàéëû A Ôàéëû äëÿ àðõèâèðîâàíèÿ\n\ + S Ñèñòåìíûå ôàéëû Ïðåôèêñ ""-"" èìååò çíà÷åíèå ÍÅ\n\ + /B Âûâîä òîëüêî èìåí ôàéëîâ.\n\ + /C Ïðèìåíåíèå ðàçäåëèòåëÿ ãðóïï ðàçðÿäîâ äëÿ âûâîäà ðàçìåðîâ ôàéëîâ\n\ + (ïî óìîë÷àíèþ). Äëÿ îòêëþ÷åíèÿ ýòîãî ðåæèìà ñëóæèò êëþ÷ /-C.\n\ + /D Âûâîä ñïèñêà â íåñêîëüêî ñòîëáöîâ ñ ñîðòèðîâêîé ïî ñòîëáöàì.\n\ + /L Èñïîëüçîâàíèå íèæíåãî ðåãèñòðà äëÿ èìåí ôàéëîâ.\n\ + /N Îòîáðàæåíèå èìåí ôàéëîâ â êðàéíåì ïðàâîì ñòîëáöå.\n\ + /O Ñîðòèðîâêà ñïèñêà îòîáðàæàåìûõ ôàéëîâ.\n\ + ïîðÿäîê N Ïî èìåíè (àëôàâèòíàÿ) S Ïî ðàçìåðó (ñïåðâà ìåíüøèå)\n\ + E Ïî ðàñøèðåíèþ (àëôàâèòíàÿ) D Ïî äàòå (ñïåðâà áîëåå ñòàðûå)\n\ + G Íà÷àòü ñïèñîê ñ êàòàëîãîâ Ïðåôèêñ ""-"" îáðàùàåò ïîðÿäîê\n\ + /P Ïàóçà ïîñëå çàïîëíåíèÿ êàæäîãî ýêðàíà.\n\ + /Q Âûâîä ñâåäåíèé î âëàäåëüöå ôàéëà.\n\ + /S Âûâîä ñïèñêà ôàéëîâ èç óêàçàííîãî êàòàëîãà è åãî ïîäêàòàëîãîâ.\n\ + /T Âûáîð ïîëÿ âðåìåíè äëÿ îòîáðàæåíèÿ è ñîðòèðîâêè\n\ + âðåìÿ C Ñîçäàíèå\n\ + A Ïîñëåäíåå èñïîëüçîâàíèå\n\ + W Ïîñëåäíåå èçìåíåíèå\n\ + /W Âûâîä ñïèñêà â íåñêîëüêî ñòîëáöîâ.\n\ + /X Îòîáðàæåíèå êîðîòêèõ èìåí äëÿ ôàéëîâ, ÷üè èìåíà íå ñîîòâåòñòâóþò\n\ + ñòàíäàðòó 8.3. Ôîðìàò àíàëîãè÷åí âûâîäó ñ êëþ÷îì /N, íî êîðîòêèå\n\ + èìåíà ôàéëîâ âûâîäÿòñÿ ñëåâà îò äëèííûõ. Åñëè êîðîòêîãî èìåíè ó\n\ + ôàéëà íåò, âìåñòî íåãî âûâîäÿòñÿ ïðîáåëû.\n\ + /4 Âûâîä íîìåðà ãîäà â ÷åòûðåõçíà÷íîì ôîðìàòå\n" + +STRING_DIR_HELP2, " Òîì â óñòðîéñòâå %c èìååò ìåòêó %s\n" +STRING_DIR_HELP3, " Òîì â óñòðîéñòâå %c íå èìååò ìåòêè.\n" +STRING_DIR_HELP4, " Ñåðèéíûé íîìåð òîìà: %04X-%04X\n" +STRING_DIR_HELP5, "\n Âñåãî:\n%16i Ôàéë(îâ)% 14s áàéò\n" +STRING_DIR_HELP6, "%16i Dir(s)% 15s áàéò\n" +STRING_DIR_HELP7, "\n Êàòàëîã of %s\n\n" +STRING_DIR_HELP8, "%16i ôàéë(îâ)% 14s áàéò\n" + +STRING_DIRSTACK_HELP1, "Ñîõðàíÿåò òåêóùóþ äèðåêòîðèþ äëÿ èñïîëüçîâàíèÿ êîìàíäîé POPD, çàòåì\n\ +èçìåíÿåò å¸ íà óêàçàííóþ.\n\n\ +PUSHD [path | ..]\n\n\ + path Óêàçûâàåò äèðåêòîðèþ, êîòîðóþ íàäî ñäåëàòü òåêóùåé\n" + +STRING_DIRSTACK_HELP2, "Èçìåíÿåò òåêóùóþ äèðåêòîðèþ íà òó, êîòîðàÿ ñîõðàíåíà êîìàíäîé PUSHD.\n\nPOPD" + +STRING_DIRSTACK_HELP3, "Ïå÷àòàåò ñîäåðæèìîå ñòåêà äèðåêòîðèé.\n\nDIRS" + +STRING_DIRSTACK_HELP4, "Ñòåê äèðåêòîðèé ïóñò" + +STRING_ECHO_HELP1, "Âûäàåò ñîîáùåíèå áåç ïåðåâîäà ñòðîêè.\n\n\ + ECHOS message" + +STRING_ECHO_HELP2, "Âûäàåò ñîîáùåíèå â ñòàíäàðòíûé êàíàë âûâîäà îøèáîê.\n\n\ + ECHOERR message\n\ + ECHOERR. ïå÷àòàåò ïóñòóþ ñòðîêó" + +STRING_ECHO_HELP3, "Ïå÷àòàåò ñîîáùåíèå â ñòàíäàðòíûé êàíàë âûâîäà îøèáîê áåç ïåðåâîäà ñòðîêè è âîçâðàòà êàðåòêè.\n\n\ + ECHOSERR message" + +STRING_ECHO_HELP4, "Âûâîä ñîîáùåíèé è ïåðåêëþ÷åíèå ðåæèìà îòîáðàæåíèÿ êîìàíä íà ýêðàíå.\n\n\ + ECHO [ON | OFF]\n\ + ECHO [ñîîáùåíèå]\n\ + ECHO. âûâîä ïóñòîé ñòðîêè\n\n\ +ECHO áåç ïàðàìåòðà âûâîäèò òåêóùèé ðåæèì îòîáðàæåíèÿ êîìàíä." + +STRING_ECHO_HELP5, "ECHO is %s\n" + +STRING_EXIT_HELP, "Çàâåðøàåò èíòåðïðåòàòîð êîìàíä.\n\nEXIT\n" + +STRING_FOR_HELP1, "Çàïóñêàåò óêàçàííóþ êîìàíäó äëÿ êàæäîãî ôàéëà èç íàáîðà ôàéëîâ\n\n\ +FOR %ïåðåìåííàÿ IN (íàáîð) DO êîìàíäà [ïàðàìåòðû]\n\n\ + %ïåðåìåííàÿ Ïîäñòàâëÿåìûé ïàðàìåòð.\n\ + (íàáîð) Íàáîð èç îäíîãî èëè íåñêîëüêèõ ôàéëîâ.\n\ + Äîïóñêàåòñÿ èñïîëüçîâàíèå ïîäñòàíîâî÷íûõ çíàêîâ.\n\ + êîìàíäà Êîìàíäà, êîòîðóþ ñëåäóåò âûïîëíèòü äëÿ êàæäîãî ôàéëà.\n\ + ïàðàìåòðû Ïàðàìåòðû è êëþ÷è äëÿ óêàçàííîé êîìàíäû.\n\n\ + ïàêåòíûõ ôàéëàõ äëÿ êîìàíäû FOR èñïîëüçóåòñÿ çàïèñü\n\ +%%ïåðåìåííàÿ âìåñòî %ïåðåìåííàÿ.\n" + +STRING_FREE_HELP1, "\nÒîì äèñêà %s: %-11s\n\ + Ñåðèéíûé íîìåð: %s\n\ + %16s áàéò îáùåãî äèñêîâîãî ïðîñòðàíñòâà\n\ + %16s áàéò çàíÿòî\n\ + %16s áàéò ñâîáîäíî\n" + +STRING_FREE_HELP2, "Âûâîäèò èíôîðìàöèþ î òîìå.\n\nFREE [drive: ...]\n" + +STRING_IF_HELP1, "Îïåðàòîð óñëîâíîãî âûïîëíåíèÿ êîìàíä â ïàêåòíîì ôàéëå.\n\n\ + IF [NOT] ERRORLEVEL ÷èñëî êîìàíäà\n\ + IF [NOT] ñòðîêà1==ñòðîêà2 êîìàíäà\n\ + IF [NOT] EXIST èìÿ_ôàéëà êîìàíäà\n\ + IF [NOT] DEFINED ïåðåìåííàÿ êîìàíäà\n\n\ + NOT Îáðàùàåò èñòèííîñòü óñëîâèÿ: èñòèííîå óñëîâèå\n\ + ñòàíîâèòñÿ ëîæíûì, à ëîæíîå - èñòèííûì.\n\ + ERRORLEVEL ÷èñëî Óñëîâèå ÿâëÿåòñÿ èñòèííûì, åñëè êîä âîçâðàòà ïîñëåäíåé\n\ + âûïîëíåííîé ïðîãðàììû íå ìåíüøå óêàçàííîãî ÷èñëà.\n\ + ñòðîêà1==ñòðîêà2 Ýòî óñëîâèå ÿâëÿåòñÿ èñòèííûì, åñëè óêàçàííûå ñòðîêè\n\ + ñîâïàäàþò.\n\ + EXIST èìÿ_ôàéëà Ýòî óñëîâèå ÿâëÿåòñÿ èñòèííûì, åñëè ôàéë ñ óêàçàííûì\n\ + èìåíåì ñóùåñòâóåò.\n\ +DEFINED ïåðåìåííàÿ Ýòî óñëîâèå ÿâëÿåòñÿ èñòèííûì, åñëè óêàçàííàÿ ïåðåìåííàÿ\n\ + çàäàíà\n\ + êîìàíäà Çàäàåò êîìàíäó, âûïîëíÿåìóþ ïðè èñòèííîñòè óñëîâèÿ.\n\ + Çà ýòîé êîìàíäîé ìîæåò ñëåäîâàòü êëþ÷åâîå ñëîâî ELSE,\n\ + ñëóæàùåå äëÿ óêàçàíèÿ êîìàíäû, êîòîðàÿ äîëæíà\n\ + âûïîëíÿòüñÿ â òîì ñëó÷àå, åñëè óñëîâèå ëîæíî.\n" + +STRING_GOTO_HELP1, "Ïåðåäà÷à óïðàâëåíèÿ ñîäåðæàùåé ìåòêó ñòðîêå ïàêåòíîãî ôàéëà.\n\n\ +GOTO ìåòêà\n\n\ + label Ñòðîêà ïàêåòíîãî ôàéëà, îôîðìëåííàÿ êàê ìåòêà.\n\n\ +Ìåòêà äîëæíà íàõîäèòüñÿ â îòäåëüíîé ñòðîêå è íà÷èíàòüñÿ ñ äâîåòî÷èÿ." + +STRING_LABEL_HELP1, "Ñîçäàíèå, èçìåíåíèå è óäàëåíèå ìåòîê òîìà.\n\nLABEL [äèñê:][ìåòêà]\n" + +STRING_LABEL_HELP2, "Òîì â óñòðîéñòâå %c èìååò ìåòêó %s\n" +STRING_LABEL_HELP3, "Òîì â óñòðîéñòâå %c: íå èìååò ìåòêè\n" +STRING_LABEL_HELP4, "Ñåðèéíûé íîìåð òîìà: %04X-%04X\n" +STRING_LABEL_HELP5, "Ìåòêà òîìà (11 áóêâ, ÂÂÎÄ äëÿ ïóñòîé ìåòêè)? " + +STRING_LOCALE_HELP1, "Òåêóùåå âðåìÿ: " + +STRING_MKDIR_HELP, "Ñîçäàíèå êàòàëîãà.\n\n\ +MKDIR [äèñê:]ïóòü\nMD [äèñê:]ïóòü" + +STRING_MEMMORY_HELP1, "Âûâîä îáú¸ìà ñèñòåìíîé ïàìÿòè.\n\nMEMORY" + +STRING_MEMMORY_HELP2, "\n %12s%% memory load.\n\n\ + %13s áàéò âñåãî ôèçè÷åñêîé ïàìÿòè.\n\ + %13s áàéò äîñòóïíî ôèçè÷åñêîé ïàìÿòè.\n\n\ + %13s áàéò âñåãî â ôàéëå ïîäêà÷êè.\n\ + %13s áàéò äîñòóïíî â ôàéëå ïîäêà÷êè.\n\n\ + %13s áàéò âñåãî âèðòóàëüíîé ïàìÿòè.\n\ + %13s áàéò äîñòóïíî âèðòóàëüíî ïàìÿòè.\n" + +STRING_MISC_HELP1, "Íàæìèòå êëàâèøó äëÿ ïðîäîëæåíèÿ...\n" + +STRING_MOVE_HELP1, "Ïåðåïèñàòü %s (Yes/No/All)? " + +STRING_MOVE_HELP2, "Ïåðåìåùåíèå ôàéëîâ è ïåðåèìåíîâàíèå ôàéëîâ è êàòàëîãîâ.\n\n\ +Ïåðåìåùåíèå îäíîãî èëè áîëåå ôàéëîâ:\n\ +MOVE [/N][äèñê:][ïóòü]èìÿ_ôàéëà1[,...] íàçíà÷åíèå\n\n\ +Ïåðåèìåíîâàíèå êàòàëîãà:\n\ +MOVE [/N][äèñê:][ïóòü]èìÿ_êàòàëîãà1 èìÿ_êàòàëîãà2\n\n\ + [äèñê:][ïóòü]èìÿ_ôàéëà1 Óêàçûâàåò ìåñòîïîëîæåíèå è èìÿ ôàéëà èëè ôàéëîâ\n\ + êîòîðûå íåîáõîäèìî ïåðåìåñòèòü.\n\ + /N Nothing. Do everything but move files or directories.\n\n\ +Òåêóùèå îãðàíè÷åíèÿ:\n\ + - Íåâîçìîæíî ïåðåíîñèòü ôàéëû èëè ïàïêè ìåæäó ðàçíûìè ðàçäåëàìè.\n" + +STRING_MSGBOX_HELP, "Âûâîä îêíà ñ ñîîáùåíèåì è âîçâðàò îòâåòà ïîëüçîâàòåëÿ\n\n\ +MSGBOX òèï ['çàãîëîâîê'] ïîäñêàçêà\n\n\ +òèï âûâîäèìûå êíîïêè\n\ + âîçìîæíûå çíà÷åíèÿ: OK, OKCANCEL,\n\ + YESNO, YESNOCANCEL\n\ +çàãîëîâîê çàãîëîâîê îêíà ñ ñîîáùåíèåì\n\ +ïîäñêàçêà âûâîäèìûé òåêñò ïîäñêàçêè\n\n\n\ +ERRORLEVEL óñòàíàâëèâàåòñÿ â ñîîòâåòñòâèè ñ íàæàòîé êíîïêîé:\n\n\ +YES : 10 | NO : 11\n\ +OK : 10 | CANCEL : 12\n" + +STRING_PATH_HELP1, "Âûâîä èëè çàäàíèå ïóòè ïîèñêà èñïîëíÿåìûõ ôàéëîâ.\n\n\ +PATH [[äèñê:]ïóòü[;...]]\nPATH ;\n\n\ +Êîìàíäà PATH ; î÷èùàåò ïóòü ïîèñêà èñïîëüçóåìûõ ôàéëîâ, îãðàíè÷èâ åãî\n\ +òåêóùèì êàòàëîãîì.\n\ +Êîìàíäà PATH áåç ïàðàìåòðîâ îòîáðàæàåò òåêóùèé ïóòü ïîèñêà.\n" + +STRING_PROMPT_HELP1, "Èçìåíåíèå ïðèãëàøåíèÿ êîìàíäíîé ñòðîêè.\n\n\ +PROMPT [òåêñò]\n\n\ + òåêñò Íîâîå ïðèãëàøåíèå êîìàíäíîé ñòðîêè.\n\n\ +Ïðèãëàøåíèå ìîæåò âêëþ÷àòü îáû÷íûå ñèìâîëû è ñëåäóþùèå êîäû:\n\n\ + $A & (àìïåðñàíä)\n\ + $B | (âåðòèêàëüíàÿ ÷åðòà)\n\ + $C ( (ëåâàÿ êðóãëàÿ ñêîáêà)\n\ + $D Òåêóùàÿ äàòà\n\ + $E ESC (ñèìâîë ASCII ñ êîäîì 27)\n\ + $F ) (ïðàâàÿ êðóãëàÿ ñêîáêà)\n\ + $G > (çíàê ""áîëüøå"")\n\ + $H BACKSPACE (óäàëåíèå ïðåäûäóùåãî ñèìâîëà)\n\ + $L < (çíàê ""ìåíüøå"")\n\ + $N Òåêóùèé äèñê\n\ + $P Òåêóùèå äèñê è êàòàëîã\n\ + $Q = (çíàê ðàâåíñòâà)\n\ + $T Òåêóùåå âðåìÿ\n\ + $V Íîìåð âåðñèè îïåðàöèîííîé ñèñòåìû\n\ + $_ Ïåðåâîä ñòðîêè\n\ + $$ $ (çíàê äîëëàðà)\n" + +STRING_PAUSE_HELP1, "Ïðèîñòàíîâêà âûïîëíåíèÿ ïàêåòíîãî ôàéëà è âûâîä ñîîáùåíèÿ:\n\ +'Äëÿ ïðîäîëæåíèÿ íàæìèòå ëþáóþ êëàâèøó...' èëè óêàçàííîå ñîîáùåíèå.\n\n\ +PAUSE [ñîîáùåíèå]" + +STRING_PROMPT_HELP2, " $+ Displays the current depth of the directory stack" + +STRING_PROMPT_HELP3, "\nPROMPT áåç ïàðàìåòðîâ óñòàíàâëèâàåò ïðèãëàøåíèå êîìàíäíîé ñòðîêè ïî óìîë÷àíèþ." + +STRING_REM_HELP, "Ïîìåùåíèå êîììåíòàðèåâ â ïàêåòíûå ôàéëû.\n\nREM [êîììåíòàðèé]" + +STRING_RMDIR_HELP, "Óäàëåíèå êàòàëîãà.\n\n\ +RMDIR [äèñê:]ïóòü\nRD [äèñê:]ïóòü\n\ +/S Óäàëåíèå äåðåâà êàòàëîãîâ\n\ +/Q Îòêëþ÷åíèå çàïðîñà ïîäòâåðæäåíèÿ\n" +STRING_RMDIR_HELP2, "Êàòàëîã ïóñò!\n" + +STRING_REN_HELP1, "Ïåðåèìåíîâàíèå îäíîãî èëè íåñêîëüêèõ ôàéëîâ èëè êàòàëîãîâ.\n\n\ +RENAME [/E /N /P /Q /S /T] ñòàðîå_èìÿ ... íîâîå_èìÿ\n\ +REN [/E /N /P /Q /S /T] ñòàðîå_èìÿ ... íîâîå_èìÿ\n\n\ + /E Íå âûâîäèòü ñîîáùåíèÿ îá îøèáêàõ.\n\ + /N Nothing.\n\ + /P Çàïðîñ ïîäòâåðæäåíèÿ ïåðåä ïåðåèìåíîâàíèåì.\n\ + (Not implemented yet!)\n\ + /Q Quiet.\n\ + /S Ïåðåèìåíîâûâàòü ïîäêàòàëîãè.\n\ + /T Âûâîä êîëè÷åñòâà ïåðåèìåíîâàííûõ ôàéëîâ.\n\n\ +Äëÿ êîíå÷íîãî ôàéëà íåëüçÿ óêàçàòü äðóãîé äèñê èëè êàòàëîã.\n\ +Äëÿ ýòîé öåëè ñëåäóåò èñïîëüçîâàòü êîìàíäó MOVE.\n" + +STRING_REN_HELP2, " %lu ôàéë ïåðåèìåíîâàí\n" + +STRING_REN_HELP3, " %lu ôàéëîâ ïåðåèìåíîâàíî\n" + +STRING_SHIFT_HELP, "Èçìåíåíèå ñîäåðæèìîãî (ñäâèã) ïîäñòàâëÿåìûõ ïàðàìåòðîâ äëÿ ïàêåòíîãî ôàéëà.\n\n\ +SHIFT [DOWN]" + +STRING_SCREEN_HELP, "Ïåðåìåùåíèå êóðñîðà è âûâîä òåêñòà\n\n\ +SCREEN ñòð êîë [òåêñò]\n\n\ + ñòð ñòðîêà, íà êîòîðóþ ñëåäóåò ïåðåìåñòèòü êóðñîð\n\ + êîë êîëîíêà, íà êîòîðóþ ñëåäóåò ïåðåìåñòèòü êóðñîð" + +STRING_SET_HELP, "Âûâîä, çàäàíèå è óäàëåíèå ïåðåìåííûõ ñðåäû.\n\n\ +SET [ïåðåìåííàÿ[=][çíà÷åíèå]]\n\n\ + ïåðåìåííàÿ Èìÿ ïåðåìåííîé ñðåäû.\n\ + çíà÷åíèå Ñòðîêà ñèìâîëîâ, ïðèñâàèâàåìàÿ óêàçàííîé ïåðåìåííîé.\n\n\ +SET áåç ïàðàìåòðîâ âûâîäèò òåêóùèå çíà÷åíèÿ ïåðåìåííûõ ñðåäû.\n" + +STRING_START_HELP1, "Çàïóñê óêàçàííîé ïðîãðàììû èëè êîìàíäû.\n\n\ +START êîìàíäà\n\n\ + êîìàíäà Êîìàíäà èëè ïðîãðàììà äëÿ çàïóñêà.\n\n\ +At the moment all commands are started asynchronously.\n" + +STRING_TITLE_HELP, "Èçìåíåíèå çàãîëîâêà îêíà êîìàíäíîé ñòðîêè.\n\n\ +TITLE [ñòðîêà]\n\n\ +ñòðîêà Áóäóùèé çàãîëîâîê îêíà êîìàíäíîé ñòðîêè.\n" + +STRING_TIME_HELP1, "Âûâîä èëè èçìåíåíèå âðåìåíè.\n\n\ +TIME [/T][âðåìÿ]\n\n\ + /T íå èçìåíÿòü âðåìÿ\n\n\ +TIME áåç ïàðàìåòðîâ âûâîäèò òåêóùåå âðåìÿ è çàïðàøèâàåò\n\ +íîâîå âðåìÿ. Íàæàòèå ENTER ñîõðàíÿåò òåêóùåå âðåìÿ.\n" + +STRING_TIME_HELP2, "Ââåäèòå íîâîå âðåìÿ: " + +STRING_TIMER_HELP1, "Ïðîøëî %d ìñåê\n" + +STRING_TIMER_HELP2, "Ïðîøëî %02d%c%02d%c%02d%c%02d\n" + +STRING_TIMER_HELP3, "Ñåêóíäîìåð.\n\n\ +TIMER [ON|OFF] [/S] [/n] [/Fn]\n\n\ + ON Âêëþ÷èòü ñåêóíäîìåð\n\ + OFF Âûêëþ÷èòü ñåêóíäîìåð\n\ + /S Ðàçíèöà âðåìåíè. Âîçâðàùàåò ðàçíèöó âðåìåíè\n\ + ñåêóíäîìåðà áåç èçìåíåíèÿ åãî çíà÷åíèÿ\n\ + /n Çàäàòü íîìåð ñåêóíäîìåðà.\n\ + Äîñòóïíûå íîìåðà - îò 0 äî 9\n\ + Çíà÷åíèå ïî óìîë÷àíèþ - 1\n\ + /Fn Ôîðìàò âûâîäà\n\ + n îäíî èç:\n\ + 0 ìèëëèñåêóíäû\n\ + 1 ÷÷%cìì%cññ%cää\n\n\ +Åñëè íè îäèí èç ïàðàìåòðîâ íå óêàçàí, êîìàíäà\n\ +ïåðåêëþ÷àåò ñîñòîÿíèå ñåêóíäîìåðà\n\n" + +STRING_TYPE_HELP1, "Âûâîä ñîäåðæèìîãî îäíîãî èëè íåñêîëüêèõ òåêñòîâûõ ôàéëîâ.\n\nTYPE [äèñê:][ïóòü]èìÿ ôàéëà \n\ + /P Ïîýêðàííûé âûâîä.\n" + +STRING_VERIFY_HELP1, "This command is just a dummy!!\n\ +Âêëþ÷åíèå èëè îòêëþ÷åíèå ðåæèìà ïðîâåðêè ïðàâèëüíîñòè çàïèñè ôàéëîâ a\n\ +íà äèñê.\n\n\ +VERIFY [ON | OFF]\n\n\ +VERIFY áåç ïàðàìåòðà âûâîäèò òåêóùåå çíà÷åíèå ýòîé êîìàíäû.\n" + +STRING_VERIFY_HELP2, "VERIFY %s.\n" + +STRING_VERIFY_HELP3, "Íåîáõîäèìî óêàçàòü ON èëè OFF." + +STRING_VERSION_HELP1, "Âûâîä âåðñèè\n\n\ +VER [/C][/R][/W]\n\n\ + /C Displays credits.\n\ + /R Displays redistribution information.\n\ + /W Displays warranty information." + +STRING_VERSION_HELP2, " comes with ABSOLUTELY NO WARRANTY; for details\n\ +type: `ver /w'. This is free software, and you are welcome to redistribute\n\ +it under certain conditions; type `ver /r' for details. Type `ver /c' for a\n\ +listing of credits." + +STRING_VERSION_HELP3, "\n This program is distributed in the hope that it will be useful,\n\ + but WITHOUT ANY WARRANTY; without even the implied warranty of\n\ + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n\ + GNU General Public License for more details." + +STRING_VERSION_HELP4, "\n This program is free software; you can redistribute it and/or modify\n\ + it under the terms of the GNU General Public License as published by\n\ + the Free Software Foundation; either version 2 of the License, or\n\ + (at your option) any later version.\n" + +STRING_VERSION_HELP5, "\nÏîñûëàéòå îò÷åòû îá îøèáêàõ íà .\n\ +Îáíîâëåíèÿ äîñòóïíû ïî àäðåñó: http://www.reactos.org/" + +STRING_VERSION_HELP6, "\nFreeDOS-âåðñèÿ íàïèñàíà:\n" + +STRING_VERSION_HELP7, "\nReactOS-âåðñèÿ íàïèñàíà:\n" + +STRING_VOL_HELP1, " Òîì â óñòðîéñòâå %c: èìååò ìåòêó %s" +STRING_VOL_HELP2, " Òîì â óñòðîéñòâå %c: íå èìååò ìåòêè" +STRING_VOL_HELP3, " Ñåðèéíûé íîìåð òîìà: %04X-%04X\n" +STRING_VOL_HELP4, "Âûâîäèò ìåòêó òîìà è ñåðèéíûé íîìåð.\n\nVOL [äèñê:]" + +STRING_WINDOW_HELP1, "Ìåíÿåò âèä îêíà êîíñîëè\n\n\ +WINDOW [/POS[=]left,top,øèðèíà,âûñîòà]\n\ + [MIN|MAX|RESTORE] ['çàãîëîâîê']\n\n\ +/POS óêàçûâàåò ðàçìåð è ïîëîæåíèå îêíà\n\ +MIN ñâîðà÷èâàåò îêíî\n\ +MAX ðàçâîðà÷èâàåò îêíî\n\ +RESTORE âîññòàíàâëèâàåò îêíî\n" + +STRING_WINDOW_HELP2, "Ìåíÿåò âèä îêíà êîíñîëè\n\n\ +ACTIVATE 'window' [/POS[=]left,top,øèðèíà,âûñîòà]\n\ + [MIN|MAX|RESTORE] ['çàãîëîâîê']\n\n\ +window çàãîëîâîê îêíà, âèä êîòîðîãî ñëåäóåò ìåíÿòü\n\ +/POS óêàçûâàåò ðàçìåð è ïîëîæåíèå îêíà\n\ +MIN ñâîðà÷èâàåò îêíî\n\ +MAX ðàçâîðà÷èâàåò îêíî\n\ +RESTORE âîññòàíàâëèâàåò îêíî\n\ +çàãîëîâîê íîâûé çàãîëîâîê\n" + + +STRING_HELP1, "Ñïèñîê âñåõ äîñòóïíûõ êîìàíä ñ êîðîòêèì îïèñàíèåì\n\n\ + êîìàíäà /? Âûâîäèò ïîäðîáíóþ èíôîðìàöèþ î êîìàíäå\n\n\ +? Ñïèñîê âñåõ äîñòóïíûõ êîìàíä áåç îïèñàíèÿ.\n\ +ALIAS Âûâîä, óñòàíîâêà èëè óäàëåíèå ïñåâäîíèìîâ.\n\ +ATTRIB Âûâîä è èçìåíåíèå àòðèáóòîâ ôàéëîâ.\n\ +BEEP Çâóêîâîé ñèãíàë.\n\ +CALL Âûçîâ îäíîãî ïàêåòíîãî ôàéëà èç äðóãîãî.\n\ +CD Âûâîä èìåíè ëèáî ñìåíà òåêóùåãî êàòàëîãà.\n\ +CHCP Âûâîä èëè ñìåíà òåêóùåãî íîìåðà êîäîâîé ñòðàíèöû.\n\ +CHOICE Æä¸ò, ïîêà ïîëüçîâàòåëü íå âûáåðåò îäèí èç óêàçàííûõ â ñïèñêå ñèìâîëîâ.\n\ +CLS Î÷èñòêà ýêðàíà.\n\ +CMD Çàïóñê íîâîé êîïèè èíòåðïðåòàòîðà êîìàíä.\n\ +COLOR Óñòàíîâêà öâåòîâ ïî óìîë÷àíèþ äëÿ òåêñòà è ôîíà.\n\ +COPY Êîïèðîâàíèå îäíîãî èëè íåñêîëüêèõ ôàéëîâ â äðóãîå ìåñòî.\n\ +DATE Âûâîä èëè èçìåíåíèå äàòû.\n\ +DELETE Óäàëåíèå îäíîãî èëè íåñêîëüêèõ ôàéëîâ.\n\ +DIR Âûâîä ñïèñêà ôàéëîâ è ïîäêàòàëîãîâ êàòàëîãà.\n\ +ECHO Âûâîä ñîîáùåíèé è ïåðåêëþ÷åíèå ðåæèìà îòîáðàæåíèÿ êîìàíä íà ýêðàíå.\n\ +ERASE Óäàëåíèå îäíîãî èëè íåñêîëüêèõ ôàéëîâ.\n\ +EXIT Çàâåðøàåò èíòåðïðåòàòîð êîìàíä.\n\ +FOR Çàïóñêàåò óêàçàííóþ êîìàíäó äëÿ êàæäîãî ôàéëà èç íàáîðà ôàéëîâ.\n\ +FREE (Ñâîáîäíîå) äèñêîâîå ïðîñòðàíñòâî.\n\ +GOTO Ïåðåäà÷à óïðàâëåíèÿ ñîäåðæàùåé ìåòêó ñòðîêå ïàêåòíîãî ôàéëà\n\ +HELP Ïðåäîñòàâëÿåò ñïðàâî÷íóþ èíôîðìàöèþ î êîìàíäàõ ReactOS.\n\ +HISTORY Ñïèñîê çàïóùåííûõ êîìàíä\n\ +IF Îïåðàòîð óñëîâíîãî âûïîëíåíèÿ êîìàíä â ïàêåòíîì ôàéëå.\n\ +LABEL Ñîçäàíèå, èçìåíåíèå è óäàëåíèå ìåòîê òîìà.\n\ +MD Ñîçäàíèå êàòàëîãà.\n\ +MKDIR Ñîçäàíèå êàòàëîãà.\n\ +MOVE Ïåðåìåùåíèå ôàéëîâ è ïåðåèìåíîâàíèå ôàéëîâ è êàòàëîãîâ\n\ +PATH Âûâîä èëè çàäàíèå ïóòè ïîèñêà èñïîëíÿåìûõ ôàéëîâ.\n\ +PAUSE Ïðèîñòàíîâêà âûïîëíåíèÿ ïàêåòíîãî ôàéëà.\n\ +POPD Âîñòòàíàâëèâàåò ïðåäûäóùåå çíà÷åíèå òåêóùåé äèðåêòîðèè ñîõðàíåííîå êîìàíäîé\n\ + PUSHD.\n\ +PROMPT Èçìåíåíèå ïðèãëàøåíèÿ êîìàíäíîé ñòðîêè.\n\ +PUSHD Ñîõðàíÿåò òåêóùóþ äèðåêòîðèþ, à ïîòîì ìåíÿåò å¸.\n\ +RD Óäàëåíèå êàòàëîãà.\n\ +REM Çàïèñûâàåò êîììåíòàðèè (çàìå÷åíèÿ) â ïàêåòíûõ ôàéëàõ.\n\ +REN Ïåðåèìåíîâàíèå îäíîãî èëè íåñêîëüêèõ ôàéëîâ èëè êàòàëîãîâ.\n\ +RENAME Ïåðåèìåíîâàíèå îäíîãî èëè íåñêîëüêèõ ôàéëîâ èëè êàòàëîãîâ.\n\ +RMDIR Óäàëåíèå êàòàëîãà.\n\ +SCREEN Ïåðåìåùåíèå êóðñîðà è âûâîä òåêñòà.\n\ +SET Âûâîä, çàäàíèå è óäàëåíèå ïåðåìåííûõ ñðåäû.\n\ +SHIFT Èçìåíåíèå ñîäåðæèìîãî (ñäâèã) ïîäñòàâëÿåìûõ ïàðàìåòðîâ äëÿ ïàêåòíîãî ôàéëà\n" +STRING_HELP2, "START Îòêðûâàåò îòäåëüíîå îêíî äëÿ çàïóñêà óêàçàííûõ êîìàíä èëè ïðîãðàìì.\n\ + Âûïîëíÿåò êîìàíäó.\n\ +TIME Âûâîä èëè èçìåíåíèå âðåìåíè.\n\ +TIMER Ñåêóíäîìåð.\n\ +TITLE Èçìåíåíèå çàãîëîâêà îêíà êîìàíäíîé ñòðîêè.\n\ +TYPE Âûâîä ñîäåðæèìîãî îäíîãî èëè íåñêîëüêèõ òåêñòîâûõ ôàéëîâ.\n\ +VER Âûâîä âåðñèè ÎÑ.\n\ +VERIFY Âêëþ÷åíèå èëè îòêëþ÷åíèå ðåæèìà ïðîâåðêè ïðàâèëüíîñòè çàïèñè ôàéëîâ\n\ + íà äèñê.\n\ +VOL Âûâîäèò ìåòêó òîìà è ñåðèéíûé íîìåð.\n" + + +STRING_CHOICE_OPTION, "YN" +STRING_COPY_OPTION, "YNA" + + +STRING_ALIAS_ERROR, "Êîìàíäíàÿ ñòðîêà ñëèøêîì äëèííàÿ ïîñëå ðàçâ¸ðòûâàíèÿ ïñåâäîíèìîâ!\n" +STRING_BATCH_ERROR, "Îøèáêà îòêðûòèÿ êîìàíäíîãî ôàéëà\n" +STRING_CHCP_ERROR1, "Òåêóùàÿ êîäîâàÿ ñòðàíèöà: %u\n" +STRING_CHCP_ERROR4, "Îøèáî÷íàÿ êîäîâàÿ ñòðàíèöà\n" +STRING_CHOICE_ERROR, "Îøèáî÷íûé ïàðàìåòð. Îæèäàåòñÿ ôîðìàò: /C[:]ïàðàìåòðû" +STRING_CHOICE_ERROR_TXT, "Îøèáî÷íûé ïàðàìåòð. Îæèäàåòñÿ ôîðìàò: /T[:]c,nn" +STRING_CHOICE_ERROR_OPTION, "Îøèáî÷íûé ïàðàìåòð: %s" +STRING_MD_ERROR, "Ïîäêàòàëîã èëè ôàéë óæå ñóùåñòâóåò.\n" +STRING_MD_ERROR2, "Ïóòü ê íîâîìó êàòàëîãó íå ñóùåñòâóåò.\n" +STRING_CMD_ERROR1, "Íå ìîãó ïåðåíàïðàâèòü ââîä èç ôàéëà %s\n" +STRING_CMD_ERROR2, "Îøèáêà ñîçäàíèÿ âðåìåííîãî ôàéëà äëÿ pipe-äàííûõ\n" +STRING_CMD_ERROR3, "Íå ìîãó ïåðåíàïðàâèòü â ôàéë %s\n" +STRING_CMD_ERROR4, "Çàïóñê %s...\n" +STRING_CMD_ERROR5, "Çàïóñê cmdexit.bat...\n" +STRING_COLOR_ERROR1, "Îäèíàêîâûå öâåòà! (Öâåòà ôîíà è òåêñòà íå ìîãóò áûòü îäèíàêîâûìè)" +STRING_COLOR_ERROR2, "îøèáêà â óêàçàíèè öâåòà" +STRING_COLOR_ERROR3, "Öâåò %x\n" +STRING_COLOR_ERROR4, "Îäèíàêîâûå öâåòà!" +STRING_CONSOLE_ERROR, "Íåèçâåñòíàÿ îøèáêà: %d\n" +STRING_COPY_ERROR1, "Îøèáêà: Íå ìîãó îòêðûòü èñòî÷íèê - %s!\n" +STRING_COPY_ERROR2, "Îøèáêà: Íå ìîãó êîïèðîâàòü â ñåáÿ!\n" +STRING_COPY_ERROR3, "Îøèáêà çàïèñè!\n" +STRING_COPY_ERROR4, "Îøèáêà: Not implemented yet!\n" +STRING_DATE_ERROR, "Íåïðàâèëüíàÿ äàòà." +STRING_DEL_ERROR5, "Ôàéë %s áóäåò óäàë¸í! " +STRING_DEL_ERROR6, "Âû óâåðåíû (Y/N)?" +STRING_DEL_ERROR7, "Óäàëåíèå: %s\n" +STRING_ERROR_ERROR1, "Íåèçâåñòíàÿ îøèáêà! Êîä îøèáêè: 0x%lx\n" +STRING_ERROR_ERROR2, "Ñèíòàêñè÷åñêàÿ îøèáêà" +STRING_FOR_ERROR1, "'in' îòñóòñòâóåò â êîìàíäå for." +STRING_FOR_ERROR2, "ñêîáîê íåîáíàðóæåíî." +STRING_FOR_ERROR3, "'do' îòñóòñâóåò." +STRING_FOR_ERROR4, "íåò êîìàíäû ïîñëå 'do'." +STRING_FREE_ERROR1, "Íåïðàâèëüíîå èìÿ äèñêà" +STRING_FREE_ERROR2, "unlabeled" +STRING_GOTO_ERROR1, "Íå îïðåäåëåíà ìåòêà äëÿ GOTO" +STRING_GOTO_ERROR2, "Ìåòêà '%s' íå íàéäåíà\n" + +STRING_MOVE_ERROR1, "[OK]\n" +STRING_MOVE_ERROR2, "[Îøèáêà]\n" + +STRING_REN_ERROR1, "Âûïîëíåíèå MoveFile() áûëî íåóñïåøíûì. Îøèáêà: %lu\n" + +STRING_START_ERROR1, "Íà äàííûé ìîìåíò íåò ïîääåðæêè ïàêåòíûõ ôàéëîâ!" + +STRING_TIME_ERROR1, "Íåïðàâèëüíîå âðåìÿ." + +STRING_TYPE_ERROR1, "Íåïðàâèëüíûé ïàðàìåòð '/%s'\n" + +STRING_WINDOW_ERROR1, "îêíî íå íàéäåíî" + + +STRING_ERROR_PARAMETERF_ERROR, "Íåêîððåêòíûé ôîðìàò ïàðàìåòðà - %c\n" +STRING_ERROR_INVALID_SWITCH, "Íåâåðíûàÿ îïöèÿ - /%c\n" +STRING_ERROR_TOO_MANY_PARAMETERS, "Ñëèøêîì ìíîãî ïàðàìåòðîâ - %s\n" +STRING_ERROR_PATH_NOT_FOUND, "Ïóòü íå íàéäåí\n" +STRING_ERROR_FILE_NOT_FOUND, "Ôàéë íå íàéäåí\n" +STRING_ERROR_REQ_PARAM_MISSING, "Îòñóòñòâóåò íåîáõîäèìûé ïàðàìåòð\n" +STRING_ERROR_INVALID_DRIVE, "Îøèáî÷íîå îïðåäåëåíèå äèñêà\n" +STRING_ERROR_INVALID_PARAM_FORMAT, "Îøèáî÷íûé ôîðìàò ïàðàìåòðà - %s\n" +STRING_ERROR_BADCOMMAND, "Íåïðàâèëüíàÿ êîìàíäà èëè èìÿ ôàéëà\n" +STRING_ERROR_OUT_OF_MEMORY, "Íåõâàòêà ïàìÿòè.\n" +STRING_ERROR_CANNOTPIPE, "Îøèáêà! Íåâîçìîæíî èñïîëüçîâàòü pipe! Íåâîçìîæíî ñîçäàòü âðåìåííûé ôàéë!\n" +STRING_ERROR_D_PAUSEMSG, "Äëÿ ïðîäîëæåíèÿ íàæìèòå ëþáóþ êëàâèøó . . ." +STRING_ERROR_DRIVER_NOT_READY, "Óñòðîéñòâî íå ãîòîâî" + +STRING_PATH_ERROR, "CMD: Íå â ñðåäå îêðóæåíèÿ '%s'\n" + +STRING_CMD_SHELLINFO, "\nReactOS Command Line Interpreter" +STRING_VERSION_RUNVER, " çàïóùåí íà %s" +STRING_COPY_FILE , " %d ôàéë(îâ) ñêîïèðîâàíî\n" +STRING_DELETE_WIPE, "wiped" +STRING_FOR_ERROR, "íåïðàâèëüíîå çàäàíèå ïåðåìåííîé." +STRING_SCREEN_COL, "íåïðàâèëüíîå çíà÷åíèå äëÿ êîë" +STRING_SCREEN_ROW, "íåïðàâèëüíîå çíà÷åíèå äëÿ ñòð" +STRING_TIMER_TIME "Timer %d is %s: " + +STRING_INVALID_OPERAND, "Íåâåðíûé îïåðàíä." +STRING_EXPECTED_CLOSE_PAREN, "Îæèäàåòñÿ ')'." +STRING_EXPECTED_NUMBER_OR_VARIABLE,"Îæèäàåòñÿ ÷èñëî èëè íàçâàíèå ïåðåìåííîé." +STRING_SYNTAX_COMMAND_INCORRECT, "Íåêîððåêòíûé ñèíòàêñèñ êîìàíäû." + +} diff --git a/reactos/base/shell/cmd/alias.c b/reactos/base/shell/cmd/alias.c new file mode 100644 index 00000000000..a3aebd2cd68 --- /dev/null +++ b/reactos/base/shell/cmd/alias.c @@ -0,0 +1,344 @@ +/* + * ALIAS.C - alias administration module. + * + * + * History: + * + * 02/02/1996 (Oliver Mueller) + * started. + * + * 02/03/1996 (Oliver Mueller) + * Added sorting algorithm and case sensitive substitution by using + * partstrupr(). + * + * 27 Jul 1998 John P. Price + * added config.h include + * added ifdef's to disable aliases + * + * 09-Dec-1998 (Eric Kohl ) + * Fixed crash when removing an alias in DeleteAlias(). + * Added help text ("/?"). + * + * 14-Jan-1998 (Eric Kohl ) + * Clean up and Unicode safe! + * + * 24-Jan-1998 (Eric Kohl ) + * Redirection safe! + * + * 02-Apr-2005 (Magnus Olsen) ) + * Remove all hardcode string to En.rc + */ + + +#include +#include "resource.h" + +#ifdef FEATURE_ALIASES + +typedef struct tagALIAS +{ + struct tagALIAS *next; + LPTSTR lpName; + LPTSTR lpSubst; + DWORD dwUsed; +} ALIAS, *LPALIAS; + + +static LPALIAS lpFirst = NULL; +static LPALIAS lpLast = NULL; +static DWORD dwUsed = 0; + + +/* module internal functions */ +/* strlwr only for first word in string */ +static VOID +partstrlwr (LPTSTR str) +{ + LPTSTR c = str; + while (*c && !_istspace (*c) && *c != _T('=')) + { + *c = _totlower (*c); + c++; + } +} + + +static VOID +PrintAlias (VOID) +{ + LPALIAS ptr = lpFirst; + while (ptr) + { + ConOutPrintf (_T("%s=%s\n"), ptr->lpName, ptr->lpSubst); + ptr = ptr->next; + } +} + + +static VOID +DeleteAlias (LPTSTR pszName) +{ + LPALIAS ptr = lpFirst; + LPALIAS prev = NULL; + + while (ptr) + { + if (!_tcsicmp (ptr->lpName, pszName)) + { + if (prev) + prev->next = ptr->next; + else + lpFirst = ptr->next; + free (ptr->lpName); + free (ptr->lpSubst); + free (ptr); + return; + } + prev = ptr; + ptr = ptr->next; + } +} + + +static VOID +AddAlias (LPTSTR name, LPTSTR subst) +{ + LPALIAS ptr = lpFirst; + LPALIAS prev, entry; + LPTSTR s; + + while (ptr) + { + if (!_tcsicmp (ptr->lpName, name)) + { + s = (LPTSTR)malloc ((_tcslen (subst) + 1)*sizeof(TCHAR)); + if (!s) + { + error_out_of_memory (); + return; + } + + free (ptr->lpSubst); + ptr->lpSubst = s; + _tcscpy (ptr->lpSubst, subst); + return; + } + ptr = ptr->next; + } + + ptr = (LPALIAS)malloc (sizeof (ALIAS)); + if (!ptr) + return; + + ptr->next = 0; + + ptr->lpName = (LPTSTR)malloc ((_tcslen (name) + 1)*sizeof(TCHAR)); + if (!ptr->lpName) + { + error_out_of_memory (); + free (ptr); + return; + } + _tcscpy (ptr->lpName, name); + + ptr->lpSubst = (LPTSTR)malloc ((_tcslen (subst) + 1)*sizeof(TCHAR)); + if (!ptr->lpSubst) + { + error_out_of_memory (); + free (ptr->lpName); + free (ptr); + return; + } + _tcscpy (ptr->lpSubst, subst); + + /* it's necessary for recursive substitution */ + partstrlwr (ptr->lpSubst); + + ptr->dwUsed = 0; + + /* Alias table must be sorted! + * Here a little example: + * command line = "ls -c" + * If the entries are + * ls=dir + * ls -c=ls /w + * command line will be expanded to "dir -c" which is not correct. + * If the entries are sortet as + * ls -c=ls /w + * ls=dir + * it will be expanded to "dir /w" which is a valid DOS command. + */ + entry = lpFirst; + prev = 0; + while (entry) + { + if (_tcsicmp (ptr->lpName, entry->lpName) > 0) + { + if (prev) + { + prev->next = ptr; + ptr->next = entry; + } + else + { + ptr->next = entry; + lpFirst = ptr; + } + return; + } + prev = entry; + entry = entry->next; + } + + /* The new entry is the smallest (or the first) and must be + * added to the end of the list. + */ + if (!lpFirst) + lpFirst = ptr; + else + lpLast->next = ptr; + lpLast = ptr; + + return; +} + + +VOID InitializeAlias (VOID) +{ + lpFirst = NULL; + lpLast = NULL; + dwUsed = 0; +} + +VOID DestroyAlias (VOID) +{ + if (lpFirst == NULL) + return; + + while (lpFirst->next != NULL) + { + lpLast = lpFirst; + lpFirst = lpLast->next; + + free (lpLast->lpName); + free (lpLast->lpSubst); + free (lpLast); + } + + free (lpFirst->lpName); + free (lpFirst->lpSubst); + free (lpFirst); + + lpFirst = NULL; + lpLast = NULL; + dwUsed = 0; +} + +/* specified routines */ +VOID ExpandAlias (LPTSTR cmd, INT maxlen) +{ + unsigned n = 0, + m, + i, + len; + short d = 1; + LPALIAS ptr = lpFirst; + + dwUsed++; + if (dwUsed == 0) + { + while (ptr) + ptr->dwUsed = 0; + ptr = lpFirst; + dwUsed = 1; + } + + /* skipping white spaces */ + while (_istspace (cmd[n])) + n++; + + partstrlwr (&cmd[n]); + + if (!_tcsncmp (&cmd[n], _T("NOALIAS"), 7) && + (_istspace (cmd[n + 7]) || cmd[n + 7] == _T('\0'))) + { + memmove (cmd, &cmd[n + 7], (_tcslen (&cmd[n + 7]) + 1) * sizeof (TCHAR)); + return; + } + + /* substitution loop */ + while (d) + { + d = 0; + while (ptr) + { + len = _tcslen (ptr->lpName); + if (!_tcsncmp (&cmd[n], ptr->lpName, len) && + (_istspace (cmd[n + len]) || cmd[n + len] == _T('\0')) && + ptr->dwUsed != dwUsed) + { + m = _tcslen (ptr->lpSubst); + if ((int)(_tcslen (cmd) - len + m - n) > maxlen) + { + ConErrResPuts(STRING_ALIAS_ERROR); + + /* the parser won't cause any problems with an empty line */ + cmd[0] = _T('\0'); + } + else + { + memmove (&cmd[m], &cmd[n + len], (_tcslen(&cmd[n + len]) + 1) * sizeof (TCHAR)); + for (i = 0; i < m; i++) + cmd[i] = ptr->lpSubst[i]; + ptr->dwUsed = dwUsed; + /* whitespaces are removed! */ + n = 0; + d = 1; + } + } + ptr = ptr->next; + } + } +} + + +INT CommandAlias (LPTSTR cmd, LPTSTR param) +{ + LPTSTR ptr; + + if (!_tcsncmp (param, _T("/?"), 2)) + { + ConOutResPaging(TRUE,STRING_ALIAS_HELP); + return 0; + } + + nErrorLevel = 0; + + if (param[0] == _T('\0')) + { + PrintAlias (); + return 0; + } + + nErrorLevel = 0; + + /* error if no '=' found */ + if ((ptr = _tcschr (param, _T('='))) == 0) + { + nErrorLevel = 1; + return 1; + } + + /* Split rest into name and substitute */ + *ptr++ = _T('\0'); + + partstrlwr (param); + + if (ptr[0] == _T('\0')) + DeleteAlias (param); + else + AddAlias (param, ptr); + + return 0; +} +#endif diff --git a/reactos/base/shell/cmd/attrib.c b/reactos/base/shell/cmd/attrib.c new file mode 100644 index 00000000000..d5deefee8c8 --- /dev/null +++ b/reactos/base/shell/cmd/attrib.c @@ -0,0 +1,346 @@ +/* + * ATTRIB.C - attrib internal command. + * + * + * History: + * + * 04-Dec-1998 (Eric Kohl ) + * started + * + * 09-Dec-1998 (Eric Kohl ) + * implementation works, except recursion ("attrib /s"). + * + * 05-Jan-1999 (Eric Kohl ) + * major rewrite. + * fixed recursion ("attrib /s"). + * started directory support ("attrib /s /d"). + * updated help text. + * + * 14-Jan-1999 (Eric Kohl ) + * Unicode ready! + * + * 19-Jan-1999 (Eric Kohl ) + * Redirection ready! + * + * 21-Jan-1999 (Eric Kohl ) + * Added check for invalid filenames. + * + * 23-Jan-1999 (Eric Kohl ) + * Added handling of multiple filenames. + * + * 02-Apr-2005 (Magnus Olsen) ) + * Remove all hardcode string to En.rc + */ + +#include +#include "resource.h" + +#ifdef INCLUDE_CMD_ATTRIB + + +static VOID +PrintAttribute (LPTSTR pszPath, LPTSTR pszFile, BOOL bRecurse) +{ + WIN32_FIND_DATA findData; + HANDLE hFind; + TCHAR szFullName[MAX_PATH]; + LPTSTR pszFileName; + + /* prepare full file name buffer */ + _tcscpy (szFullName, pszPath); + pszFileName = szFullName + _tcslen (szFullName); + + /* display all subdirectories */ + if (bRecurse) + { + /* append file name */ + _tcscpy (pszFileName, pszFile); + + hFind = FindFirstFile (szFullName, &findData); + if (hFind == INVALID_HANDLE_VALUE) + { + ErrorMessage (GetLastError (), pszFile); + return; + } + + do + { + if (!(findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) + continue; + + if (!_tcscmp (findData.cFileName, _T(".")) || + !_tcscmp (findData.cFileName, _T(".."))) + continue; + + _tcscpy (pszFileName, findData.cFileName); + _tcscat (pszFileName, _T("\\")); + PrintAttribute (szFullName, pszFile, bRecurse); + } + while (FindNextFile (hFind, &findData)); + FindClose (hFind); + } + + /* append file name */ + _tcscpy (pszFileName, pszFile); + + /* display current directory */ + hFind = FindFirstFile (szFullName, &findData); + if (hFind == INVALID_HANDLE_VALUE) + { + ErrorMessage (GetLastError (), pszFile); + return; + } + + do + { + if (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + continue; + + _tcscpy (pszFileName, findData.cFileName); + + ConOutPrintf (_T("%c %c%c%c %s\n"), + (findData.dwFileAttributes & FILE_ATTRIBUTE_ARCHIVE) ? _T('A') : _T(' '), + (findData.dwFileAttributes & FILE_ATTRIBUTE_SYSTEM) ? _T('S') : _T(' '), + (findData.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) ? _T('H') : _T(' '), + (findData.dwFileAttributes & FILE_ATTRIBUTE_READONLY) ? _T('R') : _T(' '), + szFullName); + } + while (FindNextFile (hFind, &findData)); + FindClose (hFind); +} + + +static VOID +ChangeAttribute (LPTSTR pszPath, LPTSTR pszFile, DWORD dwMask, + DWORD dwAttrib, BOOL bRecurse, BOOL bDirectories) +{ + WIN32_FIND_DATA findData; + HANDLE hFind; + DWORD dwAttribute; + TCHAR szFullName[MAX_PATH]; + LPTSTR pszFileName; + + + /* prepare full file name buffer */ + _tcscpy (szFullName, pszPath); + pszFileName = szFullName + _tcslen (szFullName); + + /* change all subdirectories */ + if (bRecurse) + { + /* append file name */ + _tcscpy (pszFileName, _T("*.*")); + + hFind = FindFirstFile (szFullName, &findData); + if (hFind == INVALID_HANDLE_VALUE) + { + ErrorMessage (GetLastError (), pszFile); + nErrorLevel = 1; + return; + } + + do + { + if (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + { + if (!_tcscmp (findData.cFileName, _T(".")) || + !_tcscmp (findData.cFileName, _T(".."))) + continue; + + _tcscpy (pszFileName, findData.cFileName); + _tcscat (pszFileName, _T("\\")); + + ChangeAttribute (szFullName, pszFile, dwMask, + dwAttrib, bRecurse, bDirectories); + } + } + while (FindNextFile (hFind, &findData)); + FindClose (hFind); + } + + /* append file name */ + _tcscpy (pszFileName, pszFile); + + hFind = FindFirstFile (szFullName, &findData); + if (hFind == INVALID_HANDLE_VALUE) + { + ErrorMessage (GetLastError (), pszFile); + nErrorLevel = 1; + return; + } + + do + { + if (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + continue; + + _tcscpy (pszFileName, findData.cFileName); + + dwAttribute = GetFileAttributes (szFullName); + + if (dwAttribute != 0xFFFFFFFF) + { + dwAttribute = (dwAttribute & ~dwMask) | dwAttrib; + SetFileAttributes (szFullName, dwAttribute); + } + } + while (FindNextFile (hFind, &findData)); + FindClose (hFind); +} + + +INT CommandAttrib (LPTSTR cmd, LPTSTR param) +{ + LPTSTR *arg; + INT argc, i; + TCHAR szPath[MAX_PATH]; + TCHAR szFileName [MAX_PATH]; + BOOL bRecurse = FALSE; + BOOL bDirectories = FALSE; + DWORD dwAttrib = 0; + DWORD dwMask = 0; + + /* initialize strings */ + szPath[0] = _T('\0'); + szFileName[0] = _T('\0'); + + /* print help */ + if (!_tcsncmp (param, _T("/?"), 2)) + { + ConOutResPaging(TRUE,STRING_ATTRIB_HELP); + return 0; + } + + nErrorLevel = 0; + + /* build parameter array */ + arg = split (param, &argc, FALSE); + + /* check for options */ + for (i = 0; i < argc; i++) + { + if (_tcsicmp (arg[i], _T("/s")) == 0) + bRecurse = TRUE; + else if (_tcsicmp (arg[i], _T("/d")) == 0) + bDirectories = TRUE; + } + + /* create attributes and mask */ + for (i = 0; i < argc; i++) + { + if (*arg[i] == _T('+')) + { + if (_tcslen (arg[i]) != 2) + { + error_invalid_parameter_format (arg[i]); + freep (arg); + return -1; + } + + switch ((TCHAR)_totupper (arg[i][1])) + { + case _T('A'): + dwMask |= FILE_ATTRIBUTE_ARCHIVE; + dwAttrib |= FILE_ATTRIBUTE_ARCHIVE; + break; + + case _T('H'): + dwMask |= FILE_ATTRIBUTE_HIDDEN; + dwAttrib |= FILE_ATTRIBUTE_HIDDEN; + break; + + case _T('R'): + dwMask |= FILE_ATTRIBUTE_READONLY; + dwAttrib |= FILE_ATTRIBUTE_READONLY; + break; + + case _T('S'): + dwMask |= FILE_ATTRIBUTE_SYSTEM; + dwAttrib |= FILE_ATTRIBUTE_SYSTEM; + break; + + default: + error_invalid_parameter_format (arg[i]); + freep (arg); + return -1; + } + } + else if (*arg[i] == _T('-')) + { + if (_tcslen (arg[i]) != 2) + { + error_invalid_parameter_format (arg[i]); + freep (arg); + return -1; + } + + switch ((TCHAR)_totupper (arg[i][1])) + { + case _T('A'): + dwMask |= FILE_ATTRIBUTE_ARCHIVE; + dwAttrib &= ~FILE_ATTRIBUTE_ARCHIVE; + break; + + case _T('H'): + dwMask |= FILE_ATTRIBUTE_HIDDEN; + dwAttrib &= ~FILE_ATTRIBUTE_HIDDEN; + break; + + case _T('R'): + dwMask |= FILE_ATTRIBUTE_READONLY; + dwAttrib &= ~FILE_ATTRIBUTE_READONLY; + break; + + case _T('S'): + dwMask |= FILE_ATTRIBUTE_SYSTEM; + dwAttrib &= ~FILE_ATTRIBUTE_SYSTEM; + break; + + default: + error_invalid_parameter_format (arg[i]); + freep (arg); + return -1; + } + } + } + + if (argc == 0) + { + DWORD len; + + len = GetCurrentDirectory (MAX_PATH, szPath); + if (szPath[len-1] != _T('\\')) + { + szPath[len] = _T('\\'); + szPath[len + 1] = 0; + } + _tcscpy (szFileName, _T("*.*")); + PrintAttribute (szPath, szFileName, bRecurse); + freep (arg); + return 0; + } + + /* get full file name */ + for (i = 0; i < argc; i++) + { + if ((*arg[i] != _T('+')) && (*arg[i] != _T('-')) && (*arg[i] != _T('/'))) + { + LPTSTR p; + GetFullPathName (arg[i], MAX_PATH, szPath, NULL); + p = _tcsrchr (szPath, _T('\\')) + 1; + _tcscpy (szFileName, p); + *p = _T('\0'); + + if (dwMask == 0) + PrintAttribute (szPath, szFileName, bRecurse); + else + ChangeAttribute (szPath, szFileName, dwMask, + dwAttrib, bRecurse, bDirectories); + } + } + + freep (arg); + return 0; +} + +#endif /* INCLUDE_CMD_ATTRIB */ diff --git a/reactos/base/shell/cmd/batch.c b/reactos/base/shell/cmd/batch.c new file mode 100644 index 00000000000..f15547ccc32 --- /dev/null +++ b/reactos/base/shell/cmd/batch.c @@ -0,0 +1,459 @@ +/* + * BATCH.C - batch file processor for CMD.EXE. + * + * + * History: + * + * ??/??/?? (Evan Jeffrey) + * started. + * + * 15 Jul 1995 (Tim Norman) + * modes and bugfixes. + * + * 08 Aug 1995 (Matt Rains) + * i have cleaned up the source code. changes now bring this + * source into guidelines for recommended programming practice. + * + * i have added some constants to help making changes easier. + * + * 29 Jan 1996 (Steffan Kaiser) + * made a few cosmetic changes + * + * 05 Feb 1996 (Tim Norman) + * changed to comply with new first/rest calling scheme + * + * 14 Jun 1997 (Steffen Kaiser) + * bug fixes. added error level expansion %?. ctrl-break handling + * + * 16 Jul 1998 (Hans B Pufal) + * Totally reorganised in conjunction with COMMAND.C (cf) to + * implement proper BATCH file nesting and other improvements. + * + * 16 Jul 1998 (John P Price ) + * Seperated commands into individual files. + * + * 19 Jul 1998 (Hans B Pufal) [HBP_001] + * Preserve state of echo flag across batch calls. + * + * 19 Jul 1998 (Hans B Pufal) [HBP_002] + * Implementation of FOR command + * + * 20-Jul-1998 (John P Price ) + * added error checking after malloc calls + * + * 27-Jul-1998 (John P Price ) + * added config.h include + * + * 02-Aug-1998 (Hans B Pufal) [HBP_003] + * Fixed bug in ECHO flag restoration at exit from batch file + * + * 26-Jan-1999 (Eric Kohl ) + * Replaced CRT io functions by Win32 io functions. + * Unicode safe! + * + * 23-Feb-2001 (Carl Nettelblad ) + * Fixes made to get "for" working. + * + * 02-Apr-2005 (Magnus Olsen) ) + * Remove all hardcode string to En.rc + */ + +#include +#include "resource.h" + + +/* The stack of current batch contexts. + * NULL when no batch is active + */ +LPBATCH_CONTEXT bc = NULL; + +BOOL bEcho = TRUE; /* The echo flag */ + + + +/* Buffer for reading Batch file lines */ +TCHAR textline[BATCH_BUFFSIZE]; + + +/* + * Returns a pointer to the n'th parameter of the current batch file. + * If no such parameter exists returns pointer to empty string. + * If no batch file is current, returns NULL + * + */ + +LPTSTR FindArg (INT n) +{ + LPTSTR pp; + +#ifdef _DEBUG + DebugPrintf (_T("FindArg: (%d)\n"), n); +#endif + + if (bc == NULL) + return NULL; + + n += bc->shiftlevel; + pp = bc->params; + + /* Step up the strings till we reach the end */ + /* or the one we want */ + while (*pp && n--) + pp += _tcslen (pp) + 1; + + return pp; +} + + +/* + * Batch_params builds a parameter list in newlay allocated memory. + * The parameters consist of null terminated strings with a final + * NULL character signalling the end of the parameters. + * +*/ + +LPTSTR BatchParams (LPTSTR s1, LPTSTR s2) +{ + LPTSTR dp = (LPTSTR)malloc ((_tcslen(s1) + _tcslen(s2) + 3) * sizeof (TCHAR)); + + /* JPP 20-Jul-1998 added error checking */ + if (dp == NULL) + { + error_out_of_memory(); + return NULL; + } + + if (s1 && *s1) + { + s1 = _stpcpy (dp, s1); + *s1++ = _T('\0'); + } + else + s1 = dp; + + while (*s2) + { + if (_istspace (*s2) || _tcschr (_T(",;"), *s2)) + { + *s1++ = _T('\0'); + s2++; + while (*s2 && _tcschr (_T(" ,;"), *s2)) + s2++; + continue; + } + + if ((*s2 == _T('"')) || (*s2 == _T('\''))) + { + TCHAR st = *s2; + + do + *s1++ = *s2++; + while (*s2 && (*s2 != st)); + } + + *s1++ = *s2++; + } + + *s1++ = _T('\0'); + *s1 = _T('\0'); + + return dp; +} + + +/* + * If a batch file is current, exits it, freeing the context block and + * chaining back to the previous one. + * + * If no new batch context is found, sets ECHO back ON. + * + * If the parameter is non-null or not empty, it is printed as an exit + * message + */ + +VOID ExitBatch (LPTSTR msg) +{ +#ifdef _DEBUG + DebugPrintf (_T("ExitBatch: (\'%s\')\n"), msg); +#endif + + if (bc != NULL) + { + LPBATCH_CONTEXT t = bc; + + if (bc->hBatchFile) + { + CloseHandle (bc->hBatchFile); + bc->hBatchFile = INVALID_HANDLE_VALUE; + } + + if (bc->params) + free(bc->params); + + if (bc->forproto) + free(bc->forproto); + + if (bc->ffind) + free(bc->ffind); + + /* Preserve echo state across batch calls */ + bEcho = bc->bEcho; + + bc = bc->prev; + free(t); + } + + if (msg && *msg) + ConOutPrintf (_T("%s\n"), msg); +} + + +/* + * Start batch file execution + * + * The firstword parameter is the full filename of the batch file. + * + */ + +BOOL Batch (LPTSTR fullname, LPTSTR firstword, LPTSTR param) +{ + HANDLE hFile; + SetLastError(0); + hFile = CreateFile (fullname, GENERIC_READ, FILE_SHARE_WRITE | FILE_SHARE_READ | FILE_SHARE_DELETE, NULL, + OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | + FILE_FLAG_SEQUENTIAL_SCAN, NULL); + +#ifdef _DEBUG + DebugPrintf (_T("Batch: (\'%s\', \'%s\', \'%s\') hFile = %x\n"), + fullname, firstword, param, hFile); +#endif + + if (hFile == INVALID_HANDLE_VALUE) + { + ConErrResPuts(STRING_BATCH_ERROR); + return FALSE; + } + + /* Kill any and all FOR contexts */ + while (bc && bc->forvar) + ExitBatch (NULL); + + if (bc == NULL) + { + /* No curent batch file, create a new context */ + LPBATCH_CONTEXT n = (LPBATCH_CONTEXT)malloc (sizeof(BATCH_CONTEXT)); + + if (n == NULL) + { + error_out_of_memory (); + return FALSE; + } + + n->prev = bc; + bc = n; + bc->In[0] = _T('\0'); + bc->Out[0] = _T('\0'); + bc->Err[0] = _T('\0'); + } + else if (bc->hBatchFile != INVALID_HANDLE_VALUE) + { + /* Then we are transferring to another batch */ + CloseHandle (bc->hBatchFile); + bc->hBatchFile = INVALID_HANDLE_VALUE; + free (bc->params); + } + + bc->hBatchFile = hFile; + SetFilePointer (bc->hBatchFile, 0, NULL, FILE_BEGIN); + bc->bEcho = bEcho; /* Preserve echo across batch calls */ + bc->shiftlevel = 0; + + bc->ffind = NULL; + bc->forvar = _T('\0'); + bc->forproto = NULL; + bc->params = BatchParams (firstword, param); + +#ifdef _DEBUG + DebugPrintf (_T("Batch: returns TRUE\n")); +#endif + + return TRUE; +} + +VOID AddBatchRedirection(TCHAR * ifn, TCHAR * ofn, TCHAR * efn) +{ + if(!bc) + return; + if(_tcslen(ifn)) + _tcscpy(bc->In,ifn); + if(_tcslen(ofn)) + _tcscpy(bc->Out,ofn); + if(_tcslen(efn)) + _tcscpy(bc->Err,efn); + +} + +/* + * Read and return the next executable line form the current batch file + * + * If no batch file is current or no further executable lines are found + * return NULL. + * + * Here we also look out for FOR bcontext structures which trigger the + * FOR expansion code. + * + * Set eflag to 0 if line is not to be echoed else 1 + */ + +LPTSTR ReadBatchLine (LPBOOL bLocalEcho) +{ + LPTSTR first; + LPTSTR ip; + + /* No batch */ + if (bc == NULL) + return NULL; + +#ifdef _DEBUG + DebugPrintf (_T("ReadBatchLine ()\n")); +#endif + + while (1) + { + /* User halt */ + if (CheckCtrlBreak (BREAK_BATCHFILE)) + { + while (bc) + ExitBatch (NULL); + return NULL; + } + + /* No batch */ + if (bc == NULL) + return NULL; + + /* If its a FOR context... */ + if (bc->forvar) + { + LPTSTR sp = bc->forproto; /* pointer to prototype command */ + LPTSTR dp = textline; /* Place to expand protoype */ + LPTSTR fv = FindArg (0); /* Next list element */ + + /* End of list so... */ + if ((fv == NULL) || (*fv == _T('\0'))) + { + /* just exit this context */ + ExitBatch (NULL); + continue; + } + + if (_tcscspn (fv, _T("?*")) == _tcslen (fv)) + { + /* element is wild file */ + bc->shiftlevel++; /* No use it and shift list */ + } + else + { + /* Wild file spec, find first (or next) file name */ + if (bc->ffind) + { + /* First already done so do next */ + + fv = FindNextFile (bc->hFind, bc->ffind) ? bc->ffind->cFileName : NULL; + } + else + { + /* For first find, allocate a find first block */ + if ((bc->ffind = (LPWIN32_FIND_DATA)malloc (sizeof (WIN32_FIND_DATA))) == NULL) + { + error_out_of_memory(); + return NULL; + } + + bc->hFind = FindFirstFile (fv, bc->ffind); + + fv = !(bc->hFind==INVALID_HANDLE_VALUE) ? bc->ffind->cFileName : NULL; + } + + if (fv == NULL) + { + /* Null indicates no more files.. */ + free (bc->ffind); /* free the buffer */ + bc->ffind = NULL; + bc->shiftlevel++; /* On to next list element */ + continue; + } + } + + /* At this point, fv points to parameter string */ + while (*sp) + { + if ((*sp == _T('%')) && (*(sp + 1) == bc->forvar)) + { + /* replace % var */ + dp = _stpcpy (dp, fv); + sp += 2; + } + else + { + /* Else just copy */ + *dp++ = *sp++; + } + } + + *dp = _T('\0'); + + *bLocalEcho = bEcho; + + return textline; + } + + if (!FileGetString (bc->hBatchFile, textline, sizeof (textline) / sizeof (textline[0]))) + { +#ifdef _DEBUG + DebugPrintf (_T("ReadBatchLine(): Reached EOF!\n")); +#endif + /* End of file.... */ + ExitBatch (NULL); + + if (bc == NULL) + return NULL; + + continue; + } +#ifdef _DEBUG + DebugPrintf (_T("ReadBatchLine(): textline: \'%s\'\n"), textline); +#endif + + /* Strip leading spaces and trailing space/control chars */ + for (first = textline; _istspace (*first); first++) + ; + + for (ip = first + _tcslen (first) - 1; _istspace (*ip) || _istcntrl (*ip); ip--) + ; + + *++ip = _T('\0'); + + /* ignore labels and empty lines */ + if (*first == _T(':') || *first == 0) + continue; + + if (*first == _T('@')) + { + /* don't echo this line */ + do + first++; + while (_istspace (*first)); + + *bLocalEcho = 0; + } + else + *bLocalEcho = bEcho; + + break; + } + + return first; +} + +/* EOF */ diff --git a/reactos/base/shell/cmd/batch.h b/reactos/base/shell/cmd/batch.h new file mode 100644 index 00000000000..9e68abb6d83 --- /dev/null +++ b/reactos/base/shell/cmd/batch.h @@ -0,0 +1,47 @@ +/* + * BATCH.H - A structure to preserve the context of a batch file + * + * + */ + +#ifndef _BATCH_H_INCLUDED_ +#define _BATCH_H_INCLUDED_ + + +typedef struct tagBATCHCONTEXT +{ + struct tagBATCHCONTEXT *prev; + LPWIN32_FIND_DATA ffind; + HANDLE hBatchFile; + LPTSTR forproto; + LPTSTR params; + INT shiftlevel; + BOOL bEcho; /* Preserve echo flag across batch calls */ + HANDLE hFind; /* Preserve find handle when doing a for */ + TCHAR In[MAX_PATH]; + TCHAR Out[MAX_PATH]; + TCHAR Err[MAX_PATH]; + TCHAR forvar; +} BATCH_CONTEXT, *LPBATCH_CONTEXT; + + +/* The stack of current batch contexts. + * NULL when no batch is active + */ +extern LPBATCH_CONTEXT bc; + +extern BOOL bEcho; /* The echo flag */ + +#define BATCH_BUFFSIZE 2048 + +extern TCHAR textline[BATCH_BUFFSIZE]; /* Buffer for reading Batch file lines */ + + +LPTSTR FindArg (INT); +LPTSTR BatchParams (LPTSTR, LPTSTR); +VOID ExitBatch (LPTSTR); +BOOL Batch (LPTSTR, LPTSTR, LPTSTR); +LPTSTR ReadBatchLine (LPBOOL); +VOID AddBatchRedirection(TCHAR *, TCHAR *, TCHAR *); + +#endif /* _BATCH_H_INCLUDED_ */ diff --git a/reactos/base/shell/cmd/beep.c b/reactos/base/shell/cmd/beep.c new file mode 100644 index 00000000000..61537ed5cc4 --- /dev/null +++ b/reactos/base/shell/cmd/beep.c @@ -0,0 +1,50 @@ +/* + * BEEP.C - beep internal command. + * + * + * History: + * + * 16 Jul 1998 (Hans B Pufal) + * started. + * + * 16 Jul 1998 (John P Price) + * Separated commands into individual files. + * + * 27-Jul-1998 (John P Price ) + * added config.h include + * + * 14-Jan-1999 (Eric Kohl ) + * Added help text ("beep /?"). + * Unicode ready! + * + * 20-Jan-1999 (Eric Kohl ) + * Redirection ready! + * + * 02-Apr-2005 (Magnus Olsen) ) + * Remove all hardcode string to En.rc + */ + +#include +#include "resource.h" + +#ifdef INCLUDE_CMD_BEEP + + +INT cmd_beep (LPTSTR cmd, LPTSTR param) +{ + if (_tcsncmp (param, _T("/?"), 2) == 0) + { + ConOutResPaging(TRUE,STRING_BEEP_HELP); + return 0; + } + +#if 0 + /* check if run in batch mode */ + if (bc == NULL) + return 1; +#endif + MessageBeep (-1); + + return 0; +} +#endif diff --git a/reactos/base/shell/cmd/call.c b/reactos/base/shell/cmd/call.c new file mode 100644 index 00000000000..08c10d129d0 --- /dev/null +++ b/reactos/base/shell/cmd/call.c @@ -0,0 +1,100 @@ +/* + * CALL.C - call internal batch command. + * + * + * History: + * + * 16 Jul 1998 (Hans B Pufal) + * started. + * + * 16 Jul 1998 (John P Price) + * Seperated commands into individual files. + * + * 27-Jul-1998 (John P Price ) + * added config.h include + * + * 04-Aug-1998 (Hans B Pufal) + * added lines to initialize for pointers (HBP004) This fixed the + * lock-up that happened sometimes when calling a batch file from + * another batch file. + * + * 07-Jan-1999 (Eric Kohl ) + * Added help text ("call /?") and cleaned up. + * + * 20-Jan-1999 (Eric Kohl ) + * Unicode and redirection safe! + * + * 02-Apr-2005 (Magnus Olsen) ) + * Remove all hardcode string to En.rc + */ + +#include +#include "resource.h" + + +/* + * Perform CALL command. + * + * Allocate a new batch context and add it to the current chain. + * Call parsecommandline passing in our param string + * If No batch file was opened then remove our newly allocted + * context block. + */ + +INT cmd_call (LPTSTR cmd, LPTSTR param) +{ + LPBATCH_CONTEXT n = NULL; + +#ifdef _DEBUG + DebugPrintf (_T("cmd_call: (\'%s\',\'%s\')\n"), cmd, param); +#endif + if (!_tcsncmp (param, _T("/?"), 2)) + { + ConOutResPaging(TRUE,STRING_CALL_HELP); + return 0; + } + + nErrorLevel = 0; + + n = (LPBATCH_CONTEXT)malloc (sizeof (BATCH_CONTEXT)); + + if (n == NULL) + { + error_out_of_memory (); + return 1; + } + + n->prev = bc; + bc = n; + + bc->hBatchFile = INVALID_HANDLE_VALUE; + bc->params = NULL; + bc->shiftlevel = 0; + bc->forvar = 0; /* HBP004 */ + bc->forproto = NULL; /* HBP004 */ + ParseCommandLine (param); + if (bc->prev) + { + _tcscpy(bc->In, bc->prev->In); + _tcscpy(bc->Out, bc->prev->Out); + _tcscpy(bc->Err, bc->prev->Err); + } + else + { + bc->In[0] = _T('\0'); + bc->Out[0] = _T('\0'); + bc->Err[0] = _T('\0'); + } + + + /* Wasn't a batch file so remove conext */ + if (bc->hBatchFile == INVALID_HANDLE_VALUE) + { + bc = bc->prev; + free (n); + } + + return 0; +} + +/* EOF */ diff --git a/reactos/base/shell/cmd/chcp.c b/reactos/base/shell/cmd/chcp.c new file mode 100644 index 00000000000..bf34ded3533 --- /dev/null +++ b/reactos/base/shell/cmd/chcp.c @@ -0,0 +1,85 @@ +/* + * CHCP.C - chcp internal command. + * + * + * History: + * + * 23-Dec-1998 (Eric Kohl ) + * Started. + * + * 02-Apr-2005 (Magnus Olsen) ) + * Remove all hardcode string to En.rc + */ + +#include +#include "resource.h" + + + +#ifdef INCLUDE_CMD_CHCP + +INT CommandChcp (LPTSTR cmd, LPTSTR param) +{ + TCHAR szMsg[RC_STRING_MAX_SIZE]; + LPTSTR *arg; + INT args; + UINT uNewCodePage; + + /* print help */ + if (!_tcsncmp (param, _T("/?"), 2)) + { + ConOutResPaging(TRUE,STRING_CHCP_HELP); + return 0; + } + + nErrorLevel = 0; + + /* get parameters */ + arg = split (param, &args, FALSE); + + if (args == 0) + { + /* display active code page number */ + LoadString(CMD_ModuleHandle, STRING_CHCP_ERROR1, szMsg, RC_STRING_MAX_SIZE); + ConErrPrintf(szMsg, InputCodePage); + return 0; + } + + if (args >= 2) + { + /* too many parameters */ + LoadString(CMD_ModuleHandle, STRING_ERROR_INVALID_PARAM_FORMAT, szMsg, RC_STRING_MAX_SIZE); + ConErrPrintf(szMsg, param); + nErrorLevel = 1; + return 1; + } + + uNewCodePage = (UINT)_ttoi(arg[0]); + + if (uNewCodePage == 0) + { + LoadString(CMD_ModuleHandle, STRING_ERROR_INVALID_PARAM_FORMAT, szMsg, RC_STRING_MAX_SIZE); + ConErrPrintf(szMsg, arg[0]); + freep (arg); + nErrorLevel = 1; + return 1; + } + + if (!SetConsoleCP(uNewCodePage)) + { + ConErrResPuts(STRING_CHCP_ERROR4); + } + else + { + + SetConsoleOutputCP (uNewCodePage); + InitLocale (); + InputCodePage= GetConsoleCP(); + } + + freep (arg); + + return 0; +} + +#endif /* INCLUDE_CMD_CHCP */ diff --git a/reactos/base/shell/cmd/choice.c b/reactos/base/shell/cmd/choice.c new file mode 100644 index 00000000000..095a6b5e83d --- /dev/null +++ b/reactos/base/shell/cmd/choice.c @@ -0,0 +1,327 @@ +/* + * CHOICE.C - internal command. + * + * + * History: + * + * 12 Aug 1999 (Eric Kohl) + * started. + * + * 01 Sep 1999 (Eric Kohl) + * Fixed help text. + * + * 26 Sep 1999 (Paolo Pantaleo) + * Fixed timeout. + * + * 02 Apr 2005 (Magnus Olsen + * Remove Hardcode string so + * they can be translate + * + */ + +#include +#include "resource.h" + +#ifdef INCLUDE_CMD_CHOICE + + +#define GC_TIMEOUT -1 +#define GC_NOKEY 0 //an event occurred but it wasn't a key pressed +#define GC_KEYREAD 1 //a key has been read + + +static INT +GetCharacterTimeout (LPTCH ch, DWORD dwMilliseconds) +{ +//-------------------------------------------- +// Get a character from standard input but with a timeout. +// The function will wait a limited amount +// of time, then the function returns GC_TIMEOUT. +// +// dwMilliseconds is the timeout value, that can +// be set to INFINITE, so the function works like +// stdio.h's getchar() + + HANDLE hInput; + DWORD dwRead; + + INPUT_RECORD lpBuffer; + + hInput = GetStdHandle (STD_INPUT_HANDLE); + + //if the timeout experied return GC_TIMEOUT + if (WaitForSingleObject (hInput, dwMilliseconds) == WAIT_TIMEOUT) + return GC_TIMEOUT; + + //otherwise get the event + ReadConsoleInput (hInput, &lpBuffer, 1, &dwRead); + + //if the event is a key pressed + if ((lpBuffer.EventType == KEY_EVENT) && + (lpBuffer.Event.KeyEvent.bKeyDown == TRUE)) + { + //read the key +#ifdef _UNICODE + *ch = lpBuffer.Event.KeyEvent.uChar.UnicodeChar; +#else + *ch = lpBuffer.Event.KeyEvent.uChar.AsciiChar; +#endif + return GC_KEYREAD; + } + + //else return no key + return GC_NOKEY; +} + +static INT +IsKeyInString (LPTSTR lpString, TCHAR cKey, BOOL bCaseSensitive) +{ + LPTCH p = lpString; + INT val = 0; + + while (*p) + { + if (bCaseSensitive) + { + if (*p == cKey) + return val; + } + else + { + if (_totlower (*p) == _totlower (cKey)) + return val; + } + + val++; + p++; + } + + return -1; +} + + +INT +CommandChoice (LPTSTR cmd, LPTSTR param) +{ + TCHAR szMsg[RC_STRING_MAX_SIZE]; + LPTSTR lpOptions; + TCHAR Options[6]; + LPTSTR lpText = NULL; + BOOL bNoPrompt = FALSE; + BOOL bCaseSensitive = FALSE; + BOOL bTimeout = FALSE; + INT nTimeout = 0; + TCHAR cDefault = _T('\0'); + INPUT_RECORD ir; + LPTSTR p, np; + LPTSTR *arg; + INT argc; + INT i; + INT val; + + INT GCret; + TCHAR Ch; + DWORD amount,clk; + + LoadString(CMD_ModuleHandle, STRING_CHOICE_OPTION, Options, 4); + lpOptions = Options; + + if (_tcsncmp (param, _T("/?"), 2) == 0) + { + ConOutResPaging(TRUE,STRING_CHOICE_HELP); + return 0; + } + + /* retrieve text */ + p = param; + + while (TRUE) + { + if (*p == _T('\0')) + break; + + if (*p != _T('/')) + { + lpText = p; + break; + } + np = _tcschr (p, _T(' ')); + if (!np) + break; + p = np + 1; + } + + /* build parameter array */ + arg = split (param, &argc, FALSE); + + /* evaluate arguments */ + if (argc > 0) + { + for (i = 0; i < argc; i++) + { + if (_tcsnicmp (arg[i], _T("/c"), 2) == 0) + { + if (arg[i][2] == _T(':')) + lpOptions = &arg[i][3]; + else + lpOptions = &arg[i][2]; + + if (_tcslen (lpOptions) == 0) + { + ConErrResPuts(STRING_CHOICE_ERROR); + freep (arg); + return 1; + } + } + else if (_tcsnicmp (arg[i], _T("/n"), 2) == 0) + { + bNoPrompt = TRUE; + } + else if (_tcsnicmp (arg[i], _T("/s"), 2) == 0) + { + bCaseSensitive = TRUE; + } + else if (_tcsnicmp (arg[i], _T("/t"), 2) == 0) + { + LPTSTR s; + + if (arg[i][2] == _T(':')) + { + cDefault = arg[i][3]; + s = &arg[i][4]; + } + else + { + cDefault = arg[i][2]; + s = &arg[i][3]; + } + + if (*s != _T(',')) + { + ConErrResPuts(STRING_CHOICE_ERROR_TXT); + freep (arg); + return 1; + } + + s++; + nTimeout = _ttoi(s); + bTimeout = TRUE; + } + else if (arg[i][0] == _T('/')) + { + LoadString(CMD_ModuleHandle, STRING_CHOICE_ERROR_OPTION, szMsg, RC_STRING_MAX_SIZE); + ConErrPrintf(szMsg, arg[i]); + freep (arg); + return 1; + } + } + } + + /* print text */ + if (lpText) + ConOutPrintf (_T("%s"), lpText); + + /* print options */ + if (bNoPrompt == FALSE) + { + ConOutPrintf (_T("[%c"), lpOptions[0]); + + for (i = 1; (unsigned)i < _tcslen (lpOptions); i++) + ConOutPrintf (_T(",%c"), lpOptions[i]); + + ConOutPrintf (_T("]?")); + } + + ConInFlush (); + + if(!bTimeout) + { + while (TRUE) + { + ConInKey (&ir); + + val = IsKeyInString (lpOptions, +#ifdef _UNICODE + ir.Event.KeyEvent.uChar.UnicodeChar, +#else + ir.Event.KeyEvent.uChar.AsciiChar, +#endif + bCaseSensitive); + + if (val >= 0) + { + ConOutPrintf (_T("%c\n"), lpOptions[val]); + + nErrorLevel = val + 1; + + break; + } + + Beep (440, 50); + } + + freep (arg); +#ifdef _DEBUG + DebugPrintf (_T("ErrorLevel: %d\n"), nErrorLevel); +#endif /* _DEBUG */ + return 0; + } + + clk = GetTickCount (); + amount = nTimeout*1000; + +loop: + GCret = GetCharacterTimeout (&Ch, amount - (GetTickCount () - clk)); + + switch (GCret) + { + case GC_TIMEOUT: +#ifdef _DEBUG + DebugPrintf (_T("GC_TIMEOUT\n")); + DebugPrintf (_T("elapsed %d msecs\n"), GetTickCount () - clk); +#endif /* _DEBUG */ + break; + + case GC_NOKEY: +#ifdef _DEBUG + DebugPrintf(_T("GC_NOKEY\n")); + DebugPrintf(_T("elapsed %d msecs\n"), GetTickCount () - clk); +#endif /* _DEBUG */ + goto loop; + + case GC_KEYREAD: +#ifdef _DEBUG + DebugPrintf(_T("GC_KEYREAD\n")); + DebugPrintf(_T("elapsed %d msecs\n"), GetTickCount () - clk); + DebugPrintf(_T("read %c"), Ch); +#endif /* _DEBUG */ + if ((val=IsKeyInString(lpOptions,Ch,bCaseSensitive))==-1) + { + Beep (440, 50); + goto loop; + } + cDefault=Ch; + break; + } + +#ifdef _DEBUG + DebugPrintf(_T("exiting wait loop after %d msecs\n"), + GetTickCount () - clk); +#endif /* _DEBUG */ + + val = IsKeyInString (lpOptions, cDefault, bCaseSensitive); + ConOutPrintf (_T("%c\n"), lpOptions[val]); + + nErrorLevel = val + 1; + + freep (arg); + +#ifdef _DEBUG + DebugPrintf (_T("ErrorLevel: %d\n"), nErrorLevel); +#endif /* _DEBUG */ + + return 0; +} +#endif /* INCLUDE_CMD_CHOICE */ + +/* EOF */ diff --git a/reactos/base/shell/cmd/cls.c b/reactos/base/shell/cmd/cls.c new file mode 100644 index 00000000000..b2e98d761b6 --- /dev/null +++ b/reactos/base/shell/cmd/cls.c @@ -0,0 +1,62 @@ +/* + * CLS.C - clear screen internal command. + * + * + * History: + * + * 07/27/1998 (John P. Price) + * started. + * + * 27-Jul-1998 (John P Price ) + * added config.h include + * + * 04-Dec-1998 (Eric Kohl ) + * Changed to Win32 console app. + * + * 08-Dec-1998 (Eric Kohl ) + * Added help text ("/?"). + * + * 14-Jan-1998 (Eric Kohl ) + * Unicode ready! + * + * 20-Jan-1998 (Eric Kohl ) + * Redirection ready! + * + * 02-Apr-2005 (Magnus Olsen) ) + * Remove all hardcode string to En.rc + */ + +#include +#include "resource.h" + +#ifdef INCLUDE_CMD_CLS + +INT cmd_cls (LPTSTR cmd, LPTSTR param) +{ + CONSOLE_SCREEN_BUFFER_INFO csbi; + COORD coPos; + DWORD dwWritten; + + if (!_tcsncmp (param, _T("/?"), 2)) + { + ConOutResPaging(TRUE,STRING_CLS_HELP); + return 0; + } + + GetConsoleScreenBufferInfo(hConsole, &csbi); + + coPos.X = 0; + coPos.Y = 0; + FillConsoleOutputAttribute(hConsole, wColor, + csbi.dwSize.X * csbi.dwSize.Y, + coPos, &dwWritten); + FillConsoleOutputCharacter(hConsole, _T(' '), + csbi.dwSize.X * csbi.dwSize.Y, + coPos, &dwWritten); + SetConsoleCursorPosition(hConsole, coPos); + + bIgnoreEcho = TRUE; + + return 0; +} +#endif diff --git a/reactos/base/shell/cmd/cmd.c b/reactos/base/shell/cmd/cmd.c new file mode 100644 index 00000000000..2652447a681 --- /dev/null +++ b/reactos/base/shell/cmd/cmd.c @@ -0,0 +1,1865 @@ +/* + * CMD.C - command-line interface. + * + * + * History: + * + * 17 Jun 1994 (Tim Norman) + * started. + * + * 08 Aug 1995 (Matt Rains) + * I have cleaned up the source code. changes now bring this source + * into guidelines for recommended programming practice. + * + * A added the the standard FreeDOS GNU licence test to the + * initialize() function. + * + * Started to replace puts() with printf(). this will help + * standardize output. please follow my lead. + * + * I have added some constants to help making changes easier. + * + * 15 Dec 1995 (Tim Norman) + * major rewrite of the code to make it more efficient and add + * redirection support (finally!) + * + * 06 Jan 1996 (Tim Norman) + * finished adding redirection support! Changed to use our own + * exec code (MUCH thanks to Svante Frey!!) + * + * 29 Jan 1996 (Tim Norman) + * added support for CHDIR, RMDIR, MKDIR, and ERASE, as per + * suggestion of Steffan Kaiser + * + * changed "file not found" error message to "bad command or + * filename" thanks to Dustin Norman for noticing that confusing + * message! + * + * changed the format to call internal commands (again) so that if + * they want to split their commands, they can do it themselves + * (none of the internal functions so far need that much power, anyway) + * + * 27 Aug 1996 (Tim Norman) + * added in support for Oliver Mueller's ALIAS command + * + * 14 Jun 1997 (Steffan Kaiser) + * added ctrl-break handling and error level + * + * 16 Jun 1998 (Rob Lake) + * Runs command.com if /P is specified in command line. Command.com + * also stays permanent. If /C is in the command line, starts the + * program next in the line. + * + * 21 Jun 1998 (Rob Lake) + * Fixed up /C so that arguments for the program + * + * 08-Jul-1998 (John P. Price) + * Now sets COMSPEC environment variable + * misc clean up and optimization + * added date and time commands + * changed to using spawnl instead of exec. exec does not copy the + * environment to the child process! + * + * 14 Jul 1998 (Hans B Pufal) + * Reorganised source to be more efficient and to more closely + * follow MS-DOS conventions. (eg %..% environment variable + * replacement works form command line as well as batch file. + * + * New organisation also properly support nested batch files. + * + * New command table structure is half way towards providing a + * system in which COMMAND will find out what internal commands + * are loaded + * + * 24 Jul 1998 (Hans B Pufal) [HBP_003] + * Fixed return value when called with /C option + * + * 27 Jul 1998 John P. Price + * added config.h include + * + * 28 Jul 1998 John P. Price + * added showcmds function to show commands and options available + * + * 07-Aug-1998 (John P Price ) + * Fixed carrage return output to better match MSDOS with echo + * on or off. (marked with "JPP 19980708") + * + * 07-Dec-1998 (Eric Kohl ) + * First ReactOS release. + * Extended length of commandline buffers to 512. + * + * 13-Dec-1998 (Eric Kohl ) + * Added COMSPEC environment variable. + * Added "/t" support (color) on cmd command line. + * + * 07-Jan-1999 (Eric Kohl ) + * Added help text ("cmd /?"). + * + * 25-Jan-1999 (Eric Kohl ) + * Unicode and redirection safe! + * Fixed redirections and piping. + * Piping is based on temporary files, but basic support + * for anonymous pipes already exists. + * + * 27-Jan-1999 (Eric Kohl ) + * Replaced spawnl() by CreateProcess(). + * + * 22-Oct-1999 (Eric Kohl ) + * Added break handler. + * + * 15-Dec-1999 (Eric Kohl ) + * Fixed current directory + * + * 28-Dec-1999 (Eric Kohl ) + * Restore window title after program/batch execution + * + * 03-Feb-2001 (Eric Kohl ) + * Workaround because argc[0] is NULL under ReactOS + * + * 23-Feb-2001 (Carl Nettelblad ) + * %envvar% replacement conflicted with for. + * + * 30-Apr-2004 (Filip Navara ) + * Make MakeSureDirectoryPathExistsEx unicode safe. + * + * 28-Mai-2004 + * Removed MakeSureDirectoryPathExistsEx. + * Use the current directory if GetTempPath fails. + * + * 12-Jul-2004 (Jens Collin ) + * Added ShellExecute call when all else fails to be able to "launch" any file. + * + * 02-Apr-2005 (Magnus Olsen ) + * Remove all hardcode string to En.rc + * + * 06-May-2005 (Klemens Friedl ) + * Add 'help' command (list all commands plus description) + * + * 06-jul-2005 (Magnus Olsen ) + * translate '%errorlevel%' to the internal value. + * Add proper memmory alloc ProcessInput, the error + * handling for memmory handling need to be improve + */ + +#include +#include +#include "resource.h" + +#ifndef NT_SUCCESS +#define NT_SUCCESS(StatCode) ((NTSTATUS)(StatCode) >= 0) +#endif + +typedef NTSTATUS (WINAPI *NtQueryInformationProcessProc)(HANDLE, PROCESSINFOCLASS, + PVOID, ULONG, PULONG); +typedef NTSTATUS (WINAPI *NtReadVirtualMemoryProc)(HANDLE, PVOID, PVOID, ULONG, PULONG); + +BOOL bExit = FALSE; /* indicates EXIT was typed */ +BOOL bCanExit = TRUE; /* indicates if this shell is exitable */ +BOOL bCtrlBreak = FALSE; /* Ctrl-Break or Ctrl-C hit */ +BOOL bIgnoreEcho = FALSE; /* Ignore 'newline' before 'cls' */ +INT nErrorLevel = 0; /* Errorlevel of last launched external program */ +BOOL bChildProcessRunning = FALSE; +DWORD dwChildProcessId = 0; +OSVERSIONINFO osvi; +HANDLE hIn; +HANDLE hOut; +HANDLE hConsole; +HANDLE CMD_ModuleHandle; +HMODULE NtDllModule; + +static NtQueryInformationProcessProc NtQueryInformationProcessPtr = NULL; +static NtReadVirtualMemoryProc NtReadVirtualMemoryPtr = NULL; + +#ifdef INCLUDE_CMD_COLOR +WORD wColor; /* current color */ +WORD wDefColor; /* default color */ +#endif + +/* + * convert + * + * insert commas into a number + */ +INT +ConvertULargeInteger (ULARGE_INTEGER num, LPTSTR des, INT len, BOOL bPutSeperator) +{ + TCHAR temp[32]; + INT c = 0; + INT n = 0; + + if (num.QuadPart == 0) + { + des[0] = _T('0'); + des[1] = _T('\0'); + n = 1; + } + else + { + temp[31] = 0; + while (num.QuadPart > 0) + { + if ((((c + 1) % (nNumberGroups + 1)) == 0) && (bPutSeperator)) + temp[30 - c++] = cThousandSeparator; + temp[30 - c++] = (TCHAR)(num.QuadPart % 10) + _T('0'); + num.QuadPart /= 10; + } + + for (n = 0; n <= c; n++) + des[n] = temp[31 - c + n]; + } + + return n; +} + +/* + * is character a delimeter when used on first word? + * + */ +static BOOL IsDelimiter (TCHAR c) +{ + return (c == _T('/') || c == _T('=') || c == _T('\0') || _istspace (c)); +} + +/* + * Is a process a console process? + */ +static BOOL IsConsoleProcess(HANDLE Process) +{ + NTSTATUS Status; + PROCESS_BASIC_INFORMATION Info; + PEB ProcessPeb; + ULONG BytesRead; + + if (NULL == NtQueryInformationProcessPtr || NULL == NtReadVirtualMemoryPtr) + { + return TRUE; + } + + Status = NtQueryInformationProcessPtr ( + Process, ProcessBasicInformation, + &Info, sizeof(PROCESS_BASIC_INFORMATION), NULL); + if (! NT_SUCCESS(Status)) + { +#ifdef _DEBUG + DebugPrintf (_T("NtQueryInformationProcess failed with status %08x\n"), Status); +#endif + return TRUE; + } + Status = NtReadVirtualMemoryPtr ( + Process, Info.PebBaseAddress, &ProcessPeb, + sizeof(PEB), &BytesRead); + if (! NT_SUCCESS(Status) || sizeof(PEB) != BytesRead) + { +#ifdef _DEBUG + DebugPrintf (_T("Couldn't read virt mem status %08x bytes read %lu\n"), Status, BytesRead); +#endif + return TRUE; + } + + return IMAGE_SUBSYSTEM_WINDOWS_CUI == ProcessPeb.ImageSubSystem; +} + + + +#ifdef _UNICODE +#define SHELLEXECUTETEXT "ShellExecuteW" +#else +#define SHELLEXECUTETEXT "ShellExecuteA" +#endif + +typedef HINSTANCE (WINAPI *MYEX)( + HWND hwnd, + LPCTSTR lpOperation, + LPCTSTR lpFile, + LPCTSTR lpParameters, + LPCTSTR lpDirectory, + INT nShowCmd +); + + + +static BOOL RunFile(LPTSTR filename) +{ + HMODULE hShell32; + MYEX hShExt; + HINSTANCE ret; + +#ifdef _DEBUG + DebugPrintf (_T("RunFile(%s)\n"), filename); +#endif + hShell32 = LoadLibrary(_T("SHELL32.DLL")); + if (!hShell32) + { +#ifdef _DEBUG + DebugPrintf (_T("RunFile: couldn't load SHELL32.DLL!\n")); +#endif + return FALSE; + } + + hShExt = (MYEX)(FARPROC)GetProcAddress(hShell32, SHELLEXECUTETEXT); + if (!hShExt) + { +#ifdef _DEBUG + DebugPrintf (_T("RunFile: couldn't find ShellExecuteA/W in SHELL32.DLL!\n")); +#endif + FreeLibrary(hShell32); + return FALSE; + } + +#ifdef _DEBUG + DebugPrintf (_T("RunFile: ShellExecuteA/W is at %x\n"), hShExt); +#endif + + ret = (hShExt)(NULL, _T("open"), filename, NULL, NULL, SW_SHOWNORMAL); + +#ifdef _DEBUG + DebugPrintf (_T("RunFile: ShellExecuteA/W returned %d\n"), (DWORD)ret); +#endif + + FreeLibrary(hShell32); + return (((DWORD)ret) > 32); +} + + + +/* + * This command (in first) was not found in the command table + * + * Full - whole command line + * First - first word on command line + * Rest - rest of command line + */ + +static VOID +Execute (LPTSTR Full, LPTSTR First, LPTSTR Rest) +{ + TCHAR *szFullName=NULL; + TCHAR *first = NULL; + TCHAR *rest = NULL; + TCHAR *full = NULL; + TCHAR *dot = NULL; + TCHAR szWindowTitle[MAX_PATH]; + DWORD dwExitCode = 0; + +#ifdef _DEBUG + DebugPrintf (_T("Execute: \'%s\' \'%s\'\n"), first, rest); +#endif + + /* we need biger buffer that First, Rest, Full are already + need rewrite some code to use realloc when it need instead + of add 512bytes extra */ + + first = malloc ( (_tcslen(First) + 512) * sizeof(TCHAR)); + if (first == NULL) + { + error_out_of_memory(); + nErrorLevel = 1; + return ; + } + + rest = malloc ( (_tcslen(Rest) + 512) * sizeof(TCHAR)); + if (rest == NULL) + { + free (first); + error_out_of_memory(); + nErrorLevel = 1; + return ; + } + + full = malloc ( (_tcslen(Full) + 512) * sizeof(TCHAR)); + if (full == NULL) + { + free (first); + free (rest); + error_out_of_memory(); + nErrorLevel = 1; + return ; + } + + szFullName = malloc ( (_tcslen(Full) + 512) * sizeof(TCHAR)); + if (full == NULL) + { + free (first); + free (rest); + free (full); + error_out_of_memory(); + nErrorLevel = 1; + return ; + } + + + /* Though it was already parsed once, we have a different set of rules + for parsing before we pass to CreateProccess */ + if(!_tcschr(Full,_T('\"'))) + { + _tcscpy(first,First); + _tcscpy(rest,Rest); + _tcscpy(full,Full); + } + else + { + UINT i = 0; + BOOL bInside = FALSE; + rest[0] = _T('\0'); + full[0] = _T('\0'); + first[0] = _T('\0'); + _tcscpy(first,Full); + /* find the end of the command and start of the args */ + for(i = 0; i < _tcslen(first); i++) + { + if(!_tcsncmp(&first[i], _T("\""), 1)) + bInside = !bInside; + if(!_tcsncmp(&first[i], _T(" "), 1) && !bInside) + { + _tcscpy(rest,&first[i]); + first[i] = _T('\0'); + break; + } + + } + i = 0; + /* remove any slashes */ + while(i < _tcslen(first)) + { + if(first[i] == _T('\"')) + memmove(&first[i],&first[i + 1], _tcslen(&first[i]) * sizeof(TCHAR)); + else + i++; + } + /* Drop quotes around it just in case there is a space */ + _tcscpy(full,_T("\"")); + _tcscat(full,first); + _tcscat(full,_T("\" ")); + _tcscat(full,rest); + } + + /* check for a drive change */ + if ((_istalpha (first[0])) && (!_tcscmp (first + 1, _T(":")))) + { + BOOL working = TRUE; + if (!SetCurrentDirectory(first)) + /* Guess they changed disc or something, handle that gracefully and get to root */ + { + TCHAR str[4]; + str[0]=first[0]; + str[1]=_T(':'); + str[2]=_T('\\'); + str[3]=0; + working = SetCurrentDirectory(str); + } + + if (!working) ConErrResPuts (STRING_FREE_ERROR1); + + free (first); + free (rest); + free (full); + free (szFullName); + nErrorLevel = 1; + return; + } + + /* get the PATH environment variable and parse it */ + /* search the PATH environment variable for the binary */ + if (!SearchForExecutable (first, szFullName)) + { + error_bad_command (); + free (first); + free (rest); + free (full); + free (szFullName); + nErrorLevel = 1; + return; + + } + + GetConsoleTitle (szWindowTitle, MAX_PATH); + + /* check if this is a .BAT or .CMD file */ + dot = _tcsrchr (szFullName, _T('.')); + if (dot && (!_tcsicmp (dot, _T(".bat")) || !_tcsicmp (dot, _T(".cmd")))) + { +#ifdef _DEBUG + DebugPrintf (_T("[BATCH: %s %s]\n"), szFullName, rest); +#endif + Batch (szFullName, first, rest); + } + else + { + /* exec the program */ + PROCESS_INFORMATION prci; + STARTUPINFO stui; + +#ifdef _DEBUG + DebugPrintf (_T("[EXEC: %s %s]\n"), full, rest); +#endif + /* build command line for CreateProcess() */ + + /* fill startup info */ + memset (&stui, 0, sizeof (STARTUPINFO)); + stui.cb = sizeof (STARTUPINFO); + stui.dwFlags = STARTF_USESHOWWINDOW; + stui.wShowWindow = SW_SHOWDEFAULT; + + // return console to standard mode + SetConsoleMode (GetStdHandle(STD_INPUT_HANDLE), + ENABLE_LINE_INPUT | ENABLE_PROCESSED_INPUT | ENABLE_ECHO_INPUT ); + + if (CreateProcess (szFullName, + full, + NULL, + NULL, + TRUE, + 0, /* CREATE_NEW_PROCESS_GROUP */ + NULL, + NULL, + &stui, + &prci)) + + { + if (IsConsoleProcess(prci.hProcess)) + { + /* FIXME: Protect this with critical section */ + bChildProcessRunning = TRUE; + dwChildProcessId = prci.dwProcessId; + + WaitForSingleObject (prci.hProcess, INFINITE); + + /* FIXME: Protect this with critical section */ + bChildProcessRunning = FALSE; + + GetExitCodeProcess (prci.hProcess, &dwExitCode); + nErrorLevel = (INT)dwExitCode; + } + else + { + nErrorLevel = 0; + } + CloseHandle (prci.hThread); + CloseHandle (prci.hProcess); + } + else + { +#ifdef _DEBUG + DebugPrintf (_T("[ShellExecute: %s]\n"), full); +#endif + // See if we can run this with ShellExecute() ie myfile.xls + if (!RunFile(full)) + { +#ifdef _DEBUG + DebugPrintf (_T("[ShellExecute failed!: %s]\n"), full); +#endif + error_bad_command (); + nErrorLevel = 1; + } + else + { + nErrorLevel = 0; + } + } + // restore console mode + SetConsoleMode ( + GetStdHandle( STD_INPUT_HANDLE ), + ENABLE_PROCESSED_INPUT ); + } + + /* Get code page if it has been change */ + InputCodePage= GetConsoleCP(); + OutputCodePage = GetConsoleOutputCP(); + SetConsoleTitle (szWindowTitle); + + free(first); + free(rest); + free(full); + free (szFullName); +} + + +/* + * look through the internal commands and determine whether or not this + * command is one of them. If it is, call the command. If not, call + * execute to run it as an external program. + * + * line - the command line of the program to run + * + */ + +static VOID +DoCommand (LPTSTR line) +{ + TCHAR *com = NULL; /* the first word in the command */ + TCHAR *cp = NULL; + LPTSTR cstart; + LPTSTR rest; /* pointer to the rest of the command line */ + INT cl; + LPCOMMAND cmdptr; + +#ifdef _DEBUG + DebugPrintf (_T("DoCommand: (\'%s\')\n"), line); +#endif /* DEBUG */ + + com = malloc( (_tcslen(line) +512)*sizeof(TCHAR) ); + if (com == NULL) + { + error_out_of_memory(); + return; + } + + cp = com; + /* Skip over initial white space */ + while (_istspace (*line)) + line++; + rest = line; + + cstart = rest; + + /* Anything to do ? */ + if (*rest) + { + if (*rest == _T('"')) + { + /* treat quoted words specially */ + + rest++; + + while(*rest != _T('\0') && *rest != _T('"')) + *cp++ = _totlower (*rest++); + if (*rest == _T('"')) + rest++; + } + else + { + while (!IsDelimiter (*rest)) + *cp++ = _totlower (*rest++); + } + + + /* Terminate first word */ + *cp = _T('\0'); + + /* Do not limit commands to MAX_PATH */ + /* + if(_tcslen(com) > MAX_PATH) + { + error_bad_command(); + free(com); + return; + } + */ + + /* Skip over whitespace to rest of line, exclude 'echo' command */ + if (_tcsicmp (com, _T("echo"))) + { + while (_istspace (*rest)) + rest++; + } + + /* Scan internal command table */ + for (cmdptr = cmds;; cmdptr++) + { + /* If end of table execute ext cmd */ + if (cmdptr->name == NULL) + { + Execute (line, com, rest); + break; + } + + if (!_tcscmp (com, cmdptr->name)) + { + cmdptr->func (com, rest); + break; + } + + /* The following code handles the case of commands like CD which + * are recognised even when the command name and parameter are + * not space separated. + * + * e.g dir.. + * cd\freda + */ + + /* Get length of command name */ + cl = _tcslen (cmdptr->name); + + if ((cmdptr->flags & CMD_SPECIAL) && + (!_tcsncmp (cmdptr->name, com, cl)) && + (_tcschr (_T("\\.-"), *(com + cl)))) + { + /* OK its one of the specials...*/ + + /* Terminate first word properly */ + com[cl] = _T('\0'); + + /* Call with new rest */ + cmdptr->func (com, cstart + cl); + break; + } + } + } + free(com); +} + + +/* + * process the command line and execute the appropriate functions + * full input/output redirection and piping are supported + */ + +VOID ParseCommandLine (LPTSTR cmd) +{ + TCHAR szMsg[RC_STRING_MAX_SIZE]; + TCHAR cmdline[CMDLINE_LENGTH]; + LPTSTR s; +#ifdef FEATURE_REDIRECTION + TCHAR in[CMDLINE_LENGTH] = _T(""); + TCHAR out[CMDLINE_LENGTH] = _T(""); + TCHAR err[CMDLINE_LENGTH] = _T(""); + TCHAR szTempPath[MAX_PATH] = _T(".\\"); + TCHAR szFileName[2][MAX_PATH] = {_T(""), _T("")}; + HANDLE hFile[2] = {INVALID_HANDLE_VALUE, INVALID_HANDLE_VALUE}; + LPTSTR t = NULL; + INT num = 0; + INT nRedirFlags = 0; + INT Length; + UINT Attributes; + BOOL bNewBatch = TRUE; + HANDLE hOldConIn; + HANDLE hOldConOut; + HANDLE hOldConErr; +#endif /* FEATURE_REDIRECTION */ + + _tcscpy (cmdline, cmd); + s = &cmdline[0]; + +#ifdef _DEBUG + DebugPrintf (_T("ParseCommandLine: (\'%s\')\n"), s); +#endif /* DEBUG */ + +#ifdef FEATURE_ALIASES + /* expand all aliases */ + ExpandAlias (s, CMDLINE_LENGTH); +#endif /* FEATURE_ALIAS */ + +#ifdef FEATURE_REDIRECTION + /* find the temp path to store temporary files */ + Length = GetTempPath (MAX_PATH, szTempPath); + if (Length > 0 && Length < MAX_PATH) + { + Attributes = GetFileAttributes(szTempPath); + if (Attributes == 0xffffffff || + !(Attributes & FILE_ATTRIBUTE_DIRECTORY)) + { + Length = 0; + } + } + if (Length == 0 || Length >= MAX_PATH) + { + _tcscpy(szTempPath, _T(".\\")); + } + if (szTempPath[_tcslen (szTempPath) - 1] != _T('\\')) + _tcscat (szTempPath, _T("\\")); + + /* get the redirections from the command line */ + num = GetRedirection (s, in, out, err, &nRedirFlags); + + /* more efficient, but do we really need to do this? */ + for (t = in; _istspace (*t); t++) + ; + _tcscpy (in, t); + + for (t = out; _istspace (*t); t++) + ; + _tcscpy (out, t); + + for (t = err; _istspace (*t); t++) + ; + _tcscpy (err, t); + + if(bc && !_tcslen (in) && _tcslen (bc->In)) + _tcscpy(in, bc->In); + if(bc && !out[0] && _tcslen(bc->Out)) + { + nRedirFlags |= OUTPUT_APPEND; + _tcscpy(out, bc->Out); + } + if(bc && !_tcslen (err) && _tcslen (bc->Err)) + { + nRedirFlags |= ERROR_APPEND; + _tcscpy(err, bc->Err); + } + + + /* Set up the initial conditions ... */ + /* preserve STDIN, STDOUT and STDERR handles */ + hOldConIn = GetStdHandle (STD_INPUT_HANDLE); + hOldConOut = GetStdHandle (STD_OUTPUT_HANDLE); + hOldConErr = GetStdHandle (STD_ERROR_HANDLE); + + /* redirect STDIN */ + if (in[0]) + { + HANDLE hFile; + SECURITY_ATTRIBUTES sa = {sizeof(SECURITY_ATTRIBUTES), NULL, TRUE}; + + /* we need make sure the LastError msg is zero before calling CreateFile */ + SetLastError(0); + + /* Set up pipe for the standard input handler */ + hFile = CreateFile (in, GENERIC_READ, FILE_SHARE_READ, &sa, OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL, NULL); + if (hFile == INVALID_HANDLE_VALUE) + { + LoadString(CMD_ModuleHandle, STRING_CMD_ERROR1, szMsg, RC_STRING_MAX_SIZE); + ConErrPrintf(szMsg, in); + return; + } + + if (!SetStdHandle (STD_INPUT_HANDLE, hFile)) + { + LoadString(CMD_ModuleHandle, STRING_CMD_ERROR1, szMsg, RC_STRING_MAX_SIZE); + ConErrPrintf(szMsg, in); + return; + } +#ifdef _DEBUG + DebugPrintf (_T("Input redirected from: %s\n"), in); +#endif + } + + /* Now do all but the last pipe command */ + *szFileName[0] = _T('\0'); + hFile[0] = INVALID_HANDLE_VALUE; + + while (num-- > 1) + { + SECURITY_ATTRIBUTES sa = {sizeof(SECURITY_ATTRIBUTES), NULL, TRUE}; + + /* Create unique temporary file name */ + GetTempFileName (szTempPath, _T("CMD"), 0, szFileName[1]); + + /* we need make sure the LastError msg is zero before calling CreateFile */ + SetLastError(0); + + /* Set current stdout to temporary file */ + hFile[1] = CreateFile (szFileName[1], GENERIC_WRITE, 0, &sa, + TRUNCATE_EXISTING, FILE_ATTRIBUTE_TEMPORARY, NULL); + + if (hFile[1] == INVALID_HANDLE_VALUE) + { + LoadString(CMD_ModuleHandle, STRING_CMD_ERROR2, szMsg, RC_STRING_MAX_SIZE); + ConErrPrintf(szMsg); + return; + } + + SetStdHandle (STD_OUTPUT_HANDLE, hFile[1]); + + DoCommand (s); + + /* close stdout file */ + SetStdHandle (STD_OUTPUT_HANDLE, hOldConOut); + if ((hFile[1] != INVALID_HANDLE_VALUE) && (hFile[1] != hOldConOut)) + { + CloseHandle (hFile[1]); + hFile[1] = INVALID_HANDLE_VALUE; + } + + /* close old stdin file */ + SetStdHandle (STD_INPUT_HANDLE, hOldConIn); + if ((hFile[0] != INVALID_HANDLE_VALUE) && (hFile[0] != hOldConIn)) + { + /* delete old stdin file, if it is a real file */ + CloseHandle (hFile[0]); + hFile[0] = INVALID_HANDLE_VALUE; + DeleteFile (szFileName[0]); + *szFileName[0] = _T('\0'); + } + + /* copy stdout file name to stdin file name */ + _tcscpy (szFileName[0], szFileName[1]); + *szFileName[1] = _T('\0'); + + /* we need make sure the LastError msg is zero before calling CreateFile */ + SetLastError(0); + + /* open new stdin file */ + hFile[0] = CreateFile (szFileName[0], GENERIC_READ, 0, &sa, + OPEN_EXISTING, FILE_ATTRIBUTE_TEMPORARY, NULL); + SetStdHandle (STD_INPUT_HANDLE, hFile[0]); + + s = s + _tcslen (s) + 1; + } + + /* Now set up the end conditions... */ + /* redirect STDOUT */ + if (out[0]) + { + /* Final output to here */ + HANDLE hFile; + SECURITY_ATTRIBUTES sa = {sizeof(SECURITY_ATTRIBUTES), NULL, TRUE}; + + /* we need make sure the LastError msg is zero before calling CreateFile */ + SetLastError(0); + + hFile = CreateFile (out, GENERIC_WRITE, FILE_SHARE_WRITE | FILE_SHARE_READ | FILE_SHARE_DELETE, &sa, + (nRedirFlags & OUTPUT_APPEND) ? OPEN_ALWAYS : CREATE_ALWAYS, + FILE_ATTRIBUTE_NORMAL | FILE_FLAG_WRITE_THROUGH, NULL); + + if (hFile == INVALID_HANDLE_VALUE) + { + INT size = _tcslen(out)-1; + + if (out[size] != _T(':')) + { + LoadString(CMD_ModuleHandle, STRING_CMD_ERROR3, szMsg, RC_STRING_MAX_SIZE); + ConErrPrintf(szMsg, out); + return; + } + + out[size]=_T('\0'); + hFile = CreateFile (out, GENERIC_WRITE, FILE_SHARE_WRITE | FILE_SHARE_READ | FILE_SHARE_DELETE, &sa, + (nRedirFlags & OUTPUT_APPEND) ? OPEN_ALWAYS : CREATE_ALWAYS, + FILE_ATTRIBUTE_NORMAL | FILE_FLAG_WRITE_THROUGH, NULL); + + if (hFile == INVALID_HANDLE_VALUE) + { + LoadString(CMD_ModuleHandle, STRING_CMD_ERROR3, szMsg, RC_STRING_MAX_SIZE); + ConErrPrintf(szMsg, out); + return; + } + + } + + if (!SetStdHandle (STD_OUTPUT_HANDLE, hFile)) + { + LoadString(CMD_ModuleHandle, STRING_CMD_ERROR3, szMsg, RC_STRING_MAX_SIZE); + ConErrPrintf(szMsg, out); + return; + } + + if (nRedirFlags & OUTPUT_APPEND) + { + LONG lHighPos = 0; + + if (GetFileType (hFile) == FILE_TYPE_DISK) + SetFilePointer (hFile, 0, &lHighPos, FILE_END); + } +#ifdef _DEBUG + DebugPrintf (_T("Output redirected to: %s\n"), out); +#endif + } + else if (hOldConOut != INVALID_HANDLE_VALUE) + { + /* Restore original stdout */ + HANDLE hOut = GetStdHandle (STD_OUTPUT_HANDLE); + SetStdHandle (STD_OUTPUT_HANDLE, hOldConOut); + if (hOldConOut != hOut) + CloseHandle (hOut); + hOldConOut = INVALID_HANDLE_VALUE; + } + + /* redirect STDERR */ + if (err[0]) + { + /* Final output to here */ + HANDLE hFile; + SECURITY_ATTRIBUTES sa = {sizeof(SECURITY_ATTRIBUTES), NULL, TRUE}; + + if (!_tcscmp (err, out)) + { +#ifdef _DEBUG + DebugPrintf (_T("Stdout and stderr will use the same file!!\n")); +#endif + DuplicateHandle (GetCurrentProcess (), + GetStdHandle (STD_OUTPUT_HANDLE), + GetCurrentProcess (), + &hFile, 0, TRUE, DUPLICATE_SAME_ACCESS); + } + else + { + hFile = CreateFile (err, + GENERIC_WRITE, + FILE_SHARE_WRITE | FILE_SHARE_READ | FILE_SHARE_DELETE, + &sa, + (nRedirFlags & ERROR_APPEND) ? OPEN_ALWAYS : CREATE_ALWAYS, + FILE_ATTRIBUTE_NORMAL | FILE_FLAG_WRITE_THROUGH, + NULL); + if (hFile == INVALID_HANDLE_VALUE) + { + LoadString(CMD_ModuleHandle, STRING_CMD_ERROR3, szMsg, RC_STRING_MAX_SIZE); + ConErrPrintf(szMsg, err); + return; + } + } + + if (!SetStdHandle (STD_ERROR_HANDLE, hFile)) + { + LoadString(CMD_ModuleHandle, STRING_CMD_ERROR3, szMsg, RC_STRING_MAX_SIZE); + ConErrPrintf(szMsg, err); + return; + } + + if (nRedirFlags & ERROR_APPEND) + { + LONG lHighPos = 0; + + if (GetFileType (hFile) == FILE_TYPE_DISK) + SetFilePointer (hFile, 0, &lHighPos, FILE_END); + } +#ifdef _DEBUG + DebugPrintf (_T("Error redirected to: %s\n"), err); +#endif + } + else if (hOldConErr != INVALID_HANDLE_VALUE) + { + /* Restore original stderr */ + HANDLE hErr = GetStdHandle (STD_ERROR_HANDLE); + SetStdHandle (STD_ERROR_HANDLE, hOldConErr); + if (hOldConErr != hErr) + CloseHandle (hErr); + hOldConErr = INVALID_HANDLE_VALUE; + } + + if(bc) + bNewBatch = FALSE; +#endif + + /* process final command */ + DoCommand (s); + +#ifdef FEATURE_REDIRECTION + if(bNewBatch && bc) + AddBatchRedirection(in, out, err); + /* close old stdin file */ +#if 0 /* buggy implementation */ + SetStdHandle (STD_INPUT_HANDLE, hOldConIn); + if ((hFile[0] != INVALID_HANDLE_VALUE) && + (hFile[0] != hOldConIn)) + { + /* delete old stdin file, if it is a real file */ + CloseHandle (hFile[0]); + hFile[0] = INVALID_HANDLE_VALUE; + DeleteFile (szFileName[0]); + *szFileName[0] = _T('\0'); + } + + /* Restore original STDIN */ + if (hOldConIn != INVALID_HANDLE_VALUE) + { + HANDLE hIn = GetStdHandle (STD_INPUT_HANDLE); + SetStdHandle (STD_INPUT_HANDLE, hOldConIn); + if (hOldConIn != hIn) + CloseHandle (hIn); + hOldConIn = INVALID_HANDLE_VALUE; + } + else + { +#ifdef _DEBUG + DebugPrintf (_T("Can't restore STDIN! Is invalid!!\n"), out); +#endif + } +#endif /* buggy implementation */ + + + if (hOldConIn != INVALID_HANDLE_VALUE) + { + HANDLE hIn = GetStdHandle (STD_INPUT_HANDLE); + SetStdHandle (STD_INPUT_HANDLE, hOldConIn); + if (hIn == INVALID_HANDLE_VALUE) + { +#ifdef _DEBUG + DebugPrintf (_T("Previous STDIN is invalid!!\n")); +#endif + } + else + { + if (GetFileType (hIn) == FILE_TYPE_DISK) + { + if (hFile[0] == hIn) + { + CloseHandle (hFile[0]); + hFile[0] = INVALID_HANDLE_VALUE; + DeleteFile (szFileName[0]); + *szFileName[0] = _T('\0'); + } + else + { +#ifdef _DEBUG + DebugPrintf (_T("hFile[0] and hIn dont match!!!\n")); +#endif + } + } + } + } + + + /* Restore original STDOUT */ + if (hOldConOut != INVALID_HANDLE_VALUE) + { + HANDLE hOut = GetStdHandle (STD_OUTPUT_HANDLE); + SetStdHandle (STD_OUTPUT_HANDLE, hOldConOut); + if (hOldConOut != hOut) + CloseHandle (hOut); + hOldConOut = INVALID_HANDLE_VALUE; + } + + /* Restore original STDERR */ + if (hOldConErr != INVALID_HANDLE_VALUE) + { + HANDLE hErr = GetStdHandle (STD_ERROR_HANDLE); + SetStdHandle (STD_ERROR_HANDLE, hOldConErr); + if (hOldConErr != hErr) + CloseHandle (hErr); + hOldConErr = INVALID_HANDLE_VALUE; + } +#endif /* FEATURE_REDIRECTION */ +} + +BOOL +GrowIfNecessary ( UINT needed, LPTSTR* ret, UINT* retlen ) +{ + if ( *ret && needed < *retlen ) + return TRUE; + *retlen = needed; + if ( *ret ) + free ( *ret ); + *ret = (LPTSTR)malloc ( *retlen * sizeof(TCHAR) ); + if ( !*ret ) + SetLastError ( ERROR_OUTOFMEMORY ); + return *ret != NULL; +} + +LPCTSTR +GetEnvVarOrSpecial ( LPCTSTR varName ) +{ + static LPTSTR ret = NULL; + static UINT retlen = 0; + UINT size; + + size = GetEnvironmentVariable ( varName, ret, retlen ); + if ( size > retlen ) + { + if ( !GrowIfNecessary ( size, &ret, &retlen ) ) + return NULL; + size = GetEnvironmentVariable ( varName, ret, retlen ); + } + if ( size ) + return ret; + + /* env var doesn't exist, look for a "special" one */ + /* %CD% */ + if (_tcsicmp(varName,_T("cd")) ==0) + { + size = GetCurrentDirectory ( retlen, ret ); + if ( size > retlen ) + { + if ( !GrowIfNecessary ( size, &ret, &retlen ) ) + return NULL; + size = GetCurrentDirectory ( retlen, ret ); + } + if ( !size ) + return NULL; + return ret; + } + /* %TIME% */ + else if (_tcsicmp(varName,_T("time")) ==0) + { + SYSTEMTIME t; + if ( !GrowIfNecessary ( MAX_PATH, &ret, &retlen ) ) + return NULL; + GetSystemTime(&t); + _sntprintf ( ret, retlen, _T("%02d%c%02d%c%02d%c%02d"), + t.wHour, cTimeSeparator, t.wMinute, cTimeSeparator, + t.wSecond, cDecimalSeparator, t.wMilliseconds ); + return ret; + } + /* %DATE% */ + else if (_tcsicmp(varName,_T("date")) ==0) + { + LPTSTR tmp; + + if ( !GrowIfNecessary ( MAX_PATH, &ret, &retlen ) ) + return NULL; + size = GetDateFormat(LOCALE_USER_DEFAULT, 0, NULL, _T("ddd"), ret, retlen ); + /* TODO FIXME - test whether GetDateFormat() can return a value indicating the buffer wasn't big enough */ + if ( !size ) + return NULL; + tmp = ret + _tcslen(ret); + *tmp++ = _T(' '); + size = GetDateFormat(LOCALE_USER_DEFAULT, DATE_SHORTDATE, NULL, NULL, tmp, retlen-(tmp-ret)); + /* TODO FIXME - test whether GetDateFormat() can return a value indicating the buffer wasn't big enough */ + if ( !size ) + return NULL; + return ret; + } + + /* %RANDOM% */ + else if (_tcsicmp(varName,_T("random")) ==0) + { + if ( !GrowIfNecessary ( MAX_PATH, &ret, &retlen ) ) + return NULL; + /* Get random number */ + _itot(rand(),ret,10); + return ret; + } + + /* %CMDCMDLINE% */ + else if (_tcsicmp(varName,_T("cmdcmdline")) ==0) + { + return GetCommandLine(); + } + + /* %CMDEXTVERSION% */ + else if (_tcsicmp(varName,_T("cmdextversion")) ==0) + { + if ( !GrowIfNecessary ( MAX_PATH, &ret, &retlen ) ) + return NULL; + /* Set version number to 2 */ + _itot(2,ret,10); + return ret; + } + + /* %ERRORLEVEL% */ + else if (_tcsicmp(varName,_T("errorlevel")) ==0) + { + if ( !GrowIfNecessary ( MAX_PATH, &ret, &retlen ) ) + return NULL; + _itot(nErrorLevel,ret,10); + return ret; + } + + GrowIfNecessary(_tcslen(varName) + 2, &ret, &retlen); + _stprintf(ret,_T("%%%s%%"),varName); + return ret; /* not found - return orginal string */ +} + +LPCTSTR +GetParsedEnvVar ( LPCTSTR varName, UINT* varNameLen, BOOL ModeSetA ) +{ + static LPTSTR ret = NULL; + static UINT retlen = 0; + LPTSTR p, tmp; + UINT size; + + if ( varNameLen ) + *varNameLen = 0; + SetLastError(0); + if ( *varName++ != '%' ) + return NULL; + switch ( *varName ) + { + case _T('0'): + case _T('1'): + case _T('2'): + case _T('3'): + case _T('4'): + case _T('5'): + case _T('6'): + case _T('7'): + case _T('8'): + case _T('9'): + if ((tmp = FindArg (*varName - _T('0')))) + { + if ( varNameLen ) + *varNameLen = 2; + if ( !*tmp ) + return _T(""); + if ( !GrowIfNecessary ( _tcslen(tmp)+1, &ret, &retlen ) ) + return NULL; + _tcscpy ( ret, tmp ); + return ret; + } + if ( !GrowIfNecessary ( 3, &ret, &retlen ) ) + return NULL; + ret[0] = _T('%'); + ret[1] = *varName; + ret[2] = 0; + if ( varNameLen ) + *varNameLen = 2; + return ret; + + case _T('%'): + if ( !GrowIfNecessary ( 2, &ret, &retlen ) ) + return NULL; + ret[0] = _T('%'); + ret[1] = 0; + if ( varNameLen ) + *varNameLen = 2; + return ret; + + case _T('?'): + /* TODO FIXME 10 is only max size for 32-bit */ + if ( !GrowIfNecessary ( 11, &ret, &retlen ) ) + return NULL; + _sntprintf ( ret, retlen, _T("%u"), nErrorLevel); + ret[retlen-1] = 0; + if ( varNameLen ) + *varNameLen = 2; + return ret; + } + if ( ModeSetA ) + { + /* HACK for set/a */ + if ( !GrowIfNecessary ( 2, &ret, &retlen ) ) + return NULL; + ret[0] = _T('%'); + ret[1] = 0; + if ( varNameLen ) + *varNameLen = 1; + return ret; + } + p = _tcschr ( varName, _T('%') ); + if ( !p ) + { + SetLastError ( ERROR_INVALID_PARAMETER ); + return NULL; + } + size = p-varName; + if ( varNameLen ) + *varNameLen = size + 2; + p = alloca ( (size+1) * sizeof(TCHAR) ); + memmove ( p, varName, size * sizeof(TCHAR) ); + p[size] = 0; + varName = p; + return GetEnvVarOrSpecial ( varName ); +} + + +/* + * do the prompt/input/process loop + * + */ + +static INT +ProcessInput (BOOL bFlag) +{ + TCHAR commandline[CMDLINE_LENGTH]; + TCHAR readline[CMDLINE_LENGTH]; + LPTSTR ip; + LPTSTR cp; + LPCTSTR tmp; + BOOL bEchoThisLine; + BOOL bModeSetA; + BOOL bIsBatch; + + do + { + /* if no batch input then... */ + if (!(ip = ReadBatchLine (&bEchoThisLine))) + { + if (bFlag) + return nErrorLevel; + + ReadCommand (readline, CMDLINE_LENGTH); + ip = readline; + bEchoThisLine = FALSE; + bIsBatch = FALSE; + } + else + { + bIsBatch = TRUE; + } + + /* skip leading blanks */ + while ( _istspace(*ip) ) + ++ip; + + cp = commandline; + bModeSetA = FALSE; + while (*ip) + { + if ( *ip == _T('%') ) + { + UINT envNameLen; + LPCTSTR envVal = GetParsedEnvVar ( ip, &envNameLen, bModeSetA ); + if ( envVal ) + { + ip += envNameLen; + cp = _stpcpy ( cp, envVal ); + } + } + + if (_istcntrl (*ip)) + *ip = _T(' '); + *cp++ = *ip++; + + /* HACK HACK HACK check whether bModeSetA needs to be toggled */ + *cp = 0; + tmp = commandline; + tmp += _tcsspn(tmp,_T(" \t")); + /* first we find and skip and pre-redirections... */ + while (( tmp ) && + ( _tcschr(_T("<>"),*tmp) + || !_tcsncmp(tmp,_T("1>"),2) + || !_tcsncmp(tmp,_T("2>"),2) )) + { + if ( _istdigit(*tmp) ) + tmp += 2; + else + tmp++; + tmp += _tcsspn(tmp,_T(" \t")); + if ( *tmp == _T('\"') ) + { + tmp = _tcschr(tmp+1,_T('\"')); + if ( tmp ) + ++tmp; + } + else + tmp = _tcspbrk(tmp,_T(" \t")); + if ( tmp ) + tmp += _tcsspn(tmp,_T(" \t")); + } + /* we should now be pointing to the actual command + * (if there is one yet)*/ + if ( tmp ) + { + /* if we're currently substituting ( which is default ) + * check to see if we've parsed out a set/a. if so, we + * need to disable substitution until we come across a + * redirection */ + if ( !bModeSetA ) + { + /* look for set /a */ + if ( !_tcsnicmp(tmp,_T("set"),3) ) + { + tmp += 3; + tmp += _tcsspn(tmp,_T(" \t")); + if ( !_tcsnicmp(tmp,_T("/a"),2) ) + bModeSetA = TRUE; + } + } + /* if we're not currently substituting, it means we're + * already inside a set /a. now we need to look for + * a redirection in order to turn redirection back on */ + else + { + /* look for redirector of some kind after the command */ + while ( (tmp = _tcspbrk ( tmp, _T("^<>|") )) ) + { + if ( *tmp == _T('^') ) + { + if ( _tcschr(_T("<>|&"), *++tmp ) && *tmp ) + ++tmp; + } + else + { + bModeSetA = FALSE; + break; + } + } + } + } + } + + *cp = _T('\0'); + + /* strip trailing spaces */ + while ((--cp >= commandline) && _istspace (*cp)); + + *(cp + 1) = _T('\0'); + + /* JPP 19980807 */ + /* Echo batch file line */ + if (bEchoThisLine) + { + PrintPrompt (); + ConOutPuts (commandline); + } + + if (!CheckCtrlBreak(BREAK_INPUT) && *commandline) + { + ParseCommandLine (commandline); + if (bEcho && !bIgnoreEcho && (!bIsBatch || bEchoThisLine)) + ConOutChar ('\n'); + bIgnoreEcho = FALSE; + } + } + while (!bCanExit || !bExit); + + return nErrorLevel; +} + + +/* + * control-break handler. + */ +BOOL WINAPI BreakHandler (DWORD dwCtrlType) +{ + + DWORD dwWritten; + INPUT_RECORD rec; + static BOOL SelfGenerated = FALSE; + + if ((dwCtrlType != CTRL_C_EVENT) && + (dwCtrlType != CTRL_BREAK_EVENT)) + { + return FALSE; + } + else + { + if(SelfGenerated) + { + SelfGenerated = FALSE; + return TRUE; + } + } + + if (bChildProcessRunning == TRUE) + { + SelfGenerated = TRUE; + GenerateConsoleCtrlEvent (dwCtrlType, 0); + return TRUE; + } + + + rec.EventType = KEY_EVENT; + rec.Event.KeyEvent.bKeyDown = TRUE; + rec.Event.KeyEvent.wRepeatCount = 1; + rec.Event.KeyEvent.wVirtualKeyCode = _T('C'); + rec.Event.KeyEvent.wVirtualScanCode = _T('C') - 35; + rec.Event.KeyEvent.uChar.AsciiChar = _T('C'); + rec.Event.KeyEvent.uChar.UnicodeChar = _T('C'); + rec.Event.KeyEvent.dwControlKeyState = RIGHT_CTRL_PRESSED; + + WriteConsoleInput( + hIn, + &rec, + 1, + &dwWritten); + + bCtrlBreak = TRUE; + /* FIXME: Handle batch files */ + + //ConOutPrintf(_T("^C")); + + + return TRUE; +} + + +VOID AddBreakHandler (VOID) +{ + SetConsoleCtrlHandler ((PHANDLER_ROUTINE)BreakHandler, TRUE); +} + + +VOID RemoveBreakHandler (VOID) +{ + SetConsoleCtrlHandler ((PHANDLER_ROUTINE)BreakHandler, FALSE); +} + + +/* + * show commands and options that are available. + * + */ +#if 0 +static VOID +ShowCommands (VOID) +{ + /* print command list */ + ConOutResPuts(STRING_CMD_HELP1); + PrintCommandList(); + + /* print feature list */ + ConOutResPuts(STRING_CMD_HELP2); + +#ifdef FEATURE_ALIASES + ConOutResPuts(STRING_CMD_HELP3); +#endif +#ifdef FEATURE_HISTORY + ConOutResPuts(STRING_CMD_HELP4); +#endif +#ifdef FEATURE_UNIX_FILENAME_COMPLETION + ConOutResPuts(STRING_CMD_HELP5); +#endif +#ifdef FEATURE_DIRECTORY_STACK + ConOutResPuts(STRING_CMD_HELP6); +#endif +#ifdef FEATURE_REDIRECTION + ConOutResPuts(STRING_CMD_HELP7); +#endif + ConOutChar(_T('\n')); +} +#endif + +/* + * set up global initializations and process parameters + * + * argc - number of parameters to command.com + * argv - command-line parameters + * + */ +static VOID +Initialize (int argc, TCHAR* argv[]) +{ + TCHAR commandline[CMDLINE_LENGTH]; + TCHAR ModuleName[_MAX_PATH + 1]; + INT i; + TCHAR lpBuffer[2]; + + //INT len; + //TCHAR *ptr, *cmdLine; + + /* get version information */ + osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + GetVersionEx (&osvi); + + /* Some people like to run ReactOS cmd.exe on Win98, it helps in the + * build process. So don't link implicitly against ntdll.dll, load it + * dynamically instead */ + + if (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT) + { + /* ntdll is always present on NT */ + NtDllModule = GetModuleHandle(TEXT("ntdll.dll")); + } + else + { + /* not all 9x versions have a ntdll.dll, try to load it */ + NtDllModule = LoadLibrary(TEXT("ntdll.dll")); + } + + if (NtDllModule != NULL) + { + NtQueryInformationProcessPtr = (NtQueryInformationProcessProc)GetProcAddress(NtDllModule, "NtQueryInformationProcess"); + NtReadVirtualMemoryPtr = (NtReadVirtualMemoryProc)GetProcAddress(NtDllModule, "NtReadVirtualMemory"); + } + + +#ifdef _DEBUG + DebugPrintf (_T("[command args:\n")); + for (i = 0; i < argc; i++) + { + DebugPrintf (_T("%d. %s\n"), i, argv[i]); + } + DebugPrintf (_T("]\n")); +#endif + + InitLocale (); + + /* get default input and output console handles */ + hOut = GetStdHandle (STD_OUTPUT_HANDLE); + hIn = GetStdHandle (STD_INPUT_HANDLE); + + /* Set EnvironmentVariable PROMPT if it does not exists any env value. + for you can change the EnvirommentVariable for prompt before cmd start + this patch are not 100% right, if it does not exists a PROMPT value cmd should use + $P$G as defualt not set EnvirommentVariable PROMPT to $P$G if it does not exists */ + if (GetEnvironmentVariable(_T("PROMPT"),lpBuffer, sizeof(lpBuffer) / sizeof(lpBuffer[0])) == 0) + SetEnvironmentVariable (_T("PROMPT"), _T("$P$G")); + + + if (argc >= 2 && !_tcsncmp (argv[1], _T("/?"), 2)) + { + ConOutResPaging(TRUE,STRING_CMD_HELP8); + ExitProcess(0); + } + SetConsoleMode (hIn, ENABLE_PROCESSED_INPUT); + +#ifdef INCLUDE_CMD_CHDIR + InitLastPath (); +#endif + +#ifdef FATURE_ALIASES + InitializeAlias (); +#endif + + if (argc >= 2) + { + for (i = 1; i < argc; i++) + { + if (!_tcsicmp (argv[i], _T("/p"))) + { + if (!IsExistingFile (_T("\\autoexec.bat"))) + { +#ifdef INCLUDE_CMD_DATE + cmd_date (_T(""), _T("")); +#endif +#ifdef INCLUDE_CMD_TIME + cmd_time (_T(""), _T("")); +#endif + } + else + { + ParseCommandLine (_T("\\autoexec.bat")); + } + bCanExit = FALSE; + } + else if (!_tcsicmp (argv[i], _T("/c"))) + { + /* This just runs a program and exits */ + ++i; + if (i < argc) + { + _tcscpy (commandline, argv[i]); + while (++i < argc) + { + _tcscat (commandline, _T(" ")); + _tcscat (commandline, argv[i]); + } + + ParseCommandLine(commandline); + ExitProcess (ProcessInput (TRUE)); + } + else + { + ExitProcess (0); + } + } + else if (!_tcsicmp (argv[i], _T("/k"))) + { + /* This just runs a program and remains */ + ++i; + if (i < argc) + { + _tcscpy (commandline, _T("\"")); + _tcscat (commandline, argv[i]); + _tcscat (commandline, _T("\"")); + while (++i < argc) + { + _tcscat (commandline, _T(" ")); + _tcscat (commandline, argv[i]); + } + ParseCommandLine(commandline); + } + } +#ifdef INCLUDE_CMD_COLOR + else if (!_tcsnicmp (argv[i], _T("/t:"), 3)) + { + /* process /t (color) argument */ + wDefColor = (WORD)_tcstoul (&argv[i][3], NULL, 16); + wColor = wDefColor; + SetScreenColor (wColor, TRUE); + } +#endif + } + } + + /* run cmdstart.bat */ + if (IsExistingFile (_T("cmdstart.bat"))) + { + ParseCommandLine (_T("cmdstart.bat")); + } + else if (IsExistingFile (_T("\\cmdstart.bat"))) + { + ParseCommandLine (_T("\\cmdstart.bat")); + } + +#ifdef FEATURE_DIR_STACK + /* initialize directory stack */ + InitDirectoryStack (); +#endif + + +#ifdef FEATURE_HISTORY + /*initialize history*/ + InitHistory(); +#endif + + /* Set COMSPEC environment variable */ + if (0 != GetModuleFileName (NULL, ModuleName, _MAX_PATH + 1)) + { + ModuleName[_MAX_PATH] = _T('\0'); + SetEnvironmentVariable (_T("COMSPEC"), ModuleName); + } + + /* add ctrl break handler */ + AddBreakHandler (); +} + + +static VOID Cleanup (int argc, TCHAR *argv[]) +{ + /* run cmdexit.bat */ + if (IsExistingFile (_T("cmdexit.bat"))) + { + ConErrResPuts(STRING_CMD_ERROR5); + + ParseCommandLine (_T("cmdexit.bat")); + } + else if (IsExistingFile (_T("\\cmdexit.bat"))) + { + ConErrResPuts (STRING_CMD_ERROR5); + ParseCommandLine (_T("\\cmdexit.bat")); + } + +#ifdef FEATURE_ALIASES + DestroyAlias (); +#endif + +#ifdef FEATURE_DIECTORY_STACK + /* destroy directory stack */ + DestroyDirectoryStack (); +#endif + +#ifdef INCLUDE_CMD_CHDIR + FreeLastPath (); +#endif + +#ifdef FEATURE_HISTORY + CleanHistory(); +#endif + + + /* remove ctrl break handler */ + RemoveBreakHandler (); + SetConsoleMode( GetStdHandle( STD_INPUT_HANDLE ), + ENABLE_LINE_INPUT | ENABLE_PROCESSED_INPUT | ENABLE_ECHO_INPUT ); + + if (NtDllModule != NULL) + { + FreeLibrary(NtDllModule); + } +} + +/* + * main function + */ +#ifdef _UNICODE +int _main(void) +#else +int _main (int argc, char *argv[]) +#endif +{ + TCHAR startPath[MAX_PATH]; + CONSOLE_SCREEN_BUFFER_INFO Info; + INT nExitCode; +#ifdef _UNICODE + PWCHAR * argv; + int argc=0; + argv = CommandLineToArgvW(GetCommandLineW(), &argc); +#endif + + GetCurrentDirectory(MAX_PATH,startPath); + _tchdir(startPath); + + SetFileApisToOEM(); + InputCodePage= 0; + OutputCodePage = 0; + + hConsole = CreateFile(_T("CONOUT$"), GENERIC_READ|GENERIC_WRITE, + FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, + OPEN_EXISTING, 0, NULL); + if (GetConsoleScreenBufferInfo(hConsole, &Info) == FALSE) + { + ConErrFormatMessage(GetLastError()); + return(1); + } + wColor = Info.wAttributes; + wDefColor = wColor; + + InputCodePage= GetConsoleCP(); + OutputCodePage = GetConsoleOutputCP(); + CMD_ModuleHandle = GetModuleHandle(NULL); + + /* check switches on command-line */ + Initialize(argc, argv); + + /* call prompt routine */ + nExitCode = ProcessInput(FALSE); + + /* do the cleanup */ + Cleanup(argc, argv); + + return(nExitCode); +} + +/* EOF */ diff --git a/reactos/base/shell/cmd/cmd.h b/reactos/base/shell/cmd/cmd.h new file mode 100644 index 00000000000..5134f80eb01 --- /dev/null +++ b/reactos/base/shell/cmd/cmd.h @@ -0,0 +1,405 @@ +/* + * CMD.H - header file for the modules in CMD.EXE + * + * + * History: + * + * 7-15-95 Tim Norman + * started + * + * 06/29/98 (Rob Lake) + * Moved error messages in here + * + * 07/12/98 (Rob Lake) + * Moved more error messages here. + * + * 30-Jul-1998 (John P Price ) + * Added compile date to version. + * + * 26-Feb-1999 (Eric Kohl ) + * Introduced a new version string. + * Thanks to Emanuele Aliberti! + */ + +#ifndef _CMD_H_INCLUDED_ +#define _CMD_H_INCLUDED_ + +#include "config.h" + +#include +#include + +#include "cmdver.h" + +#define BREAK_BATCHFILE 1 +#define BREAK_OUTOFBATCH 2 +#define BREAK_INPUT 3 +#define BREAK_IGNORE 4 + +/* define some error messages */ + +#define D_ON _T("on") +#define D_OFF _T("off") + + +/* command line buffer length */ +#define CMDLINE_LENGTH 8192 + +/* global variables */ +extern HANDLE hOut; +extern HANDLE hIn; +extern HANDLE hConsole; +extern WORD wColor; +extern WORD wDefColor; +extern BOOL bCtrlBreak; +extern BOOL bIgnoreEcho; +extern BOOL bExit; +extern INT nErrorLevel; +extern SHORT maxx; +extern SHORT maxy; +extern OSVERSIONINFO osvi; + + + +/* Prototypes for ALIAS.C */ +VOID InitializeAlias (VOID); +VOID DestroyAlias (VOID); +VOID ExpandAlias (LPTSTR, INT); +INT CommandAlias (LPTSTR, LPTSTR); + + +/* Prototypes for ATTRIB.C */ +INT CommandAttrib (LPTSTR, LPTSTR); + + +/* Prototypes for BEEP.C */ +INT cmd_beep (LPTSTR, LPTSTR); + + +/* Prototypes for CALL.C */ +INT cmd_call (LPTSTR, LPTSTR); + + +/* Prototypes for CHCP.C */ +INT CommandChcp (LPTSTR, LPTSTR); + + +/* Prototypes for CHOICE.C */ +INT CommandChoice (LPTSTR, LPTSTR); + + +/* Prototypes for CLS.C */ +INT cmd_cls (LPTSTR, LPTSTR); + + +/* Prototypes for CMD.C */ +INT ConvertULargeInteger (ULARGE_INTEGER num, LPTSTR des, INT len, BOOL bPutSeperator); +VOID ParseCommandLine (LPTSTR); +LPCTSTR GetEnvVarOrSpecial ( LPCTSTR varName ); +VOID AddBreakHandler (VOID); +VOID RemoveBreakHandler (VOID); + +extern HANDLE CMD_ModuleHandle; + + +/* Prototypes for CMDINPUT.C */ +VOID ReadCommand (LPTSTR, INT); + + +/* Prototypes for CMDTABLE.C */ +#define CMD_SPECIAL 1 +#define CMD_BATCHONLY 2 +#define CMD_HIDE 4 + +typedef struct tagCOMMAND +{ + LPTSTR name; + INT flags; + INT (*func) (LPTSTR, LPTSTR); +} COMMAND, *LPCOMMAND; + +extern COMMAND cmds[]; /* The internal command table */ + +VOID PrintCommandList (VOID); +VOID PrintCommandListDetail (VOID); + + +/* Prototypes for COLOR.C */ +VOID SetScreenColor(WORD wArgColor, BOOL bFill); +INT CommandColor (LPTSTR, LPTSTR); + + +/* Prototypes for CONSOLE.C */ +#ifdef _DEBUG +VOID DebugPrintf (LPTSTR, ...); +#endif /* _DEBUG */ + +VOID ConInDummy (VOID); +VOID ConInDisable (VOID); +VOID ConInEnable (VOID); +VOID ConInFlush (VOID); +VOID ConInKey (PINPUT_RECORD); +VOID ConInString (LPTSTR, DWORD); + +VOID ConOutChar (TCHAR); +VOID ConOutPuts (LPTSTR); +VOID ConOutPrintf (LPTSTR, ...); +INT ConOutPrintfPaging (BOOL NewPage, LPTSTR, ...); +VOID ConErrChar (TCHAR); +VOID ConErrPuts (LPTSTR); +VOID ConErrPrintf (LPTSTR, ...); +VOID ConOutFormatMessage (DWORD MessageId, ...); +VOID ConErrFormatMessage (DWORD MessageId, ...); + +SHORT GetCursorX (VOID); +SHORT GetCursorY (VOID); +VOID GetCursorXY (PSHORT, PSHORT); +VOID SetCursorXY (SHORT, SHORT); + +VOID GetScreenSize (PSHORT, PSHORT); +VOID SetCursorType (BOOL, BOOL); + +VOID ConOutResPuts (UINT resID); +VOID ConErrResPuts (UINT resID); +VOID ConOutResPaging(BOOL NewPage, UINT resID); + +/* Prototypes for COPY.C */ +INT cmd_copy (LPTSTR, LPTSTR); + + +/* Prototypes for DATE.C */ +INT cmd_date (LPTSTR, LPTSTR); + + +/* Prototypes for DEL.C */ +INT CommandDelete (LPTSTR, LPTSTR); + + +/* Prototypes for DELAY.C */ +INT CommandDelay (LPTSTR, LPTSTR); + + +/* Prototypes for DIR.C */ +INT CommandDir (LPTSTR, LPTSTR); + + +/* Prototypes for DIRSTACK.C */ +VOID InitDirectoryStack (VOID); +VOID DestroyDirectoryStack (VOID); +INT GetDirectoryStackDepth (VOID); +INT CommandPushd (LPTSTR, LPTSTR); +INT CommandPopd (LPTSTR, LPTSTR); +INT CommandDirs (LPTSTR, LPTSTR); + + +/* Prototypes for ECHO.C */ +INT CommandEcho (LPTSTR, LPTSTR); +INT CommandEchos (LPTSTR, LPTSTR); +INT CommandEchoerr (LPTSTR, LPTSTR); +INT CommandEchoserr (LPTSTR, LPTSTR); + + +/* Prototypes for ERROR.C */ +VOID ErrorMessage (DWORD, LPTSTR, ...); + +VOID error_no_pipe (VOID); +VOID error_bad_command (VOID); +VOID error_invalid_drive (VOID); +VOID error_req_param_missing (VOID); +VOID error_sfile_not_found (LPTSTR); +VOID error_file_not_found (VOID); +VOID error_path_not_found (VOID); +VOID error_too_many_parameters (LPTSTR); +VOID error_parameter_format(TCHAR); +VOID error_invalid_switch (TCHAR); +VOID error_invalid_parameter_format (LPTSTR); +VOID error_out_of_memory (VOID); +VOID error_syntax (LPTSTR); + +VOID msg_pause (VOID); + + +/* Prototypes for FILECOMP.C */ +#ifdef FEATURE_UNIX_FILENAME_COMPLETION +VOID CompleteFilename (LPTSTR, UINT); +INT ShowCompletionMatches (LPTSTR, INT); +#endif +#ifdef FEATURE_4NT_FILENAME_COMPLETION +VOID CompleteFilename (LPTSTR, BOOL, LPTSTR, UINT); +#endif + + +/* Prototypes for FOR.C */ +INT cmd_for (LPTSTR, LPTSTR); + + +/* Prototypes for FREE.C */ +INT CommandFree (LPTSTR, LPTSTR); + + +/* Prototypes for GOTO.C */ +INT cmd_goto (LPTSTR, LPTSTR); + + +/* Prototypes for HISTORY.C */ +#ifdef FEATURE_HISTORY +VOID History (INT, LPTSTR);/*add entries browse history*/ +VOID History_move_to_bottom(VOID);/*F3*/ +VOID InitHistory(VOID); +VOID CleanHistory(VOID); +VOID History_del_current_entry(LPTSTR str);/*CTRL-D*/ +INT CommandHistory (LPTSTR cmd, LPTSTR param); +#endif + + +/* Prototypes for INTERNAL.C */ +VOID InitLastPath (VOID); +VOID FreeLastPath (VOID); +INT cmd_chdir (LPTSTR, LPTSTR); +INT cmd_mkdir (LPTSTR, LPTSTR); +INT cmd_rmdir (LPTSTR, LPTSTR); +INT CommandExit (LPTSTR, LPTSTR); +INT CommandRem (LPTSTR, LPTSTR); +INT CommandShowCommands (LPTSTR, LPTSTR); +INT CommandShowCommandsDetail (LPTSTR, LPTSTR); + +/* Prototypes for LABEL.C */ +INT cmd_label (LPTSTR, LPTSTR); + + +/* Prototypes for LOCALE.C */ +extern TCHAR cDateSeparator; +extern INT nDateFormat; +extern TCHAR cTimeSeparator; +extern INT nTimeFormat; +extern TCHAR cThousandSeparator; +extern TCHAR cDecimalSeparator; +extern INT nNumberGroups; + + +VOID InitLocale (VOID); +VOID PrintDate (VOID); +VOID PrintTime (VOID); + +/* cache codepage */ +extern UINT InputCodePage; +extern UINT OutputCodePage; + +/* Prototypes for MEMORY.C */ +INT CommandMemory (LPTSTR, LPTSTR); + + +/* Prototypes for MISC.C */ +INT GetRootPath(TCHAR *InPath,TCHAR *OutPath,INT size); +BOOL SetRootPath(TCHAR *InPath); +TCHAR cgetchar (VOID); +BOOL CheckCtrlBreak (INT); +BOOL add_entry (LPINT ac, LPTSTR **arg, LPCTSTR entry); +LPTSTR *split (LPTSTR, LPINT, BOOL); +VOID freep (LPTSTR *); +LPTSTR _stpcpy (LPTSTR, LPCTSTR); +BOOL IsValidPathName (LPCTSTR); +BOOL IsExistingFile (LPCTSTR); +BOOL IsExistingDirectory (LPCTSTR); +BOOL FileGetString (HANDLE, LPTSTR, INT); +VOID GetPathCase(TCHAR *, TCHAR *); + +#define PROMPT_NO 0 +#define PROMPT_YES 1 +#define PROMPT_ALL 2 +#define PROMPT_BREAK 3 + +INT PagePrompt (VOID); +INT FilePromptYN (LPTSTR, ...); +INT FilePromptYNA (LPTSTR, ...); + + +/* Prototypes for MOVE.C */ +INT cmd_move (LPTSTR, LPTSTR); + + +/* Prototypes for MSGBOX.C */ +INT CommandMsgbox (LPTSTR, LPTSTR); + + +/* Prototypes from PATH.C */ +INT cmd_path (LPTSTR, LPTSTR); + + +/* Prototypes from PROMPT.C */ +VOID PrintPrompt (VOID); +INT cmd_prompt (LPTSTR, LPTSTR); + + +/* Prototypes for REDIR.C */ +#define INPUT_REDIRECTION 1 +#define OUTPUT_REDIRECTION 2 +#define OUTPUT_APPEND 4 +#define ERROR_REDIRECTION 8 +#define ERROR_APPEND 16 +INT GetRedirection (LPTSTR, LPTSTR, LPTSTR, LPTSTR, LPINT); + + +/* Prototypes for REN.C */ +INT cmd_rename (LPTSTR, LPTSTR); + + +/* Prototypes for SCREEN.C */ +INT CommandScreen (LPTSTR, LPTSTR); + + +/* Prototypes for SET.C */ +INT cmd_set (LPTSTR, LPTSTR); + + +/* Prototypes for START.C */ +INT cmd_start (LPTSTR, LPTSTR); + + +/* Prototypes for STRTOCLR.C */ +BOOL StringToColor (LPWORD, LPTSTR *); + + +/* Prototypes for TIME.C */ +INT cmd_time (LPTSTR, LPTSTR); + + +/* Prototypes for TIMER.C */ +INT CommandTimer (LPTSTR cmd, LPTSTR param); + + +/* Prototypes for TITLE.C */ +INT cmd_title (LPTSTR, LPTSTR); + + +/* Prototypes for TYPE.C */ +INT cmd_type (LPTSTR, LPTSTR); + + +/* Prototypes for VER.C */ +VOID ShortVersion (VOID); +INT cmd_ver (LPTSTR, LPTSTR); + + +/* Prototypes for VERIFY.C */ +INT cmd_verify (LPTSTR, LPTSTR); + + +/* Prototypes for VOL.C */ +INT cmd_vol (LPTSTR, LPTSTR); + + +/* Prototypes for WHERE.C */ +BOOL SearchForExecutable (LPCTSTR, LPTSTR); + +/* Prototypes for WINDOW.C */ +INT CommandActivate (LPTSTR, LPTSTR); +INT CommandWindow (LPTSTR, LPTSTR); + + +/* The MSDOS Batch Commands [MS-DOS 5.0 User's Guide and Reference p359] */ +int cmd_if(TCHAR *, TCHAR *); +int cmd_pause(TCHAR *, TCHAR *); +int cmd_shift(TCHAR *, TCHAR *); + +#endif /* _CMD_H_INCLUDED_ */ diff --git a/reactos/base/shell/cmd/cmd.rc b/reactos/base/shell/cmd/cmd.rc new file mode 100644 index 00000000000..9c6a262db2a --- /dev/null +++ b/reactos/base/shell/cmd/cmd.rc @@ -0,0 +1,39 @@ +#include +#include "cmdver.h" + +#define REACTOS_STR_FILE_DESCRIPTION "ReactOS Command Processor\0" +#define REACTOS_STR_INTERNAL_NAME "cmd\0" +#define REACTOS_STR_ORIGINAL_FILENAME "cmd.exe\0" +#define REACTOS_STR_ORIGINAL_COPYRIGHT "Copyright (C) 1994-1998 Tim Norman and others\0" +#define REACTOS_STR_LEGAL_COPYRIGHT "Copyright (C) 1998-2006 Eric Kohl and others\0" + +#include +#include "En.rc" +#include "Fr.rc" +#include "De.rc" +#include "Es.rc" +#include "Ru.rc" +#include "Ja.rc" +#include "Hu.rc" + + +STRINGTABLE DISCARDABLE +{ + STRING_FREEDOS_DEV, " Tim Norman Matt Rains\n\ + Evan Jeffrey Steffen Kaiser\n\ + Svante Frey Oliver Mueller\n\ + Aaron Kaufman Marc Desrochers\n\ + Rob Lake John P Price\n\ + Hans B Pufal\n" + + STRING_REACTOS_DEV, " Eric Kohl Emanuele Aliberti\n\ + Paolo Pantaleo Phillip Susi\n\ + Sylvain Petreolle\n" +} + +1 ICON DISCARDABLE res/terminal.ico + + + + + diff --git a/reactos/base/shell/cmd/cmd.xml b/reactos/base/shell/cmd/cmd.xml new file mode 100644 index 00000000000..a36da9fa6a1 --- /dev/null +++ b/reactos/base/shell/cmd/cmd.xml @@ -0,0 +1,77 @@ + + include/wine + . + + + 0x0501 + precomp.h + + alias.c + attrib.c + batch.c + beep.c + call.c + chcp.c + choice.c + cls.c + cmd.c + cmdinput.c + cmdtable.c + color.c + console.c + copy.c + date.c + del.c + delay.c + dir.c + dirstack.c + echo.c + error.c + filecomp.c + for.c + free.c + goto.c + history.c + if.c + internal.c + label.c + locale.c + memory.c + misc.c + move.c + msgbox.c + path.c + pause.c + prompt.c + redir.c + ren.c + screen.c + set.c + shift.c + start.c + strtoclr.c + time.c + timer.c + title.c + type.c + ver.c + verify.c + vol.c + where.c + window.c + + + + include/wine + . + + + 0x0501 + kernel32 + cmd_base + main.c + cmd.rc + + + + diff --git a/reactos/base/shell/cmd/cmdinput.c b/reactos/base/shell/cmd/cmdinput.c new file mode 100644 index 00000000000..2bb36e3c350 --- /dev/null +++ b/reactos/base/shell/cmd/cmdinput.c @@ -0,0 +1,574 @@ +/* + * CMDINPUT.C - handles command input (tab completion, history, etc.). + * + * + * History: + * + * 01/14/95 (Tim Norman) + * started. + * + * 08/08/95 (Matt Rains) + * i have cleaned up the source code. changes now bring this source + * into guidelines for recommended programming practice. + * i have added some constants to help making changes easier. + * + * 12/12/95 (Tim Norman) + * added findxy() function to get max x/y coordinates to display + * correctly on larger screens + * + * 12/14/95 (Tim Norman) + * fixed the Tab completion code that Matt Rains broke by moving local + * variables to a more global scope and forgetting to initialize them + * when needed + * + * 8/1/96 (Tim Norman) + * fixed a bug in tab completion that caused filenames at the beginning + * of the command-line to have their first letter truncated + * + * 9/1/96 (Tim Norman) + * fixed a silly bug using printf instead of fputs, where typing "%i" + * confused printf :) + * + * 6/14/97 (Steffan Kaiser) + * ctrl-break checking + * + * 6/7/97 (Marc Desrochers) + * recoded everything! now properly adjusts when text font is changed. + * removed findxy(), reposition(), and reprint(), as these functions + * were inefficient. added goxy() function as gotoxy() was buggy when + * the screen font was changed. the printf() problem with %i on the + * command line was fixed by doing printf("%s",str) instead of + * printf(str). Don't ask how I find em just be glad I do :) + * + * 7/12/97 (Tim Norman) + * Note: above changes pre-empted Steffan's ctrl-break checking. + * + * 7/7/97 (Marc Desrochers) + * rewrote a new findxy() because the new dir() used it. This + * findxy() simply returns the values of *maxx *maxy. In the + * future, please use the pointers, they will always be correct + * since they point to BIOS values. + * + * 7/8/97 (Marc Desrochers) + * once again removed findxy(), moved the *maxx, *maxy pointers + * global and included them as externs in command.h. Also added + * insert/overstrike capability + * + * 7/13/97 (Tim Norman) + * added different cursor appearance for insert/overstrike mode + * + * 7/13/97 (Tim Norman) + * changed my code to use _setcursortype until I can figure out why + * my code is crashing on some machines. It doesn't crash on mine :) + * + * 27-Jul-1998 (John P Price ) + * added config.h include + * + * 28-Jul-1998 (John P Price ) + * put ifdef's around filename completion code. + * + * 30-Jul-1998 (John P Price ) + * moved filename completion code to filecomp.c + * made second TAB display list of filename matches + * + * 31-Jul-1998 (John P Price ) + * Fixed bug where if you typed something, then hit HOME, then tried + * to type something else in insert mode, it crashed. + * + * 07-Aug-1998 (John P Price ) + * Fixed carrage return output to better match MSDOS with echo + * on or off.(marked with "JPP 19980708") + * + * 13-Dec-1998 (Eric Kohl ) + * Added insert/overwrite cursor. + * + * 25-Jan-1998 (Eric Kohl ) + * Replaced CRT io functions by Win32 console io functions. + * This can handle - for 4NT filename completion. + * Unicode and redirection safe! + * + * 04-Feb-1999 (Eric Kohl ) + * Fixed input bug. A "line feed" character remained in the keyboard + * input queue when you pressed . This sometimes caused + * some very strange effects. + * Fixed some command line editing annoyances. + * + * 30-Apr-2004 (Filip Navara ) + * Fixed problems when the screen was scrolled away. + */ + +#include +#include "resource.h" + + +SHORT maxx; +SHORT maxy; + +/* + * global command line insert/overwrite flag + */ +static BOOL bInsert = TRUE; + + +static VOID +ClearCommandLine (LPTSTR str, INT maxlen, SHORT orgx, SHORT orgy) +{ + INT count; + + SetCursorXY (orgx, orgy); + for (count = 0; count < (INT)_tcslen (str); count++) + ConOutChar (_T(' ')); + _tcsnset (str, _T('\0'), maxlen); + SetCursorXY (orgx, orgy); +} + + +/* read in a command line */ +VOID ReadCommand (LPTSTR str, INT maxlen) +{ + SHORT orgx; /* origin x/y */ + SHORT orgy; + SHORT curx; /*current x/y cursor position*/ + SHORT cury; + SHORT tempscreen; + INT count; /*used in some for loops*/ + INT current = 0; /*the position of the cursor in the string (str)*/ + INT charcount = 0;/*chars in the string (str)*/ + INPUT_RECORD ir; + WORD wLastKey = 0; + TCHAR ch; + BOOL bContinue=FALSE;/*is TRUE the second case will not be executed*/ + BOOL bReturn = FALSE; + TCHAR szPath[MAX_PATH]; + BOOL bCharInput; + + /* get screen size */ + GetScreenSize (&maxx, &maxy); + + /* JPP 19980807 - if echo off, don't print prompt */ + if (bEcho) + PrintPrompt(); + + GetCursorXY (&orgx, &orgy); + GetCursorXY (&curx, &cury); + + memset (str, 0, maxlen * sizeof (TCHAR)); + + SetCursorType (bInsert, TRUE); + + do + { + + bReturn = FALSE; + + ConInKey (&ir); + + if (ir.Event.KeyEvent.dwControlKeyState & + (RIGHT_ALT_PRESSED|RIGHT_ALT_PRESSED| + RIGHT_CTRL_PRESSED|LEFT_CTRL_PRESSED) ) + { + + switch (ir.Event.KeyEvent.wVirtualKeyCode) + { + +#ifdef FEATURE_HISTORY + + case 'K': + /*add the current command line to the history*/ + if (ir.Event.KeyEvent.dwControlKeyState & + (LEFT_CTRL_PRESSED|RIGHT_CTRL_PRESSED)) + { + + if (str[0]) + History(0,str); + + ClearCommandLine (str, maxlen, orgx, orgy); + current = charcount = 0; + curx = orgx; + cury = orgy; + bContinue=TRUE; + break; + } + + case 'D': + /*delete current history entry*/ + if (ir.Event.KeyEvent.dwControlKeyState & + (LEFT_CTRL_PRESSED|RIGHT_CTRL_PRESSED)) + { + ClearCommandLine (str, maxlen, orgx, orgy); + History_del_current_entry(str); + current = charcount = _tcslen (str); + ConOutPrintf (_T("%s"), str); + GetCursorXY (&curx, &cury); + bContinue=TRUE; + break; + } + +#endif/*FEATURE_HISTORY*/ + } + + + + + } + + //if (bContinue) + // continue; + + + bCharInput = FALSE; + + switch (ir.Event.KeyEvent.wVirtualKeyCode) + { + case VK_BACK: + /* - delete character to left of cursor */ + if (current > 0 && charcount > 0) + { + if (current == charcount) + { + /* if at end of line */ + str[current - 1] = _T('\0'); + if (GetCursorX () != 0) + { + ConOutPrintf (_T("\b \b")); + curx--; + } + else + { + SetCursorXY ((SHORT)(maxx - 1), (SHORT)(GetCursorY () - 1)); + ConOutChar (_T(' ')); + SetCursorXY ((SHORT)(maxx - 1), (SHORT)(GetCursorY () - 1)); + cury--; + curx = maxx - 1; + } + } + else + { + for (count = current - 1; count < charcount; count++) + str[count] = str[count + 1]; + if (GetCursorX () != 0) + { + SetCursorXY ((SHORT)(GetCursorX () - 1), GetCursorY ()); + curx--; + } + else + { + SetCursorXY ((SHORT)(maxx - 1), (SHORT)(GetCursorY () - 1)); + cury--; + curx = maxx - 1; + } + GetCursorXY (&curx, &cury); + ConOutPrintf (_T("%s "), &str[current - 1]); + SetCursorXY (curx, cury); + } + charcount--; + current--; + } + break; + + case VK_INSERT: + /* toggle insert/overstrike mode */ + bInsert ^= TRUE; + SetCursorType (bInsert, TRUE); + break; + + case VK_DELETE: + /* delete character under cursor */ + if (current != charcount && charcount > 0) + { + for (count = current; count < charcount; count++) + str[count] = str[count + 1]; + charcount--; + GetCursorXY (&curx, &cury); + ConOutPrintf (_T("%s "), &str[current]); + SetCursorXY (curx, cury); + } + break; + + case VK_HOME: + /* goto beginning of string */ + if (current != 0) + { + SetCursorXY (orgx, orgy); + curx = orgx; + cury = orgy; + current = 0; + } + break; + + case VK_END: + /* goto end of string */ + if (current != charcount) + { + SetCursorXY (orgx, orgy); + ConOutPrintf (_T("%s"), str); + GetCursorXY (&curx, &cury); + current = charcount; + } + break; + + case VK_TAB: +#ifdef FEATURE_UNIX_FILENAME_COMPLETION + /* expand current file name */ + if ((current == charcount) || + (current == charcount - 1 && + str[current] == _T('"'))) /* only works at end of line*/ + { + if (wLastKey != VK_TAB) + { + /* if first TAB, complete filename*/ + tempscreen = charcount; + CompleteFilename (str, charcount); + charcount = _tcslen (str); + current = charcount; + + SetCursorXY (orgx, orgy); + ConOutPrintf (_T("%s"), str); + + if (tempscreen > charcount) + { + GetCursorXY (&curx, &cury); + for (count = tempscreen - charcount; count--; ) + ConOutChar (_T(' ')); + SetCursorXY (curx, cury); + } + else + { + if (((charcount + orgx) / maxx) + orgy > maxy - 1) + orgy += maxy - ((charcount + orgx) / maxx + orgy + 1); + } + + /* set cursor position */ + SetCursorXY ((orgx + current) % maxx, + orgy + (orgx + current) / maxx); + GetCursorXY (&curx, &cury); + } + else + { + /*if second TAB, list matches*/ + if (ShowCompletionMatches (str, charcount)) + { + PrintPrompt (); + GetCursorXY (&orgx, &orgy); + ConOutPrintf (_T("%s"), str); + + /* set cursor position */ + SetCursorXY ((orgx + current) % maxx, + orgy + (orgx + current) / maxx); + GetCursorXY (&curx, &cury); + } + + } + } + else + { + MessageBeep (-1); + } +#endif +#ifdef FEATURE_4NT_FILENAME_COMPLETION + + /* used to later see if we went down to the next line */ + tempscreen = charcount; + szPath[0]=_T('\0'); + + /* str is the whole things that is on the current line + that is and and out. arg 2 is weather it goes back + one file or forward one file */ + CompleteFilename(str, !(ir.Event.KeyEvent.dwControlKeyState & SHIFT_PRESSED), szPath, current); + /* Attempt to clear the line */ + ClearCommandLine (str, maxlen, orgx, orgy); + curx = orgx; + cury = orgy; + current = charcount = 0; + //str[0]=_T('\0'); + + /* Everything is deleted, lets add it back in */ + _tcscpy(str,szPath); + + /* Figure out where cusor is going to be after we print it */ + charcount = _tcslen (str); + current = charcount; + + SetCursorXY (orgx, orgy); + /* Print out what we have now */ + ConOutPrintf (_T("%s"), str); + + /* Move cursor accordingly */ + if(tempscreen > charcount) + { + GetCursorXY (&curx, &cury); + for(count = tempscreen - charcount; count--; ) + ConOutChar (_T(' ')); + SetCursorXY (curx, cury); + } + else + { + if(((charcount + orgx) / maxx) + orgy > maxy - 1) + orgy += maxy - ((charcount + orgx) / maxx + orgy + 1); + } + SetCursorXY((short)(((int)orgx + current) % maxx), (short)((int)orgy + ((int)orgx + current) / maxx)); + GetCursorXY(&curx, &cury); + +#endif + break; + + case _T('M'): + case _T('C'): + /* ^M does the same as return */ + bCharInput = TRUE; + if(!(ir.Event.KeyEvent.dwControlKeyState & + (RIGHT_CTRL_PRESSED|LEFT_CTRL_PRESSED))) + { + break; + } + + case VK_RETURN: + /* end input, return to main */ +#ifdef FEATURE_HISTORY + /* add to the history */ + if (str[0]) + History (0, str); +#endif + ConInDummy (); + ConOutChar (_T('\n')); + bReturn = TRUE; + break; + + case VK_ESCAPE: + /* clear str Make this callable! */ + ClearCommandLine (str, maxlen, orgx, orgy); + curx = orgx; + cury = orgy; + current = charcount = 0; + break; + +#ifdef FEATURE_HISTORY + case VK_F3: + History_move_to_bottom(); +#endif + case VK_UP: +#ifdef FEATURE_HISTORY + /* get previous command from buffer */ + ClearCommandLine (str, maxlen, orgx, orgy); + History (-1, str); + current = charcount = _tcslen (str); + if (((charcount + orgx) / maxx) + orgy > maxy - 1) + orgy += maxy - ((charcount + orgx) / maxx + orgy + 1); + ConOutPrintf (_T("%s"), str); + GetCursorXY (&curx, &cury); +#endif + break; + + case VK_DOWN: +#ifdef FEATURE_HISTORY + /* get next command from buffer */ + ClearCommandLine (str, maxlen, orgx, orgy); + History (1, str); + current = charcount = _tcslen (str); + if (((charcount + orgx) / maxx) + orgy > maxy - 1) + orgy += maxy - ((charcount + orgx) / maxx + orgy + 1); + ConOutPrintf (_T("%s"), str); + GetCursorXY (&curx, &cury); +#endif + break; + + case VK_LEFT: + /* move cursor left */ + if (current > 0) + { + current--; + if (GetCursorX () == 0) + { + SetCursorXY ((SHORT)(maxx - 1), (SHORT)(GetCursorY () - 1)); + curx = maxx - 1; + cury--; + } + else + { + SetCursorXY ((SHORT)(GetCursorX () - 1), GetCursorY ()); + curx--; + } + } + else + { + MessageBeep (-1); + } + break; + + case VK_RIGHT: + /* move cursor right */ + if (current != charcount) + { + current++; + if (GetCursorX () == maxx - 1) + { + SetCursorXY (0, (SHORT)(GetCursorY () + 1)); + curx = 0; + cury++; + } + else + { + SetCursorXY ((SHORT)(GetCursorX () + 1), GetCursorY ()); + curx++; + } + } + break; + + default: + /* This input is just a normal char */ + bCharInput = TRUE; + + } +#ifdef _UNICODE + ch = ir.Event.KeyEvent.uChar.UnicodeChar; + if ((ch >= 32 && (charcount != (maxlen - 2)) && bCharInput) +#else + ch = ir.Event.KeyEvent.uChar.AsciiChar; + if ((UCHAR)ch >= 32 && (charcount != (maxlen - 2)) && bCharInput) +#endif /* _UNICODE */ + { + /* insert character into string... */ + if (bInsert && current != charcount) + { + /* If this character insertion will cause screen scrolling, + * adjust the saved origin of the command prompt. */ + tempscreen = _tcslen(str + current) + curx; + if ((tempscreen % maxx) == (maxx - 1) && + (tempscreen / maxx) + cury == (maxy - 1)) + { + orgy--; + cury--; + } + + for (count = charcount; count > current; count--) + str[count] = str[count - 1]; + str[current++] = ch; + if (curx == maxx - 1) + curx = 0, cury++; + else + curx++; + ConOutPrintf (_T("%s"), &str[current - 1]); + SetCursorXY (curx, cury); + charcount++; + } + else + { + if (current == charcount) + charcount++; + str[current++] = ch; + if (GetCursorX () == maxx - 1 && GetCursorY () == maxy - 1) + orgy--, cury--; + if (GetCursorX () == maxx - 1) + curx = 0, cury++; + else + curx++; + ConOutChar (ch); + } + } + + wLastKey = ir.Event.KeyEvent.wVirtualKeyCode; + } + while (!bReturn); + + SetCursorType (bInsert, TRUE); +} diff --git a/reactos/base/shell/cmd/cmdtable.c b/reactos/base/shell/cmd/cmdtable.c new file mode 100644 index 00000000000..3af74432d5e --- /dev/null +++ b/reactos/base/shell/cmd/cmdtable.c @@ -0,0 +1,269 @@ +/* + * CMDTABLE.C - table of internal commands. + * + * + * History: + * + * 16 Jul 1998 (Hans B Pufal) + * started. + * New file to keep the internal command table. I plan on + * getting rid of the table real soon now and replacing it + * with a dynamic mechnism. + * + * 27 Jul 1998 John P. Price + * added config.h include + * + * 21-Jan-1999 (Eric Kohl ) + * Unicode ready! + */ + +#include +#include "resource.h" + + +/* a list of all the internal commands, associating their command names */ +/* to the functions to process them */ + + +COMMAND cmds[] = +{ + {_T("?"), 0, CommandShowCommands}, + + +#ifdef INCLUDE_CMD_ACTIVATE + {_T("activate"), 0, CommandActivate}, +#endif + +#ifdef FEATURE_ALIASES + {_T("alias"), 0, CommandAlias}, +#endif + +#ifdef INCLUDE_CMD_ATTRIB + {_T("attrib"), 0, CommandAttrib}, +#endif + +#ifdef INCLUDE_CMD_BEEP + {_T("beep"), 0, cmd_beep}, +#endif + + {_T("call"), CMD_BATCHONLY, cmd_call}, + +#ifdef INCLUDE_CMD_CHDIR + {_T("cd"), CMD_SPECIAL, cmd_chdir}, + {_T("chdir"), CMD_SPECIAL, cmd_chdir}, +#endif + +#ifdef INCLUDE_CMD_CHCP + {_T("chcp"), 0, CommandChcp}, +#endif + +#ifdef INCLUDE_CMD_CHOICE + {_T("choice"), 0, CommandChoice}, +#endif + +#ifdef INCLUDE_CMD_CLS + {_T("cls"), 0, cmd_cls}, +#endif + +#ifdef INCLUDE_CMD_COLOR + {_T("color"), 0, CommandColor}, +#endif + +#ifdef INCLUDE_CMD_COPY + {_T("copy"), 0, cmd_copy}, +#endif + +#ifdef INCLUDE_CMD_DATE + {_T("date"), 0, cmd_date}, +#endif + +#ifdef INCLUDE_CMD_DEL + {_T("del"), 0, CommandDelete}, + {_T("delete"), 0, CommandDelete}, +#endif + +#ifdef INCLUDE_CMD_DELAY + {_T("delay"), 0, CommandDelay}, +#endif + +#ifdef INCLUDE_CMD_DIR + {_T("dir"), CMD_SPECIAL, CommandDir}, +#endif + +#ifdef FEATURE_DIRECTORY_STACK + {_T("dirs"), 0, CommandDirs}, +#endif + + {_T("echo"), 0, CommandEcho}, + {_T("echo."), CMD_HIDE, CommandEcho}, + {_T("echos"), 0, CommandEchos}, + {_T("echoerr"), 0, CommandEchoerr}, + {_T("echoerr."), CMD_HIDE, CommandEchoerr}, + {_T("echoserr"), 0, CommandEchoserr}, + +#ifdef INCLUDE_CMD_DEL + {_T("erase"), 0, CommandDelete}, +#endif + + {_T("exit"), 0, CommandExit}, + + {_T("for"), 0, cmd_for}, + +#ifdef INCLUDE_CMD_FREE + {_T("free"), 0, CommandFree}, +#endif + + {_T("goto"), CMD_BATCHONLY, cmd_goto}, + + {_T("help"), 0, CommandShowCommandsDetail}, + +#ifdef FEATURE_HISTORY + {_T("history"), 0, CommandHistory}, +#endif + + {_T("if"), 0, cmd_if}, + +#ifdef INCLUDE_CMD_LABEL + {_T("label"), 0, cmd_label}, +#endif + +#ifdef INCLUDE_CMD_MEMORY + {_T("memory"), 0, CommandMemory}, +#endif + +#ifdef INCLUDE_CMD_MKDIR + {_T("md"), CMD_SPECIAL, cmd_mkdir}, + {_T("mkdir"), CMD_SPECIAL, cmd_mkdir}, +#endif + +#ifdef INCLUDE_CMD_MOVE + {_T("move"), 0, cmd_move}, +#endif + +#ifdef INCLUDE_CMD_MSGBOX + {_T("msgbox"), 0, CommandMsgbox}, +#endif + +#ifdef INCLUDE_CMD_PATH + {_T("path"), 0, cmd_path}, +#endif + +#ifdef INCLUDE_CMD_PAUSE + {_T("pause"), 0, cmd_pause}, +#endif + +#ifdef FEATURE_DIRECTORY_STACK + {_T("popd"), 0, CommandPopd}, +#endif + +#ifdef INCLUDE_CMD_PROMPT + {_T("prompt"), 0, cmd_prompt}, +#endif + +#ifdef FEATURE_DIRECTORY_STACK + {_T("pushd"), 0, CommandPushd}, +#endif + +#ifdef INCLUDE_CMD_RMDIR + {_T("rd"), CMD_SPECIAL, cmd_rmdir}, +#endif + +#ifdef INCLUDE_CMD_REM + {_T("rem"), 0, CommandRem}, +#endif + +#ifdef INCLUDE_CMD_RENAME + {_T("ren"), 0, cmd_rename}, + {_T("rename"), 0, cmd_rename}, +#endif + +#ifdef INCLUDE_CMD_RMDIR + {_T("rmdir"), CMD_SPECIAL, cmd_rmdir}, +#endif + +#ifdef INCLUDE_CMD_SCREEN + {_T("screen"), 0, CommandScreen}, +#endif + +#ifdef INCLUDE_CMD_SET + {_T("set"), 0, cmd_set}, +#endif + + {_T("shift"), CMD_BATCHONLY, cmd_shift}, + +#ifdef INCLUDE_CMD_START + {_T("start"), 0, cmd_start}, +#endif + +#ifdef INCLUDE_CMD_TIME + {_T("time"), 0, cmd_time}, +#endif + +#ifdef INCLUDE_CMD_TIMER + {_T("timer"), 0, CommandTimer}, +#endif + +#ifdef INCLUDE_CMD_TITLE + {_T("title"), 0, cmd_title}, +#endif + +#ifdef INCLUDE_CMD_TYPE + {_T("type"), 0, cmd_type}, +#endif + +#ifdef INCLUDE_CMD_VER + {_T("ver"), 0, cmd_ver}, +#endif + +#ifdef INCLUDE_CMD_VERIFY + {_T("verify"), 0, cmd_verify}, +#endif + +#ifdef INCLUDE_CMD_VOL + {_T("vol"), 0, cmd_vol}, +#endif + +#ifdef INCLUDE_CMD_WINDOW + {_T("window"), 0, CommandWindow}, +#endif + + {NULL, 0, NULL} +}; + + +VOID PrintCommandList (VOID) +{ + LPCOMMAND cmdptr; + INT y; + + y = 0; + cmdptr = cmds; + while (cmdptr->name) + { + if (!(cmdptr->flags & CMD_HIDE)) + { + if (++y == 8) + { + ConOutPuts (cmdptr->name); + y = 0; + } + else + { + ConOutPrintf (_T("%-10s"), cmdptr->name); + } + } + + cmdptr++; + } + + if (y != 0) + ConOutChar ('\n'); +} + +VOID PrintCommandListDetail (VOID) +{ + ConOutResPaging(TRUE,STRING_HELP1); + ConOutResPaging(FALSE,STRING_HELP2); +} + +/* EOF */ diff --git a/reactos/base/shell/cmd/cmdver.h b/reactos/base/shell/cmd/cmdver.h new file mode 100644 index 00000000000..93ed1b8f446 --- /dev/null +++ b/reactos/base/shell/cmd/cmdver.h @@ -0,0 +1,2 @@ +#define CMD_VER "0.1.2" +#define CMD_VER_RC CMD_VER"\0" diff --git a/reactos/base/shell/cmd/color.c b/reactos/base/shell/cmd/color.c new file mode 100644 index 00000000000..8db6dc767d1 --- /dev/null +++ b/reactos/base/shell/cmd/color.c @@ -0,0 +1,137 @@ +/* + * COLOR.C - color internal command. + * + * + * History: + * + * 13-Dec-1998 (Eric Kohl ) + * Started. + * + * 19-Jan-1999 (Eric Kohl ) + * Unicode ready! + * + * 20-Jan-1999 (Eric Kohl ) + * Redirection ready! + * + * 14-Oct-1999 (Paolo Pantaleo ) + * 4nt's syntax implemented. + * + * 03-Apr-2005 (Magnus Olsen) ) + * Move all hardcoded strings to En.rc. + */ + +#include +#include "resource.h" + +#ifdef INCLUDE_CMD_COLOR + + + + + +VOID SetScreenColor (WORD wColor, BOOL bNoFill) +{ + DWORD dwWritten; + CONSOLE_SCREEN_BUFFER_INFO csbi; + COORD coPos; + + + if ((wColor & 0xF) == (wColor &0xF0) >> 4) + { + ConErrResPuts(STRING_COLOR_ERROR1); + } + else + { + if (bNoFill != TRUE) + { + GetConsoleScreenBufferInfo (hConsole, &csbi); + + coPos.X = 0; + coPos.Y = 0; + FillConsoleOutputAttribute (hConsole, + (WORD)(wColor & 0x00FF), + (csbi.dwSize.X)*(csbi.dwSize.Y), + coPos, + &dwWritten); + } + SetConsoleTextAttribute (hConsole, (WORD)(wColor & 0x00FF)); + } +} + + +/* + * color + * + * internal dir command + */ +INT CommandColor (LPTSTR first, LPTSTR rest) +{ + TCHAR szMsg[RC_STRING_MAX_SIZE]; + + if (_tcsncmp (rest, _T("/?"), 2) == 0) + { + ConOutResPaging(TRUE,STRING_COLOR_HELP1); + return 0; + } + + nErrorLevel = 0; + + if (rest[0] == _T('\0')) + { + /* set default color */ + wColor = wDefColor; + SetScreenColor (wColor, FALSE); + return 0; + } + + + if ( _tcslen(&rest[0])==1) + { + if ( (_tcscmp(&rest[0], _T("0")) >=0 ) && (_tcscmp(&rest[0], _T("9")) <=0 ) ) + { + SetConsoleTextAttribute (hConsole, (WORD)_ttoi(rest)); + return 0; + } + else if ( (_tcscmp(&rest[0], _T("a")) >=0 ) && (_tcscmp(&rest[0], _T("f")) <=0 ) ) + { + SetConsoleTextAttribute (hConsole, (WORD) (rest[0] + 10 - _T('a')) ); + return 0; + } + else if ( (_tcscmp(&rest[0], _T("A")) >=0 ) && (_tcscmp(&rest[0], _T("F")) <=0 ) ) + { + SetConsoleTextAttribute (hConsole, (WORD) (rest[0] + 10 - _T('A')) ); + return 0; + } + ConErrResPuts(STRING_COLOR_ERROR2); + nErrorLevel = 1; + return 1; + } + + if (StringToColor(&wColor, &rest) == FALSE) + { + ConErrResPuts(STRING_COLOR_ERROR2); + nErrorLevel = 1; + return 1; + } + + LoadString(CMD_ModuleHandle, STRING_COLOR_ERROR3, szMsg, RC_STRING_MAX_SIZE); + ConErrPrintf(szMsg, wColor); + + if ((wColor & 0xF) == (wColor &0xF0) >> 4) + { + LoadString(CMD_ModuleHandle, STRING_COLOR_ERROR4, szMsg, RC_STRING_MAX_SIZE); + ConErrPrintf(szMsg, wColor); + nErrorLevel = 1; + return 1; + } + + /* set color */ + SetScreenColor(wColor, + (_tcsstr (rest,_T("/-F")) || _tcsstr (rest,_T("/-f")))); + + return 0; +} + +#endif /* INCLUDE_CMD_COLOR */ + +/* EOF */ diff --git a/reactos/base/shell/cmd/config.h b/reactos/base/shell/cmd/config.h new file mode 100644 index 00000000000..356af141446 --- /dev/null +++ b/reactos/base/shell/cmd/config.h @@ -0,0 +1,99 @@ +/* + * CONFIG.H - Used to configure what will be compiled into the shell. + * + * + * History: + * + * 27 Jul 1998 - John P. Price + * started. + * + */ + +/* Define only if used under ReactOS */ +#define __REACTOS__ + +#ifndef _CONFIG_H_INCLUDED_ +#define _CONFIG_H_INCLUDED_ + +/* Define to enable debugging code */ +//#define _DEBUG + +#define WIN32_LEAN_AND_MEAN + +//#define NT4_INTERNAL_COMMANDS + +/* Define to enable the alias command, and aliases.*/ +#define FEATURE_ALIASES + + +/* Define to enable history */ +#define FEATURE_HISTORY + +/*Define to enable history wrap (4nt's style)*/ +#define WRAP_HISTORY + + +/* Define one of these to enable filename completion */ +//#define FEATURE_UNIX_FILENAME_COMPLETION +#define FEATURE_4NT_FILENAME_COMPLETION + + +/* Define to enable the directory stack */ +#define FEATURE_DIRECTORY_STACK + + +/* Define to activate redirections and piping */ +#define FEATURE_REDIRECTION + + +/* Define one of these to select the used locale. */ +/* (date and time formats etc.) used in DATE, TIME, */ +/* DIR, PROMPT etc. */ +#define LOCALE_WINDOWS /* System locale */ +/* #define LOCALE_GERMAN */ /* German locale */ +/* #define LOCALE_DEFAULT */ /* United States locale */ + +#ifdef NT4_INTERNAL_COMMANDS +#define INCLUDE_CMD_ACTIVATE +#endif +#define INCLUDE_CMD_ATTRIB +#define INCLUDE_CMD_CHCP +#define INCLUDE_CMD_CHDIR +#define INCLUDE_CMD_CHOICE +#define INCLUDE_CMD_CLS +#define INCLUDE_CMD_COLOR +#define INCLUDE_CMD_COPY +#define INCLUDE_CMD_DATE +#define INCLUDE_CMD_DEL +#define INCLUDE_CMD_DELAY +#define INCLUDE_CMD_DIR +#define INCLUDE_CMD_FREE +#define INCLUDE_CMD_LABEL +#define INCLUDE_CMD_MEMORY +#define INCLUDE_CMD_MKDIR +#define INCLUDE_CMD_MOVE +#ifdef NT4_INTERNAL_COMMANDS +#define INCLUDE_CMD_MSGBOX +#endif +#define INCLUDE_CMD_PATH +#define INCLUDE_CMD_PROMPT +#define INCLUDE_CMD_RMDIR +#define INCLUDE_CMD_RENAME +#define INCLUDE_CMD_SCREEN +#define INCLUDE_CMD_SET +#define INCLUDE_CMD_START +#define INCLUDE_CMD_TIME +#define INCLUDE_CMD_TIMER +#define INCLUDE_CMD_TITLE +#define INCLUDE_CMD_TYPE +#define INCLUDE_CMD_VER +#define INCLUDE_CMD_REM +#define INCLUDE_CMD_PAUSE +#define INCLUDE_CMD_BEEP +#define INCLUDE_CMD_VERIFY +#define INCLUDE_CMD_VOL +#ifdef NT4_INTERNAL_COMMANDS +#define INCLUDE_CMD_WINDOW +#endif + +#endif /* _CONFIG_H_INCLUDED_ */ diff --git a/reactos/base/shell/cmd/console.c b/reactos/base/shell/cmd/console.c new file mode 100644 index 00000000000..352a64e2f9a --- /dev/null +++ b/reactos/base/shell/cmd/console.c @@ -0,0 +1,527 @@ +/* + * CONSOLE.C - console input/output functions. + * + * + * History: + * + * 20-Jan-1999 (Eric Kohl ) + * started + * + * 03-Apr-2005 (Magnus Olsen) ) + * Remove all hardcode string to En.rc + * + * 01-Jul-2005 (Brandon Turner) ) + * Added ConPrintfPaging and ConOutPrintfPaging + */ + + + +#include +#include "resource.h" + + +#define OUTPUT_BUFFER_SIZE 4096 + + +UINT InputCodePage; +UINT OutputCodePage; + + +VOID ConInDisable (VOID) +{ + HANDLE hInput = GetStdHandle (STD_INPUT_HANDLE); + DWORD dwMode; + + GetConsoleMode (hInput, &dwMode); + dwMode &= ~ENABLE_PROCESSED_INPUT; + SetConsoleMode (hInput, dwMode); +} + + +VOID ConInEnable (VOID) +{ + HANDLE hInput = GetStdHandle (STD_INPUT_HANDLE); + DWORD dwMode; + + GetConsoleMode (hInput, &dwMode); + dwMode |= ENABLE_PROCESSED_INPUT; + SetConsoleMode (hInput, dwMode); +} + + +VOID ConInDummy (VOID) +{ + HANDLE hInput = GetStdHandle (STD_INPUT_HANDLE); + INPUT_RECORD dummy; + DWORD dwRead; + +#ifdef _DEBUG + if (hInput == INVALID_HANDLE_VALUE) + DebugPrintf (_T("Invalid input handle!!!\n")); +#endif /* _DEBUG */ + ReadConsoleInput (hInput, &dummy, 1, &dwRead); +} + +VOID ConInFlush (VOID) +{ + FlushConsoleInputBuffer (GetStdHandle (STD_INPUT_HANDLE)); +} + + +VOID ConInKey (PINPUT_RECORD lpBuffer) +{ + HANDLE hInput = GetStdHandle (STD_INPUT_HANDLE); + DWORD dwRead; + +#ifdef _DEBUG + if (hInput == INVALID_HANDLE_VALUE) + DebugPrintf (_T("Invalid input handle!!!\n")); +#endif /* _DEBUG */ + + do + { + ReadConsoleInput (hInput, lpBuffer, 1, &dwRead); + if ((lpBuffer->EventType == KEY_EVENT) && + (lpBuffer->Event.KeyEvent.bKeyDown == TRUE)) + break; + } + while (TRUE); +} + + + +VOID ConInString (LPTSTR lpInput, DWORD dwLength) +{ + DWORD dwOldMode; + DWORD dwRead; + HANDLE hFile; + + LPTSTR p; + DWORD i; + PCHAR pBuf; + +#ifdef _UNICODE + pBuf = (PCHAR)malloc(dwLength); +#else + pBuf = lpInput; +#endif + ZeroMemory (lpInput, dwLength * sizeof(TCHAR)); + hFile = GetStdHandle (STD_INPUT_HANDLE); + GetConsoleMode (hFile, &dwOldMode); + + SetConsoleMode (hFile, ENABLE_LINE_INPUT | ENABLE_ECHO_INPUT); + + ReadFile (hFile, (PVOID)pBuf, dwLength, &dwRead, NULL); + +#ifdef _UNICODE + MultiByteToWideChar( InputCodePage, 0, pBuf, dwLength + 1, lpInput, dwLength + 1); +#endif + p = lpInput; + for (i = 0; i < dwRead; i++, p++) + { + if (*p == _T('\x0d')) + { + *p = _T('\0'); + break; + } + } + +#ifdef _UNICODE + free(pBuf); +#endif + + SetConsoleMode (hFile, dwOldMode); +} + +static VOID ConChar(TCHAR c, DWORD nStdHandle) +{ + DWORD dwWritten; + CHAR cc; +#ifdef _UNICODE + CHAR as[2]; + WCHAR ws[2]; + ws[0] = c; + ws[1] = 0; + WideCharToMultiByte( OutputCodePage, 0, ws, 2, as, 2, NULL, NULL); + cc = as[0]; +#else + cc = c; +#endif + WriteFile (GetStdHandle (nStdHandle), + &cc, + 1, + &dwWritten, + NULL); +} + +VOID ConOutChar (TCHAR c) +{ + ConChar(c, STD_OUTPUT_HANDLE); +} + +VOID ConPuts(LPTSTR szText, DWORD nStdHandle) +{ + DWORD dwWritten; + PCHAR pBuf; + INT len; + + len = _tcslen(szText); +#ifdef _UNICODE + pBuf = malloc(len + 1); + len = WideCharToMultiByte( OutputCodePage, 0, szText, len + 1, pBuf, len + 1, NULL, NULL) - 1; +#else + pBuf = szText; +#endif + WriteFile (GetStdHandle (nStdHandle), + pBuf, + len, + &dwWritten, + NULL); + WriteFile (GetStdHandle (nStdHandle), + _T("\n"), + 1, + &dwWritten, + NULL); +#ifdef UNICODE + free(pBuf); +#endif +} + +VOID ConOutResPaging(BOOL NewPage, UINT resID) +{ + TCHAR szMsg[RC_STRING_MAX_SIZE]; + LoadString(CMD_ModuleHandle, resID, szMsg, RC_STRING_MAX_SIZE); + ConOutPrintfPaging(NewPage, szMsg); +} + +VOID ConOutResPuts (UINT resID) +{ + TCHAR szMsg[RC_STRING_MAX_SIZE]; + LoadString(CMD_ModuleHandle, resID, szMsg, RC_STRING_MAX_SIZE); + + ConPuts(szMsg, STD_OUTPUT_HANDLE); +} + +VOID ConOutPuts (LPTSTR szText) +{ + ConPuts(szText, STD_OUTPUT_HANDLE); +} + + +VOID ConPrintf(LPTSTR szFormat, va_list arg_ptr, DWORD nStdHandle) +{ + INT len; + PCHAR pBuf; + TCHAR szOut[OUTPUT_BUFFER_SIZE]; + DWORD dwWritten; + + len = _vstprintf (szOut, szFormat, arg_ptr); +#ifdef _UNICODE + pBuf = malloc(len + 1); + len = WideCharToMultiByte( OutputCodePage, 0, szOut, len + 1, pBuf, len + 1, NULL, NULL) - 1; +#else + pBuf = szOut; +#endif + + WriteFile (GetStdHandle (nStdHandle), + pBuf, + len, + &dwWritten, + NULL); + + +#ifdef UNICODE + free(pBuf); +#endif +} + +INT ConPrintfPaging(BOOL NewPage, LPTSTR szFormat, va_list arg_ptr, DWORD nStdHandle) +{ + INT len; + PCHAR pBuf; + CONSOLE_SCREEN_BUFFER_INFO csbi; + TCHAR szOut[OUTPUT_BUFFER_SIZE]; + DWORD dwWritten; + + /* used to count number of lines since last pause */ + static int LineCount = 0; + + /* used to see how big the screen is */ + int ScreenLines = 0; + + /* the number of chars in a roow */ + int ScreenCol = 0; + + /* chars since end of line */ + int CharEL = 0; + + int i = 0; + + if(NewPage == TRUE) + LineCount = 0; + + /* rest LineCount and return if no string have been given */ + if (szFormat == NULL) + return 0; + + + //get the size of the visual screen that can be printed too + if (!GetConsoleScreenBufferInfo(hConsole, &csbi)) + { + // we assuming its a file handle + ConPrintf(szFormat, arg_ptr, nStdHandle); + return 0; + } + //subtract 2 to account for "press any key..." and for the blank line at the end of PagePrompt() + ScreenLines = (csbi.srWindow.Bottom - csbi.srWindow.Top) - 4; + ScreenCol = (csbi.srWindow.Right - csbi.srWindow.Left) + 1; + + //make sure they didnt make the screen to small + if(ScreenLines<4) + { + ConPrintf(szFormat, arg_ptr, nStdHandle); + return 0; + } + + len = _vstprintf (szOut, szFormat, arg_ptr); +#ifdef _UNICODE + pBuf = malloc(len + 1); + len = WideCharToMultiByte( OutputCodePage, 0, szOut, len + 1, pBuf, len + 1, NULL, NULL) - 1; +#else + pBuf = szOut; +#endif + + for(i = 0; i < len; i++) + { + + if(pBuf[i] == _T('\n')) + { + LineCount++; + CharEL=0; + } + else + { + CharEL++; + if (CharEL>=ScreenCol) + { + if (i+1= ScreenLines) + { + if(_tcsnicmp(&pBuf[i], _T("\n"), 2)!=0) + WriteFile (GetStdHandle (nStdHandle),_T("\n"),sizeof(CHAR),&dwWritten,NULL); + + if(PagePrompt() != PROMPT_YES) + { + return 1; + } + //reset the number of lines being printed + LineCount = 0; + CharEL=0; + } + + } + +#ifdef UNICODE + free(pBuf); +#endif + return 0; +} + +VOID ConErrFormatMessage (DWORD MessageId, ...) +{ + TCHAR szMsg[RC_STRING_MAX_SIZE]; + DWORD ret; + LPTSTR text; + va_list arg_ptr; + + va_start (arg_ptr, MessageId); + ret = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, + NULL, + MessageId, + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + (LPTSTR) &text, + 0, + &arg_ptr); + + va_end (arg_ptr); + if(ret > 0) + { + ConErrPuts (text); + LocalFree(text); + } + else + { + LoadString(CMD_ModuleHandle, STRING_CONSOLE_ERROR, szMsg, RC_STRING_MAX_SIZE); + ConErrPrintf(szMsg); + } +} + +VOID ConOutFormatMessage (DWORD MessageId, ...) +{ + TCHAR szMsg[RC_STRING_MAX_SIZE]; + DWORD ret; + LPTSTR text; + va_list arg_ptr; + + va_start (arg_ptr, MessageId); + ret = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, + NULL, + MessageId, + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + (LPTSTR) &text, + 0, + &arg_ptr); + + va_end (arg_ptr); + if(ret > 0) + { + ConErrPuts (text); + LocalFree(text); + } + else + { + LoadString(CMD_ModuleHandle, STRING_CONSOLE_ERROR, szMsg, RC_STRING_MAX_SIZE); + ConErrPrintf(szMsg); + } +} + +VOID ConOutPrintf (LPTSTR szFormat, ...) +{ + va_list arg_ptr; + + va_start (arg_ptr, szFormat); + ConPrintf(szFormat, arg_ptr, STD_OUTPUT_HANDLE); + va_end (arg_ptr); +} + +INT ConOutPrintfPaging (BOOL NewPage, LPTSTR szFormat, ...) +{ + INT iReturn; + va_list arg_ptr; + + va_start (arg_ptr, szFormat); + iReturn = ConPrintfPaging(NewPage, szFormat, arg_ptr, STD_OUTPUT_HANDLE); + va_end (arg_ptr); + return iReturn; +} + +VOID ConErrChar (TCHAR c) +{ + ConChar(c, STD_ERROR_HANDLE); +} + + +VOID ConErrResPuts (UINT resID) +{ + TCHAR szMsg[RC_STRING_MAX_SIZE]; + LoadString(CMD_ModuleHandle, resID, szMsg, RC_STRING_MAX_SIZE); + ConPuts(szMsg, STD_ERROR_HANDLE); +} + +VOID ConErrPuts (LPTSTR szText) +{ + ConPuts(szText, STD_ERROR_HANDLE); +} + + +VOID ConErrPrintf (LPTSTR szFormat, ...) +{ + va_list arg_ptr; + + va_start (arg_ptr, szFormat); + ConPrintf(szFormat, arg_ptr, STD_ERROR_HANDLE); + va_end (arg_ptr); +} + +#ifdef _DEBUG +VOID DebugPrintf (LPTSTR szFormat, ...) +{ + va_list arg_ptr; + + va_start (arg_ptr, szFormat); + ConPrintf(szFormat, arg_ptr, STD_ERROR_HANDLE); + va_end (arg_ptr); +#if 0 + TCHAR szOut[OUTPUT_BUFFER_SIZE]; + va_start (arg_ptr, szFormat); + _vstprintf (szOut, szFormat, arg_ptr); + OutputDebugString (szOut); + va_end (arg_ptr); +#endif +} +#endif /* _DEBUG */ + +VOID SetCursorXY (SHORT x, SHORT y) +{ + COORD coPos; + + coPos.X = x; + coPos.Y = y; + SetConsoleCursorPosition (GetStdHandle (STD_OUTPUT_HANDLE), coPos); +} + + +VOID GetCursorXY (PSHORT x, PSHORT y) +{ + CONSOLE_SCREEN_BUFFER_INFO csbi; + + GetConsoleScreenBufferInfo (hConsole, &csbi); + + *x = csbi.dwCursorPosition.X; + *y = csbi.dwCursorPosition.Y; +} + + +SHORT GetCursorX (VOID) +{ + CONSOLE_SCREEN_BUFFER_INFO csbi; + + GetConsoleScreenBufferInfo (hConsole, &csbi); + + return csbi.dwCursorPosition.X; +} + + +SHORT GetCursorY (VOID) +{ + CONSOLE_SCREEN_BUFFER_INFO csbi; + + GetConsoleScreenBufferInfo (hConsole, &csbi); + + return csbi.dwCursorPosition.Y; +} + + +VOID GetScreenSize (PSHORT maxx, PSHORT maxy) +{ + CONSOLE_SCREEN_BUFFER_INFO csbi; + + GetConsoleScreenBufferInfo (hConsole, &csbi); + + if (maxx) + *maxx = csbi.dwSize.X; + if (maxy) + *maxy = csbi.dwSize.Y; +} + + +VOID SetCursorType (BOOL bInsert, BOOL bVisible) +{ + CONSOLE_CURSOR_INFO cci; + + cci.dwSize = bInsert ? 10 : 99; + cci.bVisible = bVisible; + + SetConsoleCursorInfo (GetStdHandle (STD_OUTPUT_HANDLE), &cci); +} + +/* EOF */ diff --git a/reactos/base/shell/cmd/copy.c b/reactos/base/shell/cmd/copy.c new file mode 100644 index 00000000000..a54b8751d84 --- /dev/null +++ b/reactos/base/shell/cmd/copy.c @@ -0,0 +1,888 @@ +/* + * COPY.C -- copy internal command. + * + * + * History: + * + * 01-Aug-98 (Rob Lake z63rrl@morgan.ucs.mun.ca) + * started + * + * 13-Aug-1998 (John P. Price) + * fixed memory leak problem in copy function. + * fixed copy function so it would work with wildcards in the source + * + * 13-Dec-1998 (Eric Kohl ) + * Added COPY command to CMD. + * + * 26-Jan-1998 (Eric Kohl ) + * Replaced CRT io functions by Win32 io functions. + * + * 27-Oct-1998 (Eric Kohl ) + * Disabled prompting when used in batch mode. + * + * 03-Apr-2005 (Magnus Olsen) ) + * Remove all hardcode string to En.rc + * + * 13-Jul-2005 (Brandon Turner) ) + * Rewrite to clean up copy and support wildcard. + * + * 20-Jul-2005 (Brandon Turner) ) + * Add touch syntax. "copy arp.exe+,," + * Copy command is now completed. + */ + +#include +#include "resource.h" + +#ifdef INCLUDE_CMD_COPY + +enum +{ + COPY_ASCII = 0x001, /* /A */ + COPY_DECRYPT = 0x004, /* /D */ + COPY_VERIFY = 0x008, /* /V : Dummy, Never will be Impleneted */ + COPY_SHORTNAME = 0x010, /* /N : Dummy, Never will be Impleneted */ + COPY_NO_PROMPT = 0x020, /* /Y */ + COPY_PROMPT = 0x040, /* /-Y */ + COPY_RESTART = 0x080, /* /Z */ + COPY_BINARY = 0x100, /* /B */ +}; + +#define BUFF_SIZE 16384 /* 16k = max buffer size */ + + +INT +copy (TCHAR source[MAX_PATH], + TCHAR dest[MAX_PATH], + INT append, + DWORD lpdwFlags, + BOOL bTouch) +{ + TCHAR szMsg[RC_STRING_MAX_SIZE]; + FILETIME srctime,NewFileTime; + HANDLE hFileSrc; + HANDLE hFileDest; + LPBYTE buffer; + DWORD dwAttrib; + DWORD dwRead; + DWORD dwWritten; + DWORD i; + BOOL bEof = FALSE; + TCHAR TrueDest[MAX_PATH]; + TCHAR TempSrc[MAX_PATH]; + TCHAR * FileName; + SYSTEMTIME CurrentTime; + + /* Check Breaker */ + if(CheckCtrlBreak(BREAK_INPUT)) + return 0; + +#ifdef _DEBUG + DebugPrintf (_T("checking mode\n")); +#endif + + if(bTouch) + { + hFileSrc = CreateFile (source, GENERIC_WRITE, FILE_SHARE_READ, + NULL, OPEN_EXISTING, 0, NULL); + if (hFileSrc == INVALID_HANDLE_VALUE) + { + LoadString(CMD_ModuleHandle, STRING_COPY_ERROR1, szMsg, RC_STRING_MAX_SIZE); + ConOutPrintf(szMsg, source); + nErrorLevel = 1; + return 0; + } + + GetSystemTime(&CurrentTime); + SystemTimeToFileTime(&CurrentTime, &NewFileTime); + if(SetFileTime(hFileSrc,(LPFILETIME) NULL, (LPFILETIME) NULL, &NewFileTime)) + { + CloseHandle(hFileSrc); + nErrorLevel = 1; + return 1; + + } + else + { + CloseHandle(hFileSrc); + return 0; + } + } + + dwAttrib = GetFileAttributes (source); + + hFileSrc = CreateFile (source, GENERIC_READ, FILE_SHARE_READ, + NULL, OPEN_EXISTING, 0, NULL); + if (hFileSrc == INVALID_HANDLE_VALUE) + { + LoadString(CMD_ModuleHandle, STRING_COPY_ERROR1, szMsg, RC_STRING_MAX_SIZE); + ConOutPrintf(szMsg, source); + nErrorLevel = 1; + return 0; + } + +#ifdef _DEBUG + DebugPrintf (_T("getting time\n")); +#endif + + GetFileTime (hFileSrc, &srctime, NULL, NULL); + +#ifdef _DEBUG + DebugPrintf (_T("copy: flags has %s\n"), + lpdwFlags & COPY_ASCII ? "ASCII" : "BINARY"); +#endif + + /* Check to see if /D or /Z are true, if so we need a middle + man to copy the file too to allow us to use CopyFileEx later */ + if(lpdwFlags & COPY_DECRYPT) + { + GetEnvironmentVariable(_T("TEMP"),TempSrc,MAX_PATH); + _tcscat(TempSrc,_T("\\")); + FileName = _tcsrchr(source,_T('\\')); + FileName++; + _tcscat(TempSrc,FileName); + /* This is needed to be on the end to prevent an error + if the user did "copy /D /Z foo bar then it would be copied + too %TEMP%\foo here and when %TEMP%\foo when it sets it up + for COPY_RESTART, this would mean it is copying to itself + which would error when it tried to open the handles for ReadFile + and WriteFile */ + _tcscat(TempSrc,_T(".decrypt")); + if(!CopyFileEx(source, TempSrc, NULL, NULL, FALSE, COPY_FILE_ALLOW_DECRYPTED_DESTINATION)) + { + nErrorLevel = 1; + return 0; + } + _tcscpy(source, TempSrc); + } + + + if(lpdwFlags & COPY_RESTART) + { + _tcscpy(TrueDest, dest); + GetEnvironmentVariable(_T("TEMP"),dest,MAX_PATH); + _tcscat(dest,_T("\\")); + FileName = _tcsrchr(TrueDest,_T('\\')); + FileName++; + _tcscat(dest,FileName); + } + + + + if (!IsExistingFile (dest)) + { +#ifdef _DEBUG + DebugPrintf (_T("opening/creating\n")); +#endif + hFileDest = + CreateFile (dest, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL); + } + else if (!append) + { + if (!_tcscmp (dest, source)) + { + LoadString(CMD_ModuleHandle, STRING_COPY_ERROR2, szMsg, RC_STRING_MAX_SIZE); + ConOutPrintf(szMsg, source); + + CloseHandle (hFileSrc); + nErrorLevel = 1; + return 0; + } + +#ifdef _DEBUG + DebugPrintf (_T("SetFileAttributes (%s, FILE_ATTRIBUTE_NORMAL);\n"), dest); +#endif + SetFileAttributes (dest, FILE_ATTRIBUTE_NORMAL); + +#ifdef _DEBUG + DebugPrintf (_T("DeleteFile (%s);\n"), dest); +#endif + DeleteFile (dest); + + hFileDest = CreateFile (dest, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL); + } + else + { + LONG lFilePosHigh = 0; + + if (!_tcscmp (dest, source)) + { + CloseHandle (hFileSrc); + return 0; + } + +#ifdef _DEBUG + DebugPrintf (_T("opening/appending\n")); +#endif + SetFileAttributes (dest, FILE_ATTRIBUTE_NORMAL); + + hFileDest = + CreateFile (dest, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); + + /* Move to end of file to start writing */ + SetFilePointer (hFileDest, 0, &lFilePosHigh,FILE_END); + } + + + if (hFileDest == INVALID_HANDLE_VALUE) + { + CloseHandle (hFileSrc); + ConOutResPuts(STRING_ERROR_PATH_NOT_FOUND); + nErrorLevel = 1; + return 0; + } + buffer = (LPBYTE)malloc (BUFF_SIZE); + if (buffer == NULL) + { + CloseHandle (hFileDest); + CloseHandle (hFileSrc); + ConOutResPuts(STRING_ERROR_OUT_OF_MEMORY); + nErrorLevel = 1; + return 0; + } + + do + { + + ReadFile (hFileSrc, buffer, BUFF_SIZE, &dwRead, NULL); + if (lpdwFlags & COPY_ASCII) + { + for (i = 0; i < dwRead; i++) + { + /* we're dealing with ASCII files! */ + if (((LPSTR)buffer)[i] == 0x1A) + { + bEof = TRUE; + break; + } + } + dwRead = i; + } + + if (dwRead == 0) + break; + + WriteFile (hFileDest, buffer, dwRead, &dwWritten, NULL); + if (dwWritten != dwRead || CheckCtrlBreak(BREAK_INPUT)) + { + ConOutResPuts(STRING_COPY_ERROR3); + + free (buffer); + CloseHandle (hFileDest); + CloseHandle (hFileSrc); + nErrorLevel = 1; + return 0; + } + } + while (dwRead && !bEof); + +#ifdef _DEBUG + DebugPrintf (_T("setting time\n")); +#endif + SetFileTime (hFileDest, &srctime, NULL, NULL); + + if (lpdwFlags & COPY_ASCII) + { + /* we're dealing with ASCII files! */ + ((LPSTR)buffer)[0] = 0x1A; + ((LPSTR)buffer)[1] = '\0'; +#ifdef _DEBUG + DebugPrintf (_T("appending ^Z\n")); +#endif + WriteFile (hFileDest, buffer, sizeof(CHAR), &dwWritten, NULL); + } + + free (buffer); + CloseHandle (hFileDest); + CloseHandle (hFileSrc); + +#ifdef _DEBUG + DebugPrintf (_T("setting mode\n")); +#endif + SetFileAttributes (dest, dwAttrib); + + /* Now finish off the copy if needed with CopyFileEx */ + if(lpdwFlags & COPY_RESTART) + { + if(!CopyFileEx(dest, TrueDest, NULL, NULL, FALSE, COPY_FILE_RESTARTABLE)) + { + nErrorLevel = 1; + DeleteFile(dest); + return 0; + } + /* Take care of file in the temp folder */ + DeleteFile(dest); + + } + + if(lpdwFlags & COPY_DECRYPT) + DeleteFile(TempSrc); + + + + return 1; +} + + +static INT CopyOverwrite (LPTSTR fn) +{ + /*ask the user if they want to override*/ + TCHAR szMsg[RC_STRING_MAX_SIZE]; + INT res; + LoadString(CMD_ModuleHandle, STRING_COPY_HELP1, szMsg, RC_STRING_MAX_SIZE); + ConOutPrintf(szMsg,fn); + res = FilePromptYNA (_T("")); + return res; +} + + +INT cmd_copy (LPTSTR cmd, LPTSTR param) +{ + TCHAR szMsg[RC_STRING_MAX_SIZE]; + LPTSTR *arg; + INT argc, i, nFiles, nOverwrite = 0, nSrc = -1, nDes = -1; + /* this is the path up to the folder of the src and dest ie C:\windows\ */ + TCHAR szDestPath[MAX_PATH]; + TCHAR szSrcPath[MAX_PATH]; + DWORD dwFlags = 0; + /* If this is the type of copy where we are adding files */ + BOOL bAppend = FALSE; + WIN32_FIND_DATA findBuffer; + HANDLE hFile; + BOOL bTouch = FALSE; + /* Used when something like "copy c*.exe d*.exe" during the process of + figuring out the new name */ + TCHAR tmpName[MAX_PATH] = _T(""); + /* Pointer to keep track of how far through the append input(file1+file2+file3) we are */ + TCHAR * appendPointer = _T("\0"); + /* The full path to src and dest. This has drive letter, folders, and filename */ + TCHAR tmpDestPath[MAX_PATH]; + TCHAR tmpSrcPath[MAX_PATH]; + /* A bool on weather or not the destination name will be taking from the input */ + BOOL bSrcName = FALSE; + /* Seems like a waste but it is a pointer used to copy from input to PreserveName */ + TCHAR * UseThisName; + /* Stores the name( i.e. blah.txt or blah*.txt) which later we might need */ + TCHAR PreserveName[MAX_PATH]; + /* for CMDCOPY env */ + TCHAR *evar; + int size; + TCHAR * szTouch; + BOOL bDone = FALSE; + + + /*Show help/usage info*/ + if (!_tcsncmp (param, _T("/?"), 2)) + { + ConOutResPaging(TRUE, STRING_COPY_HELP2); + return 0; + } + + nErrorLevel = 0; + + /* Get the envor value if it exists */ + evar = malloc(512 * sizeof(TCHAR)); + if (evar==NULL) size = 0; + else + { + size = GetEnvironmentVariable (_T("COPYCMD"), evar, 512); + } + if (size > 512) + { + evar = realloc(evar,size * sizeof(TCHAR) ); + if (evar!=NULL) + { + size = GetEnvironmentVariable (_T("COPYCMD"), evar, size); + } + else + { + size=0; + } + } + + /* check see if we did get any env variable */ + if (size !=0) + { + int t=0; + /* scan and set the flags */ + for (t=0;t= 2) + { + switch (_totupper(arg[i][1])) + { + + case _T('A'): + dwFlags |= COPY_ASCII; + break; + + case _T('B'): + dwFlags |= COPY_BINARY; + break; + + case _T('D'): + dwFlags |= COPY_DECRYPT; + break; + + case _T('V'): + dwFlags |= COPY_VERIFY; + break; + + case _T('N'): + dwFlags |= COPY_SHORTNAME; + break; + + case _T('Y'): + dwFlags |= COPY_NO_PROMPT; + dwFlags &= ~COPY_PROMPT; + break; + + case _T('-'): + if(_tcslen(arg[i]) >= 3) + if(_totupper(arg[i][2]) == _T('Y')) + { + dwFlags &= ~COPY_NO_PROMPT; + dwFlags |= COPY_PROMPT; + } + + break; + + case _T('Z'): + dwFlags |= COPY_RESTART; + break; + + default: + /* invaild switch */ + LoadString(CMD_ModuleHandle, STRING_ERROR_INVALID_SWITCH, szMsg, RC_STRING_MAX_SIZE); + ConOutPrintf(szMsg, _totupper(arg[i][1])); + nErrorLevel = 1; + return 1; + break; + } + } + /*If it was a switch, subtract from total arguments*/ + nFiles--; + } + else + { + /*if it isnt a switch then it is the source or destination*/ + if(nSrc == -1) + { + nSrc = i; + } + else if(*arg[i] == _T('+') || *arg[i] == _T(',')) + { + /* Add these onto the source string + this way we can do all checks + directly on source string later on */ + _tcscat(arg[nSrc],arg[i]); + nFiles--; + } + else if(nDes == -1) + { + nDes = i; + } + + } + } + + /* keep quiet within batch files */ + if (bc != NULL) + { + dwFlags |= COPY_NO_PROMPT; + dwFlags &= ~COPY_PROMPT; + } + + if(nFiles < 1) + { + /* There is not enough files, there has to be at least 1 */ + ConOutResPuts(STRING_ERROR_REQ_PARAM_MISSING); + freep (arg); + return 1; + } + + if(nFiles > 2) + { + /* there is too many file names in command */ + LoadString(CMD_ModuleHandle, STRING_ERROR_TOO_MANY_PARAMETERS, szMsg, RC_STRING_MAX_SIZE); + ConErrPrintf(szMsg,_T("")); + nErrorLevel = 1; + freep (arg); + return 1; + } + + if(((_tcschr (arg[nSrc], _T('+')) != NULL) || + (_tcschr (arg[nSrc], _T('*')) != NULL && _tcschr (arg[nDes], _T('*')) == NULL) || + (IsExistingDirectory (arg[nSrc]) && (_tcschr (arg[nDes], _T('*')) == NULL && !IsExistingDirectory (arg[nDes]))) + )) + { + /* There is a + in the source filename, this means + that there is more then one file being put into + one file. */ + bAppend = TRUE; + if(_tcschr (arg[nSrc], _T('+')) != NULL) + appendPointer = arg[nSrc]; + } + + /* Reusing the number of files variable */ + nFiles = 0; + + do + { + /* Set up the string that is the path to the destination */ + if(nDes != -1) + { + if(_tcslen(arg[nDes]) == 2 && arg[nDes][1] == _T(':')) + { + GetRootPath(arg[nDes],szDestPath,MAX_PATH); + } + else + /* If the user entered two file names then form the full string path*/ + GetFullPathName (arg[nDes], MAX_PATH, szDestPath, NULL); + + } + else + { + /* If no destination was entered then just use + the current directory as the destination */ + GetCurrentDirectory (MAX_PATH, szDestPath); + } + + + /* Get the full string of the path to the source file*/ + if(_tcschr (arg[nSrc], _T('+')) != NULL) + { + _tcscpy(tmpName,_T("\0")); + /* Loop through the source file name and copy all + the chars one at a time until it gets too + */ + while(TRUE) + { + if(!_tcsncmp (appendPointer,_T("+"),1) || !_tcsncmp (appendPointer,_T("\0"),1)) + { + /* Now that the pointer is on the + we + need to go to the start of the next filename */ + if(!_tcsncmp (appendPointer,_T("+"),1)) + appendPointer++; + else + bDone = TRUE; + break; + + } + + _tcsncat(tmpName,appendPointer,1); + appendPointer++; + + } + /* Finish the string off with a null char */ + _tcsncat(tmpName,_T("\0"),1); + + if(_tcschr (arg[nSrc], _T(',')) != NULL) + { + /* Only time there is a , in the source is when they are using touch + Cant have a destination and can only have on ,, at the end of the string + Cant have more then one file name */ + szTouch = _tcsstr (arg[nSrc], _T("+")); + if(_tcsncmp (szTouch,_T("+,,\0"),4) || nDes != -1) + { + LoadString(CMD_ModuleHandle, STRING_ERROR_INVALID_PARAM_FORMAT, szMsg, RC_STRING_MAX_SIZE); + ConErrPrintf(szMsg,arg[nSrc]); + nErrorLevel = 1; + freep (arg); + return 1; + } + bTouch = TRUE; + bDone = TRUE; + } + + if(_tcslen(tmpName) == 2) + { + if(tmpName[1] == _T(':')) + { + + GetRootPath(tmpName,szSrcPath,MAX_PATH); + } + } + else + /* Get the full path to first file in the string of file names */ + GetFullPathName (tmpName, MAX_PATH, szSrcPath, NULL); + } + else + { + bDone = TRUE; + if(_tcslen(arg[nSrc]) == 2 && arg[nSrc][1] == _T(':')) + { + GetRootPath(arg[nSrc],szSrcPath,MAX_PATH); + } + else + /* Get the full path of the source file */ + GetFullPathName (arg[nSrc], MAX_PATH, szSrcPath, NULL); + + } + + /* From this point on, we can assume that the shortest path is 3 letters long + and that would be [DriveLetter]:\ */ + + /* If there is no * in the path name and it is a folder + then we will need to add a wildcard to the pathname + so FindFirstFile comes up with all the files in that + folder */ + if(_tcschr (szSrcPath, _T('*')) == NULL && + IsExistingDirectory (szSrcPath)) + { + /* If it doesnt have a \ at the end already then on needs to be added */ + if(szSrcPath[_tcslen(szSrcPath) - 1] != _T('\\')) + _tcscat (szSrcPath, _T("\\")); + /* Add a wildcard after the \ */ + _tcscat (szSrcPath, _T("*")); + } + /* Make sure there is an ending slash to the path if the dest is a folder */ + if(_tcschr (szDestPath, _T('*')) == NULL && + IsExistingDirectory(szDestPath)) + { + if(szDestPath[_tcslen(szDestPath) - 1] != _T('\\')) + _tcscat (szDestPath, _T("\\")); + } + + + /* Get a list of all the files */ + hFile = FindFirstFile (szSrcPath, &findBuffer); + + + /* We need to figure out what the name of the file in the is going to be */ + if((szDestPath[_tcslen(szDestPath) - 1] == _T('*') && szDestPath[_tcslen(szDestPath) - 2] == _T('\\')) || + szDestPath[_tcslen(szDestPath) - 1] == _T('\\')) + { + /* In this case we will be using the same name as the source file + for the destination file because destination is a folder */ + bSrcName = TRUE; + } + else + { + /* Save the name the user entered */ + UseThisName = _tcsrchr(szDestPath,_T('\\')); + UseThisName++; + _tcscpy(PreserveName,UseThisName); + } + + /* Strip the paths back to the folder they are in */ + for(i = (_tcslen(szSrcPath) - 1); i > -1; i--) + if(szSrcPath[i] != _T('\\')) + szSrcPath[i] = _T('\0'); + else + break; + + for(i = (_tcslen(szDestPath) - 1); i > -1; i--) + if(szDestPath[i] != _T('\\')) + szDestPath[i] = _T('\0'); + else + break; + + do + { + /* Check Breaker */ + if(CheckCtrlBreak(BREAK_INPUT)) + { + freep(arg); + return 1; + } + /* Set the override to yes each new file */ + nOverwrite = 1; + + /* If it couldnt open the file handle, print out the error */ + if(hFile == INVALID_HANDLE_VALUE) + { + ConOutFormatMessage (GetLastError(), szSrcPath); + freep (arg); + nErrorLevel = 1; + return 1; + } + + /* Ignore the . and .. files */ + if(!_tcscmp (findBuffer.cFileName, _T(".")) || + !_tcscmp (findBuffer.cFileName, _T(".."))|| + findBuffer.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + continue; + + /* Copy the base folder over to a tmp string */ + _tcscpy(tmpDestPath,szDestPath); + + /* Can't put a file into a folder that isnt there */ + if(!IsExistingDirectory(szDestPath)) + { + ConOutFormatMessage (GetLastError (), szSrcPath); + freep (arg); + nErrorLevel = 1; + return 1; + } + /* Copy over the destination path name */ + if(bSrcName) + _tcscat (tmpDestPath, findBuffer.cFileName); + else + { + /* If there is no wildcard you can use the name the user entered */ + if(_tcschr (PreserveName, _T('*')) == NULL) + { + _tcscat (tmpDestPath, PreserveName); + } + else + { + /* The following lines of copy were written by someone else + (most likely Eric Khoul) and it was taken from ren.c */ + LPTSTR p,q,r; + TCHAR DoneFile[MAX_PATH]; + /* build destination file name */ + p = findBuffer.cFileName; + q = PreserveName; + r = DoneFile; + while(*q != 0) + { + if (*q == '*') + { + q++; + while (*p != 0 && *p != *q) + { + *r = *p; + p++; + r++; + } + } + else if (*q == '?') + { + q++; + if (*p != 0) + { + *r = *p; + p++; + r++; + } + } + else + { + *r = *q; + if (*p != 0) + p++; + q++; + r++; + } + } + *r = 0; + /* Add the filename to the tmp string path */ + _tcscat (tmpDestPath, DoneFile); + + } + } + + + /* Build the string path to the source file */ + _tcscpy(tmpSrcPath,szSrcPath); + _tcscat (tmpSrcPath, findBuffer.cFileName); + + /* Check to see if the file is the same file */ + if(!bTouch && !_tcscmp (tmpSrcPath, tmpDestPath)) + continue; + + /* Handle any overriding / prompting that needs to be done */ + if(((!(dwFlags & COPY_NO_PROMPT) && IsExistingFile (tmpDestPath)) || dwFlags & COPY_PROMPT) && !bTouch) + nOverwrite = CopyOverwrite(tmpDestPath); + if(nOverwrite == PROMPT_NO || nOverwrite == PROMPT_BREAK) + continue; + if(nOverwrite == PROMPT_ALL || (nOverwrite == PROMPT_YES && bAppend)) + dwFlags |= COPY_NO_PROMPT; + + /* Tell weather the copy was successful or not */ + if(copy(tmpSrcPath,tmpDestPath, bAppend, dwFlags, bTouch)) + { + nFiles++; + /* only print source name when more then one file */ + if(_tcschr (arg[nSrc], _T('+')) != NULL || _tcschr (arg[nSrc], _T('*')) != NULL) + ConOutPrintf(_T("%s\n"),findBuffer.cFileName); + //LoadString(CMD_ModuleHandle, STRING_MOVE_ERROR1, szMsg, RC_STRING_MAX_SIZE); + } + else + { + /* print out the error message */ + LoadString(CMD_ModuleHandle, STRING_COPY_ERROR3, szMsg, RC_STRING_MAX_SIZE); + ConOutPrintf(szMsg); + ConOutFormatMessage (GetLastError(), szSrcPath); + nErrorLevel = 1; + } + + /* Loop through all wildcard files */ + }while(FindNextFile (hFile, &findBuffer)); + /* Loop through all files in src string with a + */ + }while(!bDone); + + /* print out the number of files copied */ + LoadString(CMD_ModuleHandle, STRING_COPY_FILE, szMsg, RC_STRING_MAX_SIZE); + ConOutPrintf(szMsg, nFiles); + + CloseHandle(hFile); + if (arg!=NULL) + free(arg); + + return 0; +} + + +#endif /* INCLUDE_CMD_COPY */ diff --git a/reactos/base/shell/cmd/date.c b/reactos/base/shell/cmd/date.c new file mode 100644 index 00000000000..3c71a4b6329 --- /dev/null +++ b/reactos/base/shell/cmd/date.c @@ -0,0 +1,273 @@ +/* + * DATE.C - date internal command. + * + * + * History: + * + * 08 Jul 1998 (John P. Price) + * started. + * + * 20 Jul 1998 (John P. Price) + * corrected number of days for December from 30 to 31. + * (Thanx to Steffen Kaiser for bug report) + * + * 27-Jul-1998 (John P Price ) + * added config.h include + * + * 29-Jul-1998 (Rob Lake) + * fixed stand-alone mode. + * Added Pacific C compatible dos_getdate functions + * + * 09-Jan-1999 (Eric Kohl ) + * Added locale support + * + * 23-Jan-1999 (Eric Kohl ) + * Unicode and redirection safe! + * + * 04-Feb-1999 (Eric Kohl ) + * Fixed date input bug. + * + * 03-Apr-2005 (Magnus Olsen) ) + * Remove all hardcode string to En.rc + */ + +#include +#include "resource.h" + +#ifdef INCLUDE_CMD_DATE + + +static WORD awMonths[2][13] = +{ + {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, + {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} +}; + + +static VOID +PrintDateString (VOID) +{ + TCHAR szMsg[RC_STRING_MAX_SIZE]; + + switch (nDateFormat) + { + case 0: /* mmddyy */ + default: + LoadString(CMD_ModuleHandle, STRING_DATE_HELP1, szMsg, RC_STRING_MAX_SIZE); + ConOutPrintf(szMsg, cDateSeparator, cDateSeparator); + break; + + case 1: /* ddmmyy */ + LoadString(CMD_ModuleHandle, STRING_DATE_HELP2, szMsg, RC_STRING_MAX_SIZE); + ConOutPrintf(szMsg, cDateSeparator, cDateSeparator); + break; + + case 2: /* yymmdd */ + LoadString(CMD_ModuleHandle, STRING_DATE_HELP3, szMsg, RC_STRING_MAX_SIZE); + ConOutPrintf(szMsg, cDateSeparator, cDateSeparator); + break; + } +} + + +static BOOL +ReadNumber (LPTSTR *s, LPWORD lpwValue) +{ + if (_istdigit (**s)) + { + while (_istdigit (**s)) + { + *lpwValue = *lpwValue * 10 + **s - _T('0'); + (*s)++; + } + return TRUE; + } + return FALSE; +} + + +static BOOL +ReadSeparator (LPTSTR *s) +{ + if (**s == _T('/') || **s == _T('-') || **s == cDateSeparator) + { + (*s)++; + return TRUE; + } + return FALSE; +} + + +static BOOL +ParseDate (LPTSTR s) +{ + SYSTEMTIME d; + unsigned char leap; + LPTSTR p = s; + + if (!*s) + return TRUE; + + GetLocalTime (&d); + + d.wYear = 0; + d.wDay = 0; + d.wMonth = 0; + + switch (nDateFormat) + { + case 0: /* mmddyy */ + default: + if (!ReadNumber (&p, &d.wMonth)) + return FALSE; + if (!ReadSeparator (&p)) + return FALSE; + if (!ReadNumber (&p, &d.wDay)) + return FALSE; + if (!ReadSeparator (&p)) + return FALSE; + if (!ReadNumber (&p, &d.wYear)) + return FALSE; + break; + + case 1: /* ddmmyy */ + if (!ReadNumber (&p, &d.wDay)) + return FALSE; + if (!ReadSeparator (&p)) + return FALSE; + if (!ReadNumber (&p, &d.wMonth)) + return FALSE; + if (!ReadSeparator (&p)) + return FALSE; + if (!ReadNumber (&p, &d.wYear)) + return FALSE; + break; + + case 2: /* yymmdd */ + if (!ReadNumber (&p, &d.wYear)) + return FALSE; + if (!ReadSeparator (&p)) + return FALSE; + if (!ReadNumber (&p, &d.wMonth)) + return FALSE; + if (!ReadSeparator (&p)) + return FALSE; + if (!ReadNumber (&p, &d.wDay)) + return FALSE; + break; + } + + /* if only entered two digits: */ + /* assume 2000's if value less than 80 */ + /* assume 1900's if value greater or equal 80 */ + if (d.wYear <= 99) + { + if (d.wYear >= 80) + d.wYear = 1900 + d.wYear; + else + d.wYear = 2000 + d.wYear; + } + + leap = (!(d.wYear % 4) && (d.wYear % 100)) || !(d.wYear % 400); + + if ((d.wMonth >= 1 && d.wMonth <= 12) && + (d.wDay >= 1 && d.wDay <= awMonths[leap][d.wMonth]) && + (d.wYear >= 1980 && d.wYear <= 2099)) + { + SetLocalTime (&d); + return TRUE; + } + + return FALSE; +} + + +INT cmd_date (LPTSTR cmd, LPTSTR param) +{ + LPTSTR *arg; + INT argc; + INT i; + BOOL bPrompt = TRUE; + INT nDateString = -1; + + if (!_tcsncmp (param, _T("/?"), 2)) + { + ConOutResPaging(TRUE,STRING_DATE_HELP4); + return 0; + } + + nErrorLevel = 0; + + /* build parameter array */ + arg = split (param, &argc, FALSE); + + /* check for options */ + for (i = 0; i < argc; i++) + { + if (_tcsicmp (arg[i], _T("/t")) == 0) + bPrompt = FALSE; + if ((*arg[i] != _T('/')) && (nDateString == -1)) + nDateString = i; + } + + if (nDateString == -1) + PrintDate (); + + if (!bPrompt) + { + freep (arg); + return 0; + } + + if (nDateString == -1) + { + while (TRUE) /* forever loop */ + { + TCHAR s[40]; + + PrintDateString (); + ConInString (s, 40); +#ifdef _DEBUG + DebugPrintf (_T("\'%s\'\n"), s); +#endif + while (*s && s[_tcslen (s) - 1] < _T(' ')) + s[_tcslen (s) - 1] = _T('\0'); + if (ParseDate (s)) + { + freep (arg); + return 0; + } + ConErrResPuts(STRING_DATE_ERROR); + + } + } + else + { + if (!ParseDate (arg[nDateString])) + { + while (TRUE) /* forever loop */ + { + TCHAR s[40]; + ConErrResPuts(STRING_DATE_ERROR); + + PrintDateString (); + ConInString (s, 40); + + while (*s && s[_tcslen (s) - 1] < _T(' ')) + s[_tcslen (s) - 1] = _T('\0'); + if (ParseDate (s)) + { + freep (arg); + return 0; + } + } + } + } + + freep (arg); + + return 0; +} +#endif /* INCLUDE_CMD_DATE */ + +/* EOF */ diff --git a/reactos/base/shell/cmd/del.c b/reactos/base/shell/cmd/del.c new file mode 100644 index 00000000000..b059e551463 --- /dev/null +++ b/reactos/base/shell/cmd/del.c @@ -0,0 +1,570 @@ +/* +* DEL.C - del internal command. +* +* +* History: +* +* 06/29/98 (Rob Lake rlake@cs.mun.ca) +* rewrote del to support wildcards +* added my name to the contributors +* +* 07/13/98 (Rob Lake) +* fixed bug that caused del not to delete file with out +* attribute. moved set, del, ren, and ver to there own files +* +* 27-Jul-1998 (John P Price ) +* added config.h include +* +* 09-Dec-1998 (Eric Kohl ) +* Fixed command line parsing bugs. +* +* 21-Jan-1999 (Eric Kohl ) +* Started major rewrite using a new structure. +* +* 03-Feb-1999 (Eric Kohl ) +* First working version. +* +* 30-Mar-1999 (Eric Kohl ) +* Added quiet ("/Q"), wipe ("/W") and zap ("/Z") option. +* +* 06-Nov-1999 (Eric Kohl ) +* Little fix to keep DEL quiet inside batch files. +* +* 28-Jan-2004 (Michael Fritscher ) +* Added prompt ("/P"), yes ("/Y") and wipe("/W") option. +* +* 22-Jun-2005 (Brandon Turner ) +* Added exclusive deletion "del * -abc.txt -text*.txt" +* +* 22-Jun-2005 (Brandon Turner ) +* Implemented /A example "del /A:H /A:-R *.exe -ping.exe" +* +* 07-Aug-2005 +* Removed the exclusive deletion (see two comments above) because '-' is a valid file name character. +* Optimized the recursive deletion in directories. +* Preload some nice strings. +*/ + +#include +#include "resource.h" + +#ifdef INCLUDE_CMD_DEL + + +enum +{ + DEL_ATTRIBUTES = 0x001, /* /A */ + DEL_NOTHING = 0x004, /* /N */ + DEL_PROMPT = 0x008, /* /P */ + DEL_QUIET = 0x010, /* /Q */ + DEL_SUBDIR = 0x020, /* /S */ + DEL_TOTAL = 0x040, /* /T */ + DEL_WIPE = 0x080, /* /W */ + DEL_EMPTYDIR = 0x100, /* /X : not implemented */ + DEL_YES = 0x200, /* /Y */ + DEL_FORCE = 0x800 /* /F */ +}; + +enum +{ + ATTR_ARCHIVE = 0x001, /* /A:A */ + ATTR_HIDDEN = 0x002, /* /A:H */ + ATTR_SYSTEM = 0x004, /* /A:S */ + ATTR_READ_ONLY = 0x008, /* /A:R */ + ATTR_N_ARCHIVE = 0x010, /* /A:-A */ + ATTR_N_HIDDEN = 0x020, /* /A:-H */ + ATTR_N_SYSTEM = 0x040, /* /A:-S */ + ATTR_N_READ_ONLY = 0x080 /* /A:-R */ +}; + +static TCHAR szDeleteWipe[RC_STRING_MAX_SIZE]; +static TCHAR szDelHelp2[RC_STRING_MAX_SIZE]; +static TCHAR szDelHelp3[RC_STRING_MAX_SIZE]; +static TCHAR szDelHelp4[RC_STRING_MAX_SIZE]; +static TCHAR szDelError5[RC_STRING_MAX_SIZE]; +static TCHAR szDelError6[RC_STRING_MAX_SIZE]; +static TCHAR szDelError7[RC_STRING_MAX_SIZE]; +static TCHAR CMDPath[MAX_PATH]; + +static BOOLEAN StringsLoaded = FALSE; + +static VOID LoadStrings(VOID) +{ + LoadString( CMD_ModuleHandle, STRING_DELETE_WIPE, szDeleteWipe, RC_STRING_MAX_SIZE); + LoadString( CMD_ModuleHandle, STRING_DEL_HELP2, szDelHelp2, RC_STRING_MAX_SIZE); + LoadString( CMD_ModuleHandle, STRING_DEL_HELP3, szDelHelp3, RC_STRING_MAX_SIZE); + LoadString( CMD_ModuleHandle, STRING_DEL_HELP4, szDelHelp4, RC_STRING_MAX_SIZE); + LoadString( CMD_ModuleHandle, STRING_DEL_ERROR5, szDelError5, RC_STRING_MAX_SIZE); + LoadString( CMD_ModuleHandle, STRING_DEL_ERROR6, szDelError6, RC_STRING_MAX_SIZE); + LoadString( CMD_ModuleHandle, STRING_DEL_ERROR7, szDelError7, RC_STRING_MAX_SIZE); + GetModuleFileName(NULL, CMDPath, MAX_PATH); + StringsLoaded = TRUE; +} + +static BOOL +RemoveFile (LPTSTR lpFileName, DWORD dwFlags, WIN32_FIND_DATA* f) +{ + /*This function is called by CommandDelete and + does the actual process of deleting the single + file*/ + if(CheckCtrlBreak(BREAK_INPUT)) + return 1; + + /*check to see if it is read only and if this is done based on /A + if it is done by file name, access is denied. However, if it is done + using the /A switch you must un-read only the file and allow it to be + deleted*/ + if((dwFlags & DEL_ATTRIBUTES) || (dwFlags & DEL_FORCE)) + { + if(f->dwFileAttributes & FILE_ATTRIBUTE_READONLY) + { + /*setting file to normal, not saving old attrs first + because the file is going to be deleted anyways + so the only thing that matters is that it isnt + read only.*/ + SetFileAttributes(lpFileName,FILE_ATTRIBUTE_NORMAL); + } + } + + if (dwFlags & DEL_WIPE) + { + + HANDLE file; + DWORD temp; +#define BufferSize 65536 + BYTE buffer[BufferSize]; + LONGLONG i; + LARGE_INTEGER FileSize; + + FileSize.u.HighPart = f->nFileSizeHigh; + FileSize.u.LowPart = f->nFileSizeLow; + + for(i = 0; i < BufferSize; i++) + { + buffer[i]=rand() % 256; + } + file = CreateFile (lpFileName, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_WRITE_THROUGH, NULL); + if (file != INVALID_HANDLE_VALUE) + { + for(i = 0; i < (FileSize.QuadPart - BufferSize); i += BufferSize) + { + WriteFile (file, buffer, BufferSize, &temp, NULL); + ConOutPrintf (_T("%I64d%% %s\r"),(i * (LONGLONG)100)/FileSize.QuadPart,szDeleteWipe); + } + WriteFile (file, buffer, (DWORD)(FileSize.QuadPart - i), &temp, NULL); + ConOutPrintf (_T("100%% %s\n"),szDeleteWipe); + CloseHandle (file); + } + } + + return DeleteFile (lpFileName); +} + + +static DWORD +DeleteFiles(LPTSTR FileName, DWORD* dwFlags, DWORD dwAttrFlags) +{ + TCHAR szFullPath[MAX_PATH]; + TCHAR szFileName[MAX_PATH]; + LPTSTR pFilePart; + HANDLE hFile; + WIN32_FIND_DATA f; + BOOL bExclusion; + INT res; + DWORD dwFiles = 0; + + _tcscpy(szFileName, FileName); + + if(_tcschr (szFileName, _T('*')) == NULL && + IsExistingDirectory (szFileName)) + { + /* If it doesnt have a \ at the end already then on needs to be added */ + if(szFileName[_tcslen(szFileName) - 1] != _T('\\')) + _tcscat (szFileName, _T("\\")); + /* Add a wildcard after the \ */ + _tcscat (szFileName, _T("*")); + } + + if(!_tcscmp (szFileName, _T("*")) || + !_tcscmp (szFileName, _T("*.*")) || + (szFileName[_tcslen(szFileName) - 2] == _T('\\') && szFileName[_tcslen(szFileName) - 1] == _T('*'))) + { + /* well, the user wants to delete everything but if they didnt yes DEL_YES, DEL_QUIET, or DEL_PROMPT + then we are going to want to make sure that in fact they want to do that. */ + + if (!((*dwFlags & DEL_YES) || (*dwFlags & DEL_QUIET) || (*dwFlags & DEL_PROMPT))) + { + res = FilePromptYNA (szDelHelp2); + if ((res == PROMPT_NO) || (res == PROMPT_BREAK)) + return 0x80000000; + if(res == PROMPT_ALL) + *dwFlags |= DEL_YES; + } + } + + GetFullPathName (szFileName, + MAX_PATH, + szFullPath, + &pFilePart); + + hFile = FindFirstFile(szFullPath, &f); + if (hFile != INVALID_HANDLE_VALUE) + { + do + { + bExclusion = FALSE; + + /*if it is going to be excluded by - no need to check attrs*/ + if(*dwFlags & DEL_ATTRIBUTES && !bExclusion) + { + + /*save if file attr check if user doesnt care about that attr anyways*/ + if(dwAttrFlags & ATTR_ARCHIVE && !(f.dwFileAttributes & FILE_ATTRIBUTE_ARCHIVE)) + bExclusion = TRUE; + if(dwAttrFlags & ATTR_HIDDEN && !(f.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)) + bExclusion = TRUE; + if(dwAttrFlags & ATTR_SYSTEM && !(f.dwFileAttributes & FILE_ATTRIBUTE_SYSTEM)) + bExclusion = TRUE; + if(dwAttrFlags & ATTR_READ_ONLY && !(f.dwFileAttributes & FILE_ATTRIBUTE_READONLY)) + bExclusion = TRUE; + if(dwAttrFlags & ATTR_N_ARCHIVE && (f.dwFileAttributes & FILE_ATTRIBUTE_ARCHIVE)) + bExclusion = TRUE; + if(dwAttrFlags & ATTR_N_HIDDEN && (f.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)) + bExclusion = TRUE; + if(dwAttrFlags & ATTR_N_SYSTEM && (f.dwFileAttributes & FILE_ATTRIBUTE_SYSTEM)) + bExclusion = TRUE; + if(dwAttrFlags & ATTR_N_READ_ONLY && (f.dwFileAttributes & FILE_ATTRIBUTE_READONLY)) + bExclusion = TRUE; + } + + if(bExclusion) + continue; + + /* ignore directories */ + if (f.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + continue; + + + _tcscpy (pFilePart, f.cFileName); + + /* We cant delete ourselves */ + if(!_tcscmp (CMDPath,szFullPath)) + continue; + + +#ifdef _DEBUG + ConErrPrintf(_T("Full filename: %s\n"), szFullPath); +#endif + + /* ask for deleting */ + if (*dwFlags & DEL_PROMPT) + { + ConErrPrintf(szDelError5, szFullPath); + + res = FilePromptYN (szDelError6); + + if ((res == PROMPT_NO) || (res == PROMPT_BREAK)) + { + nErrorLevel = 0; + continue; + } + } + + /*user cant ask it to be quiet and tell you what it did*/ + if (!(*dwFlags & DEL_QUIET) && !(*dwFlags & DEL_TOTAL)) + { + ConErrPrintf(szDelError7, szFullPath); + } + + /* delete the file */ + if(*dwFlags & DEL_NOTHING) + continue; + + if(RemoveFile (szFullPath, *dwFlags, &f)) + dwFiles++; + else + { + ErrorMessage (GetLastError(), _T("")); +// FindClose(hFile); +// return -1; + } + } + while (FindNextFile (hFile, &f)); + FindClose (hFile); + } + return dwFiles; +} + + +static DWORD +ProcessDirectory(LPTSTR FileName, DWORD* dwFlags, DWORD dwAttrFlags) +{ + TCHAR szFullPath[MAX_PATH]; + LPTSTR pFilePart; + LPTSTR pSearchPart; + HANDLE hFile; + WIN32_FIND_DATA f; + DWORD dwFiles = 0; + + GetFullPathName (FileName, + MAX_PATH, + szFullPath, + &pFilePart); + + dwFiles = DeleteFiles(szFullPath, dwFlags, dwAttrFlags); + if (dwFiles & 0x80000000) + return dwFiles; + + if (*dwFlags & DEL_SUBDIR) + { + /* Get just the file name */ + pSearchPart = _tcsrchr(FileName,_T('\\')); + if(pSearchPart != NULL) + pSearchPart++; + else + pSearchPart = FileName; + + /* Get the full path to the file */ + GetFullPathName (FileName,MAX_PATH,szFullPath,NULL); + + /* strip the filename off of it */ + pFilePart = _tcsrchr(szFullPath, _T('\\')); + if (pFilePart == NULL) + { + pFilePart = szFullPath; + } + else + { + pFilePart++; + } + + _tcscpy(pFilePart, _T("*")); + + hFile = FindFirstFile(szFullPath, &f); + if (hFile != INVALID_HANDLE_VALUE) + { + do + { + if (!(f.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) || + !_tcscmp(f.cFileName, _T(".")) || + !_tcscmp(f.cFileName, _T(".."))) + continue; + + _tcscpy(pFilePart, f.cFileName); + _tcscat(pFilePart, _T("\\")); + _tcscat(pFilePart, pSearchPart); + + dwFiles +=ProcessDirectory(szFullPath, dwFlags, dwAttrFlags); + if (dwFiles & 0x80000000) + { + break; + } + } + while (FindNextFile (hFile, &f)); + FindClose (hFile); + } + } + return dwFiles; +} + + + +INT CommandDelete (LPTSTR cmd, LPTSTR param) +{ + /*cmd is the command that was given, in this case it will always be "del" or "delete" + param is whatever is given after the command*/ + + LPTSTR *arg = NULL; + INT args; + INT i; + INT nEvalArgs = 0; /* nunber of evaluated arguments */ + DWORD dwFlags = 0; + DWORD dwAttrFlags = 0; + DWORD dwFiles = 0; + LONG ch; + TCHAR szOrginalArg[MAX_PATH]; + + /*checks the first two chars of param to see if it is /? + this however allows the following command to not show help + "del frog.txt /?" */ + + if (!StringsLoaded) + { + LoadStrings(); + } + + if (!_tcsncmp (param, _T("/?"), 2)) + { + ConOutResPaging(TRUE,STRING_DEL_HELP1); + return 0; + } + + nErrorLevel = 0; + + arg = split (param, &args, FALSE); + + if (args == 0) + { + /* only command given */ + error_req_param_missing (); + freep (arg); + return 1; + } + /* check for options anywhere in command line */ + for (i = 0; i < args; i++) + { + if (*arg[i] == _T('/')) + { + /*found a command, but check to make sure it has something after it*/ + if (_tcslen (arg[i]) >= 2) + { + ch = _totupper (arg[i][1]); + if (ch == _T('N')) + { + dwFlags |= DEL_NOTHING; + } + else if (ch == _T('P')) + { + dwFlags |= DEL_PROMPT; + } + else if (ch == _T('Q')) + { + dwFlags |= DEL_QUIET; + } + else if (ch == _T('F')) + { + dwFlags |= DEL_FORCE; + } + else if (ch == _T('S')) + { + dwFlags |= DEL_SUBDIR; + } + else if (ch == _T('T')) + { + dwFlags |= DEL_TOTAL; + } + else if (ch == _T('W')) + { + dwFlags |= DEL_WIPE; + } + else if (ch == _T('Y')) + { + dwFlags |= DEL_YES; + } + else if (ch == _T('A')) + { + + dwFlags |= DEL_ATTRIBUTES; + /*the proper syntax for /A has a min of 4 chars + i.e. /A:R or /A:-H */ + if (_tcslen (arg[i]) < 4) + { + error_invalid_parameter_format(arg[i]); + return 0; + } + ch = _totupper (arg[i][3]); + if (_tcslen (arg[i]) == 4) + { + if(ch == _T('A')) + { + dwAttrFlags |= ATTR_ARCHIVE; + } + if(ch == _T('H')) + { + dwAttrFlags |= ATTR_HIDDEN; + } + if(ch == _T('S')) + { + dwAttrFlags |= ATTR_SYSTEM; + } + if(ch == _T('R')) + { + dwAttrFlags |= ATTR_READ_ONLY; + } + } + if (_tcslen (arg[i]) == 5) + { + if(ch == _T('-')) + { + ch = _totupper (arg[i][4]); + if(ch == _T('A')) + { + dwAttrFlags |= ATTR_N_ARCHIVE; + } + if(ch == _T('H')) + { + dwAttrFlags |= ATTR_N_HIDDEN; + } + if(ch == _T('S')) + { + dwAttrFlags |= ATTR_N_SYSTEM; + } + if(ch == _T('R')) + { + dwAttrFlags |= ATTR_N_READ_ONLY; + } + } + } + } + } + + nEvalArgs++; + } + } + + /* there are only options on the command line --> error!!! + there is the same number of args as there is flags, so none of the args were filenames*/ + if (args == nEvalArgs) + { + error_req_param_missing (); + freep (arg); + return 1; + } + + /* keep quiet within batch files */ + if (bc != NULL) + dwFlags |= DEL_QUIET; + + /* check for filenames anywhere in command line */ + for (i = 0; i < args && !(dwFiles & 0x80000000); i++) + { + + /*this checks to see if it isnt a flag, if it isnt, we assume it is a file name*/ + if((*arg[i] == _T('/')) || (*arg[i] == _T('-'))) + continue; + + /* We want to make a copies of the argument */ + if(_tcslen(arg[i]) == 2 && arg[i][1] == _T(':')) + { + /* Check for C: D: ... */ + GetRootPath(arg[i],szOrginalArg,MAX_PATH); + } + else + { + _tcscpy(szOrginalArg,arg[i]); + } + dwFiles += ProcessDirectory(szOrginalArg, &dwFlags, dwAttrFlags); + + } + + freep (arg); + + /*Based on MS cmd, we only tell what files are being deleted when /S is used */ + if (dwFlags & DEL_TOTAL) + { + dwFiles &= 0x7fffffff; + if (dwFiles < 2) + { + ConOutPrintf(szDelHelp3, dwFiles); + } + else + { + ConOutPrintf(szDelHelp4, dwFiles); + } + } + + return 0; +} + + +#endif diff --git a/reactos/base/shell/cmd/delay.c b/reactos/base/shell/cmd/delay.c new file mode 100644 index 00000000000..4b383102e33 --- /dev/null +++ b/reactos/base/shell/cmd/delay.c @@ -0,0 +1,49 @@ +/* + * DELAY.C - internal command. + * + * clone from 4nt delay command + * + * 30 Aug 1999 + * started - Paolo Pantaleo + * + * + */ + +#include +#include "resource.h" + +#ifdef INCLUDE_CMD_DELAY + + +INT CommandDelay (LPTSTR cmd, LPTSTR param) +{ + DWORD val; + DWORD mul=1000; + + if (_tcsncmp (param, _T("/?"), 2) == 0) + { + ConOutResPaging(TRUE,STRING_DELAY_HELP); + return 0; + } + + nErrorLevel = 0; + + if (*param==0) + { + error_req_param_missing (); + return 1; + } + + if (_tcsnicmp(param,_T("/m"),2) == 0) + { + mul = 1; + param += 2; + } + + val = _ttoi(param); + Sleep(val * mul); + + return 0; +} + +#endif /* INCLUDE_CMD_DELAY */ diff --git a/reactos/base/shell/cmd/dir.c b/reactos/base/shell/cmd/dir.c new file mode 100644 index 00000000000..e70e1bcf300 --- /dev/null +++ b/reactos/base/shell/cmd/dir.c @@ -0,0 +1,2111 @@ +/* + * DIR.C - dir internal command. + * + * + * History: + * + * 01/29/97 (Tim Norman) + * started. + * + * 06/13/97 (Tim Norman) + * Fixed code. + * + * 07/12/97 (Tim Norman) + * Fixed bug that caused the root directory to be unlistable + * + * 07/12/97 (Marc Desrochers) + * Changed to use maxx, maxy instead of findxy() + * + * 06/08/98 (Rob Lake) + * Added compatibility for /w in dir + * + * 06/09/98 (Rob Lake) + * Compatibility for dir/s started + * Tested that program finds directories off root fine + * + * 06/10/98 (Rob Lake) + * do_recurse saves the cwd and also stores it in Root + * build_tree adds the cwd to the beginning of its' entries + * Program runs fine, added print_tree -- works fine.. as EXE, + * program won't work properly as COM. + * + * 06/11/98 (Rob Lake) + * Found problem that caused COM not to work + * + * 06/12/98 (Rob Lake) + * debugged... + * added free mem routine + * + * 06/13/98 (Rob Lake) + * debugged the free mem routine + * debugged whole thing some more + * Notes: + * ReadDir stores Root name and _Read_Dir does the hard work + * PrintDir prints Root and _Print_Dir does the hard work + * KillDir kills Root _after_ _Kill_Dir does the hard work + * Integrated program into DIR.C(this file) and made some same + * changes throughout + * + * 06/14/98 (Rob Lake) + * Cleaned up code a bit, added comments + * + * 06/16/98 (Rob Lake) + * Added error checking to my previously added routines + * + * 06/17/98 (Rob Lake) + * Rewrote recursive functions, again! Most other recursive + * functions are now obsolete -- ReadDir, PrintDir, _Print_Dir, + * KillDir and _Kill_Dir. do_recurse does what PrintDir did + * and _Read_Dir did what it did before along with what _Print_Dir + * did. Makes /s a lot faster! + * Reports 2 more files/dirs that MS-DOS actually reports + * when used in root directory(is this because dir defaults + * to look for read only files?) + * Added support for /b, /a and /l + * Made error message similar to DOS error messages + * Added help screen + * + * 06/20/98 (Rob Lake) + * Added check for /-(switch) to turn off previously defined + * switches. + * Added ability to check for DIRCMD in environment and + * process it + * + * 06/21/98 (Rob Lake) + * Fixed up /B + * Now can dir *.ext/X, no spaces! + * + * 06/29/98 (Rob Lake) + * error message now found in command.h + * + * 07/08/1998 (John P. Price) + * removed extra returns; closer to MSDOS + * fixed wide display so that an extra return is not displayed + * when there is five filenames in the last line. + * + * 07/12/98 (Rob Lake) + * Changed error messages + * + * 27-Jul-1998 (John P Price ) + * added config.h include + * + * + * 04-Dec-1998 (Eric Kohl ) + * Converted source code to Win32, except recursive dir ("dir /s"). + * + * 10-Dec-1998 (Eric Kohl ) + * Fixed recursive dir ("dir /s"). + * + * 14-Dec-1998 (Eric Kohl ) + * Converted to Win32 directory functions and + * fixed some output bugs. There are still some more ;) + * + * 10-Jan-1999 (Eric Kohl ) + * Added "/N" and "/4" options, "/O" is a dummy. + * Added locale support. + * + * 20-Jan-1999 (Eric Kohl ) + * Redirection safe! + * + * 01-Mar-1999 (Eric Kohl ) + * Replaced all runtime io functions by their Win32 counterparts. + * + * 23-Feb-2001 (Carl Nettelblad ) + * dir /s now works in deeper trees + * + * 28-Jan-2004 (Michael Fritscher ) + * Fix for /p, so it is working under Windows in GUI-mode, too. + * + * 30-Apr-2004 (Filip Navara ) + * Fix /w to print long names. + * + * 27-Feb-2005 (Konstantinos Paliouras ) + * Implemented all the switches that were missing, and made + * the ros dir very similar to windows dir. Major part of + * the code is rewritten. /p is removed, to be rewriten in + * the main cmd code. + * + * 1-Jul-2004 (Brandon Turner ) + * Added /p back in using ConOutPrintfPaging + */ + +#include +#include "resource.h" + +#ifdef INCLUDE_CMD_DIR + + + +/* Time Field enumeration */ +enum ETimeField +{ + TF_CREATIONDATE = 0, + TF_MODIFIEDDATE = 1, + TF_LASTACCESSEDDATE = 2 +}; + +/* Ordered by enumeration */ +enum EOrderBy +{ + ORDER_NAME = 0, + ORDER_SIZE = 1, + ORDER_DIRECTORY = 2, + ORDER_EXTENSION = 3, + ORDER_TIME = 4 +}; + +/* The struct for holding the switches */ +typedef struct _DirSwitchesFlags +{ + BOOL bBareFormat; /* Bare Format */ + BOOL bTSeperator; /* Thousands seperator */ + BOOL bWideList; /* Wide list format */ + BOOL bWideListColSort; /* Wide list format but sorted by column */ + BOOL bLowerCase; /* Uses lower case */ + BOOL bNewLongList; /* New long list */ + BOOL bPause; /* Pause per page */ + BOOL bUser; /* Displays the owner of file */ + BOOL bRecursive; /* Displays files in specified directory and all sub */ + BOOL bShortName; /* Displays the sort name of files if exist */ + BOOL b4Digit; /* Four digit year */ + struct + { + DWORD dwAttribVal; /* The desired state of attribute */ + DWORD dwAttribMask; /* Which attributes to check */ + BOOL bUnSet; /* A helper flag if "-" was given with the switch */ + BOOL bParSetted; /* A helper flag if parameters of switch were given */ + } stAttribs; /* Displays files with this attributes only */ + struct + { + enum EOrderBy eCriteria[3]; /* Criterias used to order by */ + BOOL bCriteriaRev[3]; /* If the criteria is in reversed order */ + short sCriteriaCount; /* The quantity of criterias */ + BOOL bUnSet; /* A helper flag if "-" was given with the switch */ + BOOL bParSetted; /* A helper flag if parameters of switch were given */ + } stOrderBy; /* Ordered by criterias */ + struct + { + enum ETimeField eTimeField; /* The time field that will be used for */ + BOOL bUnSet; /* A helper flag if "-" was given with the switch */ + BOOL bParSetted; /* A helper flag if parameters of switch were given */ + } stTimeField; /* The time field to display or use for sorting */ +} DIRSWITCHFLAGS, *LPDIRSWITCHFLAGS; + + +typedef struct _DIRFINDLISTNODE +{ + WIN32_FIND_DATA stFindInfo; + struct _DIRFINDLISTNODE *ptrNext; +} DIRFINDLISTNODE, *PDIRFINDLISTNODE; + + +typedef BOOL +(WINAPI *PGETFREEDISKSPACEEX)(LPCTSTR, PULARGE_INTEGER, PULARGE_INTEGER, PULARGE_INTEGER); + + +/* Globally save the # of dirs, files and bytes, + * probabaly later pass them to functions. Rob Lake */ +static ULONG recurse_dir_cnt; +static ULONG recurse_file_cnt; +static ULARGE_INTEGER recurse_bytes; + + +/* + * help + * + * displays help screen for dir + * Rob Lake + */ +static VOID +DirHelp(VOID) +{ + ConOutResPaging(TRUE, STRING_DIR_HELP1); +} + + + +/* + * DirReadParameters + * + * Parse the parameters and switches of the command line and exports them + */ +static BOOL +DirReadParam(LPTSTR Line, /* [IN] The line with the parameters & switches */ + LPTSTR** params, /* [OUT] The parameters after parsing */ + LPINT entries, /* [OUT] The number of parameters after parsing */ + LPDIRSWITCHFLAGS lpFlags) /* [IN/OUT] The flags after calculating switches */ +{ + TCHAR cCurSwitch; /* The current switch */ + TCHAR cCurChar; /* Current examing character */ + TCHAR cCurUChar; /* Current upper examing character */ + BOOL bNegative; /* Negative switch */ + BOOL bPNegative; /* Negative switch parameter */ + BOOL bIntoQuotes; /* A flag showing if we are in quotes (") */ + LPTSTR ptrStart; /* A pointer to the first character of a parameter */ + LPTSTR ptrEnd; /* A pointer to the last character of a parameter */ + LPTSTR temp; + + /* Initialize parameter array */ + *params = malloc(sizeof(LPTSTR)); + if(!params) + return FALSE; + *params = NULL; + *entries = 0; + ptrStart = NULL; + ptrEnd = NULL; + + /* Initialize variables; */ + cCurSwitch = _T(' '); + bNegative = FALSE; + bPNegative = FALSE; + bIntoQuotes = FALSE; + + /* We suppose that switch parameters + were given to avoid setting them to default + if the switch was not given */ + lpFlags->stAttribs.bParSetted = TRUE; + lpFlags->stOrderBy.bParSetted = TRUE; + lpFlags->stTimeField.bParSetted = TRUE; + + + /* Main Loop (see README_DIR.txt) */ + /* scan the command line char per char, and we process its char */ + while (*Line) + { + /* we save current character as it is and its upper case */ + cCurChar = *Line; + cCurUChar = _totupper(*Line); + + /* 1st section (see README_DIR.txt) */ + /* When a switch is expecting */ + if (cCurSwitch == _T('/')) + { + if ((cCurUChar == _T('A')) ||(cCurUChar == _T('T')) || (cCurUChar == _T('O'))) + { + cCurSwitch = cCurUChar; + switch (cCurUChar) + { + case _T('A'): + lpFlags->stAttribs.bUnSet = bNegative; + lpFlags->stAttribs.bParSetted = FALSE; + break; + case _T('T'): + lpFlags->stTimeField.bUnSet = bNegative; + lpFlags->stTimeField.bParSetted = FALSE; + break; + case _T('O'): + lpFlags->stOrderBy.bUnSet = bNegative; + lpFlags->stOrderBy.bParSetted = FALSE; + break; + } + } + else if (cCurUChar == _T('L')) + lpFlags->bLowerCase = ! bNegative; + else if (cCurUChar == _T('B')) + lpFlags->bBareFormat = ! bNegative; + else if (cCurUChar == _T('C')) + lpFlags->bTSeperator = ! bNegative; + else if (cCurUChar == _T('W')) + lpFlags->bWideList = ! bNegative; + else if (cCurUChar == _T('D')) + lpFlags->bWideListColSort = ! bNegative; + else if (cCurUChar == _T('N')) + lpFlags->bNewLongList = ! bNegative; + else if (cCurUChar == _T('P')) + lpFlags->bPause = ! bNegative; + else if (cCurUChar == _T('Q')) + lpFlags->bUser = ! bNegative; + else if (cCurUChar == _T('S')) + lpFlags->bRecursive = ! bNegative; + else if (cCurUChar == _T('X')) + lpFlags->bShortName = ! bNegative; + else if (cCurChar == _T('4')) + lpFlags->b4Digit = ! bNegative; + else if (cCurChar == _T('?')) + { + DirHelp(); + return FALSE; + } + else if (cCurChar == _T('-')) + { + bNegative = TRUE; + } + else + { + error_invalid_switch ((TCHAR)_totupper (*Line)); + return FALSE; + } + + /* We check if we calculated the negative value and realese the flag */ + if ((cCurChar != _T('-')) && bNegative) + bNegative = FALSE; + + /* if not a,o,t or - option then next parameter is not a switch */ + if ((cCurSwitch == _T('/')) && (!bNegative)) + cCurSwitch = _T(' '); + + } + else if ((cCurSwitch == _T(' ')) || (cCurSwitch == _T('P'))) + { + /* 2nd section (see README_DIR.txt) */ + /* We are expecting parameter or the unknown */ + + if (cCurChar == _T('/')) + cCurSwitch = _T('/'); + + /* Process a spacer */ + else if (cCurChar == _T(' ')) + { + if (!bIntoQuotes) + { + cCurSwitch = _T(' '); + if(ptrStart && ptrEnd) + { + temp = malloc((ptrEnd - ptrStart) + 2 * sizeof (TCHAR)); + if(!temp) + return FALSE; + memcpy(temp, ptrStart, (ptrEnd - ptrStart) + 2 * sizeof (TCHAR)); + temp[(ptrEnd - ptrStart + 1)] = _T('\0'); + if(!add_entry(entries, params, temp)) + { + free(temp); + freep(*params); + return FALSE; + } + + free(temp); + + ptrStart = NULL; + ptrEnd = NULL; + } + } + + } + else if (cCurChar == _T('\"')) + { + /* Process a quote */ + bIntoQuotes = !bIntoQuotes; + if(!bIntoQuotes) + ptrEnd = Line; + } + else + { + /* Process a character for parameter */ + if ((cCurSwitch == _T(' ')) && ptrStart && ptrEnd) + { + temp = malloc((ptrEnd - ptrStart) + 2 * sizeof (TCHAR)); + if(!temp) + return FALSE; + memcpy(temp, ptrStart, (ptrEnd - ptrStart) + 2 * sizeof (TCHAR)); + temp[(ptrEnd - ptrStart + 1)] = _T('\0'); + if(!add_entry(entries, params, temp)) + { + free(temp); + freep(*params); + return FALSE; + } + + free(temp); + + ptrStart = NULL; + ptrEnd = NULL; + } + cCurSwitch = _T('P'); + if(!ptrStart) + ptrStart = ptrEnd = Line; + ptrEnd = Line; + } + } + else + { + /* 3rd section (see README_DIR.txt) */ + /* We are waiting for switch parameters */ + + /* Check if there are no more switch parameters */ + if ((cCurChar == _T('/')) || ( cCurChar == _T(' '))) + { + /* Wrong desicion path, reprocess current character */ + cCurSwitch = cCurChar; + continue; + } + /* Process parameter switch */ + switch(cCurSwitch) + { + case _T('A'): /* Switch parameters for /A (attributes filter) */ + /* Ok a switch parameter was given */ + lpFlags->stAttribs.bParSetted = TRUE; + + if (cCurChar == _T(':')) + /* =V= dead command, used to make the "if" work */ + cCurChar = cCurChar; + else if(cCurChar == _T('-')) + bPNegative = TRUE; + else if(cCurUChar == _T('D')) + { + lpFlags->stAttribs.dwAttribMask |= FILE_ATTRIBUTE_DIRECTORY; + if (bPNegative) + lpFlags->stAttribs.dwAttribVal &= ~FILE_ATTRIBUTE_DIRECTORY; + else + lpFlags->stAttribs.dwAttribVal |= FILE_ATTRIBUTE_DIRECTORY; + } + else if(cCurUChar == _T('R')) + { + lpFlags->stAttribs.dwAttribMask |= FILE_ATTRIBUTE_READONLY; + if (bPNegative) + lpFlags->stAttribs.dwAttribVal &= ~FILE_ATTRIBUTE_READONLY; + else + lpFlags->stAttribs.dwAttribVal |= FILE_ATTRIBUTE_READONLY; + } + else if(cCurUChar == _T('H')) + { + lpFlags->stAttribs.dwAttribMask |= FILE_ATTRIBUTE_HIDDEN; + if (bPNegative) + lpFlags->stAttribs.dwAttribVal &= ~FILE_ATTRIBUTE_HIDDEN; + else + lpFlags->stAttribs.dwAttribVal |= FILE_ATTRIBUTE_HIDDEN; + } + else if(cCurUChar == _T('A')) + { + lpFlags->stAttribs.dwAttribMask |= FILE_ATTRIBUTE_ARCHIVE; + if (bPNegative) + lpFlags->stAttribs.dwAttribVal &= ~FILE_ATTRIBUTE_ARCHIVE; + else + lpFlags->stAttribs.dwAttribVal |= FILE_ATTRIBUTE_ARCHIVE; + } + else if(cCurUChar == _T('S')) + { + lpFlags->stAttribs.dwAttribMask |= FILE_ATTRIBUTE_SYSTEM; + if (bPNegative) + lpFlags->stAttribs.dwAttribVal &= ~FILE_ATTRIBUTE_SYSTEM; + else + lpFlags->stAttribs.dwAttribVal |= FILE_ATTRIBUTE_SYSTEM; + } + else + { + error_parameter_format((TCHAR)_totupper (*Line)); + return FALSE; + } + break; + case _T('T'): /* Switch parameters for /T (time field) */ + + /* Ok a switch parameter was given */ + lpFlags->stTimeField.bParSetted = TRUE; + + if (cCurChar == _T(':')) + /* =V= dead command, used to make the "if" work */ + cCurChar = cCurChar; + else if(cCurUChar == _T('C')) + lpFlags->stTimeField.eTimeField= TF_CREATIONDATE ; + else if(cCurUChar == _T('A')) + lpFlags->stTimeField.eTimeField= TF_LASTACCESSEDDATE ; + else if(cCurUChar == _T('W')) + lpFlags->stTimeField.eTimeField= TF_MODIFIEDDATE ; + else + { + error_parameter_format((TCHAR)_totupper (*Line)); + return FALSE; + } + break; + case _T('O'): /* Switch parameters for /O (order) */ + /* Ok a switch parameter was given */ + lpFlags->stOrderBy.bParSetted = TRUE; + + if (cCurChar == _T(':')) + /* <== dead command, used to make the "if" work */ + cCurChar = cCurChar; + else if(cCurChar == _T('-')) + bPNegative = TRUE; + else if(cCurUChar == _T('N')) + { + if (lpFlags->stOrderBy.sCriteriaCount < 3) lpFlags->stOrderBy.sCriteriaCount++; + lpFlags->stOrderBy.bCriteriaRev[lpFlags->stOrderBy.sCriteriaCount - 1] = bPNegative; + lpFlags->stOrderBy.eCriteria[lpFlags->stOrderBy.sCriteriaCount - 1] = ORDER_NAME; + } + else if(cCurUChar == _T('S')) + { + if (lpFlags->stOrderBy.sCriteriaCount < 3) lpFlags->stOrderBy.sCriteriaCount++; + lpFlags->stOrderBy.bCriteriaRev[lpFlags->stOrderBy.sCriteriaCount - 1] = bPNegative; + lpFlags->stOrderBy.eCriteria[lpFlags->stOrderBy.sCriteriaCount - 1] = ORDER_SIZE; + } + else if(cCurUChar == _T('G')) + { + if (lpFlags->stOrderBy.sCriteriaCount < 3) lpFlags->stOrderBy.sCriteriaCount++; + lpFlags->stOrderBy.bCriteriaRev[lpFlags->stOrderBy.sCriteriaCount - 1] = bPNegative; + lpFlags->stOrderBy.eCriteria[lpFlags->stOrderBy.sCriteriaCount - 1] = ORDER_DIRECTORY; + } + else if(cCurUChar == _T('E')) + { + if (lpFlags->stOrderBy.sCriteriaCount < 3) lpFlags->stOrderBy.sCriteriaCount++; + lpFlags->stOrderBy.bCriteriaRev[lpFlags->stOrderBy.sCriteriaCount - 1] = bPNegative; + lpFlags->stOrderBy.eCriteria[lpFlags->stOrderBy.sCriteriaCount - 1] = ORDER_EXTENSION; + } + else if(cCurUChar == _T('D')) + { + if (lpFlags->stOrderBy.sCriteriaCount < 3) lpFlags->stOrderBy.sCriteriaCount++; + lpFlags->stOrderBy.bCriteriaRev[lpFlags->stOrderBy.sCriteriaCount - 1] = bPNegative; + lpFlags->stOrderBy.eCriteria[lpFlags->stOrderBy.sCriteriaCount - 1] = ORDER_TIME; + } + + else + { + error_parameter_format((TCHAR)_totupper (*Line)); + return FALSE; + } + + + } + /* We check if we calculated the negative value and realese the flag */ + if ((cCurChar != _T('-')) && bPNegative) + bPNegative = FALSE; + } + + Line++; + } + /* Terminate the parameters */ + if(ptrStart && ptrEnd) + { + temp = malloc((ptrEnd - ptrStart) + 2 * sizeof (TCHAR)); + if(!temp) + return FALSE; + memcpy(temp, ptrStart, (ptrEnd - ptrStart) + 2 * sizeof (TCHAR)); + temp[(ptrEnd - ptrStart + 1)] = _T('\0'); + if(!add_entry(entries, params, temp)) + { + free(temp); + freep(*params); + return FALSE; + } + + free(temp); + + ptrStart = NULL; + ptrEnd = NULL; + } + + /* Calculate the switches with no switch paramater */ + if (!(lpFlags->stAttribs.bParSetted)) + { + lpFlags->stAttribs.dwAttribVal = 0L; + lpFlags->stAttribs.dwAttribMask = lpFlags->stAttribs.dwAttribVal; + } + if (!(lpFlags->stOrderBy.bParSetted)) + { + lpFlags->stOrderBy.sCriteriaCount = 1; + lpFlags->stOrderBy.eCriteria[0] = ORDER_NAME; + lpFlags->stOrderBy.bCriteriaRev[0] = FALSE; + } + if (!(lpFlags->stOrderBy.bParSetted)) + lpFlags->stTimeField.eTimeField = TF_MODIFIEDDATE ; + + /* Calculate the unsetted switches (the "-" prefixed)*/ + if (lpFlags->stAttribs.bUnSet) + { + lpFlags->stAttribs.bUnSet = FALSE; + lpFlags->stAttribs.dwAttribVal = 0L; + lpFlags->stAttribs.dwAttribMask = FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM; + } + if (lpFlags->stOrderBy.bUnSet) + { + lpFlags->stOrderBy.bUnSet = FALSE; + lpFlags->stOrderBy.sCriteriaCount = 0; + } + if (lpFlags->stTimeField.bUnSet ) + { + lpFlags->stTimeField.bUnSet = FALSE; + lpFlags->stTimeField.eTimeField = TF_MODIFIEDDATE; + } + return TRUE; +} + + +/* + * ExtendFilespec + * + * extend the filespec, possibly adding wildcards + */ +static VOID +ExtendFilespec (LPTSTR file) +{ + INT len = 0; + + if (!file) + return; + + + /* if no file spec, change to "*.*" */ + if (*file == _T('\0')) + { + _tcscpy (file, _T("*.*")); + return; + } + + // add support for *. + if ((file[0] == _T('*')) && (file[1] == _T('.') )) + { + return; + } + + /* if starts with . add * in front */ + if (*file == _T('.')) + { + memmove (&file[1], &file[0], (_tcslen (file) + 1) * sizeof(TCHAR)); + file[0] = _T('*'); + } + + /* if no . add .* */ + if (!_tcschr (file, _T('.'))) + { + _tcscat (file, _T(".*")); + return; + } + + + + /* if last character is '.' add '*' */ + len = _tcslen (file); + if (file[len - 1] == _T('.')) + { + _tcscat (file, _T("*")); + return; + } +} + + +/* + * dir_parse_pathspec + * + * split the pathspec into drive, directory, and filespec + */ +static INT +DirParsePathspec (LPTSTR szPathspec, LPTSTR szPath, LPTSTR szFilespec) +{ + TCHAR szOrigPath[MAX_PATH]; + LPTSTR start; + LPTSTR tmp; + INT i; + BOOL bWildcards = FALSE; + + GetCurrentDirectory (MAX_PATH, szOrigPath); + + /* get the drive and change to it */ + if (szPathspec[1] == _T(':')) + { + TCHAR szRootPath[] = _T("A:"); + + szRootPath[0] = szPathspec[0]; + start = szPathspec + 2; + if (!SetCurrentDirectory (szRootPath)) + { + ErrorMessage (GetLastError(), NULL); + return 1; + } + } + else + { + start = szPathspec; + } + + + /* check for wildcards */ + for (i = 0; szPathspec[i]; i++) + { + if (szPathspec[i] == _T('*') || szPathspec[i] == _T('?')) + bWildcards = TRUE; + } + + /* check if this spec is a directory */ + if (!bWildcards) + { + if (SetCurrentDirectory (szPathspec)) + { + _tcscpy (szFilespec, _T("*.*")); + + if (!GetCurrentDirectory (MAX_PATH, szPath)) + { + szFilespec[0] = _T('\0'); + SetCurrentDirectory (szOrigPath); + error_out_of_memory(); + return 1; + } + + SetCurrentDirectory (szOrigPath); + return 0; + } + } + + /* find the file spec */ + tmp = _tcsrchr (start, _T('\\')); + + /* if no path is specified */ + if (!tmp) + { + _tcscpy (szFilespec, start); + ExtendFilespec (szFilespec); + if (!GetCurrentDirectory (MAX_PATH, szPath)) + { + szFilespec[0] = _T('\0'); + SetCurrentDirectory (szOrigPath); + error_out_of_memory(); + return 1; + } + + SetCurrentDirectory (szOrigPath); + return 0; + } + + /* get the filename */ + _tcscpy (szFilespec, tmp+1); + ExtendFilespec (szFilespec); + + if (tmp == start) + { + /* change to the root directory */ + if (!SetCurrentDirectory (_T("\\"))) + { + szFilespec[0] = _T('\0'); + SetCurrentDirectory (szOrigPath); + error_path_not_found (); + return 1; + } + } + else + { + *tmp = _T('\0'); + + /* change to this directory */ + if (!SetCurrentDirectory (start)) + { + *tmp = _T('\\'); + szFilespec[0] = _T('\0'); + SetCurrentDirectory (szOrigPath); + error_path_not_found (); + return 1; + } + } + + /* get the full name of the directory */ + if (!GetCurrentDirectory (MAX_PATH, szPath)) + { + *tmp = _T('\\'); + szFilespec[0] = _T('\0'); + SetCurrentDirectory (szOrigPath); + error_out_of_memory (); + return 1; + } + + *tmp = _T('\\'); + + SetCurrentDirectory (szOrigPath); + + return 0; +} + + +/* + * incline + * + * increment our line if paginating, display message at end of screen + */ +#if 0 +static BOOL +IncLine (LPINT pLine, LPDIRSWITCHFLAGS lpFlags) +{ + BOOL bError; + CONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo; + LONG WindowHeight; + + bError = GetConsoleScreenBufferInfo(hConsole, &lpConsoleScreenBufferInfo); + + WindowHeight = lpConsoleScreenBufferInfo.srWindow.Bottom - lpConsoleScreenBufferInfo.srWindow.Top; + + /* That prevents bad behiour if WindowHeight could not be calculated */ + if (!WindowHeight) + { + WindowHeight= 1000000; + } + + if (!(lpFlags->bPause)) + return FALSE; + + (*pLine)++; + + /* + * Because I don't know if WindowsHeight work in all cases, + * perhaps then maxy is the right value + */ + if (*pLine >= (int)maxy - 2 || *pLine >= WindowHeight) + { + *pLine = 0; + return (PagePrompt () == PROMPT_BREAK); + } + + return FALSE; +} +#endif + +/* + * PrintDirectoryHeader + * + * print the header for the dir command + */ +static BOOL +PrintDirectoryHeader(LPTSTR szPath, LPINT pLine, LPDIRSWITCHFLAGS lpFlags) +{ + TCHAR szMsg[RC_STRING_MAX_SIZE]; + TCHAR szRootName[MAX_PATH]; + TCHAR szVolName[80]; + DWORD dwSerialNr; + LPTSTR p; + + if (lpFlags->bBareFormat) + return TRUE; + + /* build usable root path */ + if (szPath[1] == _T(':') && szPath[2] == _T('\\')) + { + /* normal path */ + szRootName[0] = szPath[0]; + szRootName[1] = _T(':'); + szRootName[2] = _T('\\'); + szRootName[3] = 0; + } + else if (szPath[0] == _T('\\') && szPath[1] == _T('\\')) + { + /* UNC path */ + p = _tcschr(&szPath[2], _T('\\')); + if (p == NULL) + { + error_invalid_drive(); + return(FALSE); + } + p = _tcschr(p+1, _T('\\')); + if (p == NULL) + { + _tcscpy(szRootName, szPath); + _tcscat(szRootName, _T("\\")); + } + else + { + *p = 0; + _tcscpy(szRootName, szPath); + _tcscat(szRootName, _T("\\")); + *p = _T('\\'); + } + } + else + { + error_invalid_drive(); + return(FALSE); + } + + /* get the media ID of the drive */ + if (!GetVolumeInformation(szRootName, szVolName, 80, &dwSerialNr, + NULL, NULL, NULL, 0)) + { + error_invalid_drive(); + return(FALSE); + } + + /* print drive info */ + if (szVolName[0] != _T('\0')) + { + LoadString(CMD_ModuleHandle, STRING_DIR_HELP2, szMsg, RC_STRING_MAX_SIZE); + //needs to have first paramter as TRUE because + //this is the first output and need to clear the static + if(lpFlags->bPause) + ConOutPrintfPaging(TRUE,szMsg, szRootName[0], szVolName); + else + ConOutPrintf(szMsg, szRootName[0], szVolName); + + } + else + { + LoadString(CMD_ModuleHandle, STRING_DIR_HELP3, szMsg, RC_STRING_MAX_SIZE); + if(lpFlags->bPause) + ConOutPrintfPaging(TRUE,szMsg, szRootName[0]); + else + ConOutPrintf(szMsg, szRootName[0]); + } + + /* print the volume serial number if the return was successful */ + LoadString(CMD_ModuleHandle, STRING_DIR_HELP4, (LPTSTR) szMsg, RC_STRING_MAX_SIZE); + if(lpFlags->bPause) + ConOutPrintfPaging(FALSE,szMsg, + HIWORD(dwSerialNr), + LOWORD(dwSerialNr)); + else + ConOutPrintf(szMsg, + HIWORD(dwSerialNr), + LOWORD(dwSerialNr)); + + + return TRUE; +} + + +/* + * convert + * + * insert commas into a number + * + */ +#if 0 +static INT +ConvertULong (ULONG num, LPTSTR des, INT len) +{ + TCHAR temp[32]; + INT c = 0; + INT n = 0; + + if (num == 0) + { + des[0] = _T('0'); + des[1] = _T('\0'); + n = 1; + } + else + { + temp[31] = 0; + while (num > 0) + { + if (((c + 1) % (nNumberGroups + 1)) == 0) + temp[30 - c++] = cThousandSeparator; + temp[30 - c++] = (TCHAR)(num % 10) + _T('0'); + num /= 10; + } + + for (n = 0; n <= c; n++) + des[n] = temp[31 - c + n]; + } + + return n; +} +#endif + +static VOID +DirPrintFileDateTime(TCHAR *lpDate, + TCHAR *lpTime, + LPWIN32_FIND_DATA lpFile, + LPDIRSWITCHFLAGS lpFlags) +{ + FILETIME ft; + SYSTEMTIME dt; + TCHAR szDate[30]; + TCHAR szTime[30]; + WORD wYear; + + /* Select the right time field */ + switch (lpFlags->stTimeField.eTimeField) + { + case TF_CREATIONDATE: + if (!FileTimeToLocalFileTime(&lpFile->ftCreationTime, &ft)) + return; + FileTimeToSystemTime(&ft, &dt); + break; + + case TF_LASTACCESSEDDATE : + if (!FileTimeToLocalFileTime(&lpFile->ftLastAccessTime, &ft)) + return; + FileTimeToSystemTime(&ft, &dt); + break; + + case TF_MODIFIEDDATE: + if (!FileTimeToLocalFileTime(&lpFile->ftLastWriteTime, &ft)) + return; + FileTimeToSystemTime(&ft, &dt); + break; + } + + /* Format date */ + wYear = (lpFlags->b4Digit) ? dt.wYear : dt.wYear%100; + switch (nDateFormat) + { + case 0: /* mmddyy */ + default: + _stprintf (szDate, _T("%02d%c%02d%c%0*d"), + dt.wMonth, cDateSeparator, + dt.wDay, cDateSeparator, + lpFlags->b4Digit?4:2, wYear); + break; + + case 1: /* ddmmyy */ + _stprintf (szDate, _T("%02d%c%02d%c%0*d"), + dt.wDay, cDateSeparator, dt.wMonth, + cDateSeparator,lpFlags->b4Digit?4:2, wYear); + break; + + case 2: /* yymmdd */ + _stprintf (szDate, _T("%0*d%c%02d%c%02d"), + lpFlags->b4Digit?4:2, wYear, cDateSeparator, + dt.wMonth, cDateSeparator, dt.wDay); + break; + } + /* Format Time */ + switch (nTimeFormat) + { + case 0: /* 12 hour format */ + default: + _stprintf (szTime,_T(" %02d%c%02u%c"), + (dt.wHour == 0 ? 12 : (dt.wHour <= 12 ? dt.wHour : dt.wHour - 12)), + cTimeSeparator, + dt.wMinute, (dt.wHour <= 11 ? _T('a') : _T('p'))); + break; + + case 1: /* 24 hour format */ + _stprintf (szTime, _T(" %02d%c%02u"), + dt.wHour, cTimeSeparator, dt.wMinute); + break; + } + /* Copy results */ + _tcscpy(lpDate, szDate); + _tcscpy(lpTime, szTime); +} + + +static VOID +GetUserDiskFreeSpace(LPCTSTR lpRoot, + PULARGE_INTEGER lpFreeSpace) +{ + PGETFREEDISKSPACEEX pGetFreeDiskSpaceEx; + HINSTANCE hInstance; + DWORD dwSecPerCl; + DWORD dwBytPerSec; + DWORD dwFreeCl; + DWORD dwTotCl; + ULARGE_INTEGER TotalNumberOfBytes, TotalNumberOfFreeBytes; + + lpFreeSpace->QuadPart = 0; + + hInstance = LoadLibrary(_T("KERNEL32")); + if (hInstance != NULL) + { + pGetFreeDiskSpaceEx = (PGETFREEDISKSPACEEX)GetProcAddress(hInstance, +#ifdef _UNICODE + "GetDiskFreeSpaceExW"); +#else + "GetDiskFreeSpaceExA"); +#endif + if (pGetFreeDiskSpaceEx != NULL) + { + if (pGetFreeDiskSpaceEx(lpRoot, lpFreeSpace, &TotalNumberOfBytes, &TotalNumberOfFreeBytes) == TRUE) + return; + } + FreeLibrary(hInstance); + } + + GetDiskFreeSpace(lpRoot, + &dwSecPerCl, + &dwBytPerSec, + &dwFreeCl, + &dwTotCl); + + lpFreeSpace->QuadPart = dwSecPerCl * dwBytPerSec * dwFreeCl; +} + + +/* + * print_summary: prints dir summary + * Added by Rob Lake 06/17/98 to compact code + * Just copied Tim's Code and patched it a bit + * + */ +static INT +PrintSummary(LPTSTR szPath, + ULONG ulFiles, + ULONG ulDirs, + ULARGE_INTEGER u64Bytes, + LPINT pLine, + LPDIRSWITCHFLAGS lpFlags) +{ + TCHAR szMsg[RC_STRING_MAX_SIZE]; + TCHAR szBuffer[64]; + ULARGE_INTEGER uliFree; + TCHAR szRoot[] = _T("A:\\"); + + + /* Here we check if we didn't find anything */ + if (!(ulFiles + ulDirs)) + { + error_file_not_found(); + return 1; + } + + + /* In bare format we don't print results */ + if (lpFlags->bBareFormat) + return 0; + + /* Print recursive specific results */ + + /* Take this code offline to fix /S does not print duoble info */ + if (lpFlags->bRecursive) + { + ConvertULargeInteger(u64Bytes, szBuffer, sizeof(szBuffer), lpFlags->bTSeperator); + LoadString(CMD_ModuleHandle, STRING_DIR_HELP5, szMsg, RC_STRING_MAX_SIZE); + if(lpFlags->bPause) + ConOutPrintfPaging(FALSE,szMsg,ulFiles, szBuffer); + else + ConOutPrintf(szMsg,ulFiles, szBuffer); + } + else + { + + /* Print File Summary */ + /* Condition to print summary is: + If we are not in bare format and if we have results! */ + if (ulFiles > 0) + { + ConvertULargeInteger(u64Bytes, szBuffer, 20, lpFlags->bTSeperator); + LoadString(CMD_ModuleHandle, STRING_DIR_HELP8, szMsg, RC_STRING_MAX_SIZE); + if(lpFlags->bPause) + ConOutPrintfPaging(FALSE,szMsg,ulFiles, szBuffer); + else + ConOutPrintf(szMsg,ulFiles, szBuffer); + + } + + } + /* Print total directories and freespace */ + szRoot[0] = szPath[0]; + GetUserDiskFreeSpace(szRoot, &uliFree); + ConvertULargeInteger(uliFree, szBuffer, sizeof(szBuffer), lpFlags->bTSeperator); + LoadString(CMD_ModuleHandle, STRING_DIR_HELP6, (LPTSTR) szMsg, RC_STRING_MAX_SIZE); + if(lpFlags->bPause) + ConOutPrintfPaging(FALSE,szMsg,ulDirs, szBuffer); + else + ConOutPrintf(szMsg,ulDirs, szBuffer); + + return 0; +} + +/* + * getExt + * + * Get the extension of a filename + */ +TCHAR* getExt(const TCHAR* file) +{ + static TCHAR *NoExt = _T(""); + TCHAR* lastdot = _tcsrchr(file, _T('.')); + return (lastdot != NULL ? lastdot + 1 : NoExt); +} + +/* + * getName + * + * Get the name of the file without extension + */ +static LPTSTR +getName(const TCHAR* file, TCHAR * dest) +{ + int iLen; + LPTSTR end; + + /* Check for "." and ".." folders */ + if ((_tcscmp(file, _T(".")) == 0) || + (_tcscmp(file, _T("..")) == 0)) + { + _tcscpy(dest,file); + return dest; + } + + end = _tcsrchr(file, _T('.')); + if (!end) + iLen = _tcslen(file); + else + iLen = (end - file); + + + _tcsncpy(dest, file, iLen); + *(dest + iLen) = _T('\0'); + + return dest; +} + + +/* + * DirPrintNewList + * + * The function that prints in new style + */ +static VOID +DirPrintNewList(LPWIN32_FIND_DATA ptrFiles[], /* [IN]Files' Info */ + DWORD dwCount, /* [IN] The quantity of files */ + TCHAR *szCurPath, /* [IN] Full path of current directory */ + LPDIRSWITCHFLAGS lpFlags) /* [IN] The flags used */ +{ + DWORD i; + TCHAR szSize[30]; + TCHAR szShortName[15]; + TCHAR szDate[20]; + TCHAR szTime[20]; + INT iSizeFormat; + ULARGE_INTEGER u64FileSize; + + for (i = 0;i < dwCount;i++) + { + /* Calculate size */ + if (ptrFiles[i]->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + { + /* Directory */ + iSizeFormat = -14; + _tcscpy(szSize, _T("")); + } + else + { + /* File */ + iSizeFormat = 14; + u64FileSize.HighPart = ptrFiles[i]->nFileSizeHigh; + u64FileSize.LowPart = ptrFiles[i]->nFileSizeLow; + ConvertULargeInteger(u64FileSize, szSize, 20, lpFlags->bTSeperator); + } + + /* Calculate short name */ + szShortName[0] = _T('\0'); + if (lpFlags->bShortName) + _stprintf(szShortName, _T(" %-12s"), ptrFiles[i]->cAlternateFileName); + + /* Format date and time */ + DirPrintFileDateTime(szDate, szTime, ptrFiles[i], lpFlags); + + /* Print the line */ + if(lpFlags->bPause) + { + if (ConOutPrintfPaging(FALSE,_T("%10s %-8s %*s%s %s\n"), + szDate, + szTime, + iSizeFormat, + szSize, + szShortName, + ptrFiles[i]->cFileName) == 1) + return ; + } + else + ConOutPrintf(_T("%10s %-8s %*s%s %s\n"), + szDate, + szTime, + iSizeFormat, + szSize, + szShortName, + ptrFiles[i]->cFileName); + } +} + + +/* + * DirPrintWideList + * + * The function that prints in wide list + */ +static VOID +DirPrintWideList(LPWIN32_FIND_DATA ptrFiles[], /* [IN] Files' Info */ + DWORD dwCount, /* [IN] The quantity of files */ + TCHAR *szCurPath, /* [IN] Full path of current directory */ + LPDIRSWITCHFLAGS lpFlags) /* [IN] The flags used */ +{ + SHORT iScreenWidth; + USHORT iColumns; + USHORT iLines; + UINT iLongestName; + TCHAR szTempFname[MAX_PATH]; + DWORD i; + DWORD j; + DWORD temp; + + /* Calculate longest name */ + iLongestName = 1; + for (i = 0; i < dwCount; i++) + { + if (ptrFiles[i]->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + { + /* Directories need 2 additinal characters for brackets */ + if ((_tcslen(ptrFiles[i]->cFileName) + 2) > iLongestName) + iLongestName = _tcslen(ptrFiles[i]->cFileName) + 2; + } + else + { + if (_tcslen(ptrFiles[i]->cFileName) > iLongestName) + iLongestName = _tcslen(ptrFiles[i]->cFileName); + } + } + + /* Count the highest number of columns */ + GetScreenSize(&iScreenWidth, 0); + iColumns = iScreenWidth / iLongestName; + + /* Check if there is enough space for spaces between names */ + if (((iLongestName * iColumns) + iColumns) >= (UINT)iScreenWidth) + iColumns --; + + /* A last check at iColumns to avoid division by zero */ + if (!(iColumns)) + iColumns = 1; + + /* Print Column sorted */ + if (lpFlags->bWideListColSort) + { + /* Calculate the lines that will be printed */ +// iLines = ceil((float)dwCount/(float)iColumns); + iLines = (USHORT)(dwCount / iColumns); + + for (i = 0;i < iLines;i++) + { + for (j = 0; j < iColumns; j++) + { + temp = (j * iLines) + i; + if (temp >= dwCount) + break; + + if (ptrFiles[temp]->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + _stprintf(szTempFname, _T("[%s]"), ptrFiles[temp]->cFileName); + else + _stprintf(szTempFname, _T("%s"), ptrFiles[temp]->cFileName); + + if(lpFlags->bPause) + ConOutPrintfPaging(FALSE,_T("%-*s"), iLongestName + 1 , szTempFname); + else + ConOutPrintf(_T("%-*s"), iLongestName + 1 , szTempFname); + } + + if(lpFlags->bPause) + ConOutPrintfPaging(FALSE,_T("\n")); + else + ConOutPrintf(_T("\n")); + } + } + else + { + /* Print Line sorted */ + for (i = 0; i < dwCount; i++) + { + if (ptrFiles[i]->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + _stprintf(szTempFname, _T("[%s]"), ptrFiles[i]->cFileName); + else + _stprintf(szTempFname, _T("%s"), ptrFiles[i]->cFileName); + + if(lpFlags->bPause) + ConOutPrintfPaging(FALSE,_T("%-*s"), iLongestName + 1, szTempFname ); + else + ConOutPrintf(_T("%-*s"), iLongestName + 1, szTempFname ); + + /* + * We print a new line at the end of each column + * except for the case that it is the last item. + */ + if (!((i + 1) % iColumns) && (i < (dwCount - 1))) + { + if(lpFlags->bPause) + ConOutPrintfPaging(FALSE,_T("\n")); + else + ConOutPrintf(_T("\n")); + } + } + + /* Add a new line after the last item */ + if(lpFlags->bPause) + ConOutPrintfPaging(FALSE,_T("\n")); + else + ConOutPrintf(_T("\n")); + } +} + + +/* + * DirPrintOldList + * + * The function that prints in old style + */ +static VOID +DirPrintOldList(LPWIN32_FIND_DATA ptrFiles[], /* [IN] Files' Info */ + DWORD dwCount, /* [IN] The quantity of files */ + TCHAR * szCurPath, /* [IN] Full path of current directory */ + LPDIRSWITCHFLAGS lpFlags) /* [IN] The flags used */ +{ +DWORD i; /* An indexer for "for"s */ +TCHAR szName[10]; /* The name of file */ +TCHAR szExt[5]; /* The extension of file */ +TCHAR szDate[30],szTime[30]; /* Used to format time and date */ +TCHAR szSize[30]; /* The size of file */ +int iSizeFormat; /* The format of size field */ +ULARGE_INTEGER u64FileSize; /* The file size */ + + for(i = 0;i < dwCount;i++) + { + /* Broke 8.3 format */ + if (*ptrFiles[i]->cAlternateFileName ) + { + /* If the file is long named then we read the alter name */ + getName( ptrFiles[i]->cAlternateFileName, szName); + _tcscpy(szExt, getExt( ptrFiles[i]->cAlternateFileName)); + } + else + { + /* If the file is not long name we read its original name */ + getName( ptrFiles[i]->cFileName, szName); + _tcscpy(szExt, getExt( ptrFiles[i]->cFileName)); + } + + /* Calculate size */ + if (ptrFiles[i]->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + { + /* Directory, no size it's a directory*/ + iSizeFormat = -17; + _tcscpy(szSize, _T("")); + } + else + { + /* File */ + iSizeFormat = 17; + u64FileSize.HighPart = ptrFiles[i]->nFileSizeHigh; + u64FileSize.LowPart = ptrFiles[i]->nFileSizeLow; + ConvertULargeInteger(u64FileSize, szSize, 20, lpFlags->bTSeperator); + } + + /* Format date and time */ + DirPrintFileDateTime(szDate,szTime,ptrFiles[i],lpFlags); + + /* Print the line */ + if(lpFlags->bPause) + { + if (ConOutPrintfPaging(FALSE,_T("%-8s %-3s %*s %s %s\n"), + szName, /* The file's 8.3 name */ + szExt, /* The file's 8.3 extension */ + iSizeFormat, /* print format for size column */ + szSize, /* The size of file or "" for dirs */ + szDate, /* The date of file/dir */ + szTime) == 1) /* The time of file/dir */ + { + return ; + } + } + else + ConOutPrintf(_T("%-8s %-3s %*s %s %s\n"), + szName, /* The file's 8.3 name */ + szExt, /* The file's 8.3 extension */ + iSizeFormat, /* print format for size column */ + szSize, /* The size of file or "" for dirs */ + szDate, /* The date of file/dir */ + szTime); /* The time of file/dir */ + } +} + +/* + * DirPrintBareList + * + * The function that prints in bare format + */ +static VOID +DirPrintBareList(LPWIN32_FIND_DATA ptrFiles[], /* [IN] Files' Info */ + DWORD dwCount, /* [IN] The number of files */ + LPTSTR lpCurPath, /* [IN] Full path of current directory */ + LPDIRSWITCHFLAGS lpFlags) /* [IN] The flags used */ +{ + TCHAR szFullName[MAX_PATH]; + DWORD i; + + for (i = 0; i < dwCount; i++) + { + if ((_tcscmp(ptrFiles[i]->cFileName, _T(".")) == 0) || + (_tcscmp(ptrFiles[i]->cFileName, _T("..")) == 0)) + { + /* at bare format we don't print "." and ".." folder */ + continue; + } + if (lpFlags->bRecursive) + { + /* at recursive mode we print full path of file */ + _tcscpy(szFullName, lpCurPath); + _tcscat(szFullName, ptrFiles[i]->cFileName); + if(lpFlags->bPause) + { + if (ConOutPrintfPaging(FALSE,_T("%s\n"), szFullName) == 1) + { + return ; + } + } + else + ConOutPrintf(_T("%s\n"), szFullName); + } + else + { + /* if we are not in recursive mode we print the file names */ + if(lpFlags->bPause) + { + if (ConOutPrintfPaging(FALSE,_T("%s\n"),ptrFiles[i]->cFileName) == 1) + { + return ; + } + } + else + ConOutPrintf(_T("%s\n"),ptrFiles[i]->cFileName); + } + } +} + + +/* + * DirPrintFiles + * + * The functions that prints the files list + */ +static VOID +DirPrintFiles(LPWIN32_FIND_DATA ptrFiles[], /* [IN] Files' Info */ + DWORD dwCount, /* [IN] The quantity of files */ + TCHAR *szCurPath, /* [IN] Full path of current directory */ + LPDIRSWITCHFLAGS lpFlags) /* [IN] The flags used */ +{ + TCHAR szMsg[RC_STRING_MAX_SIZE]; + TCHAR szTemp[MAX_PATH]; /* A buffer to format the directory header */ + + /* Print directory header */ + _tcscpy(szTemp, szCurPath); + + /* We cut the trailing \ of the full path */ + szTemp[_tcslen(szTemp)-1] = _T('\0'); + + /* Condition to print header: + We are not printing in bare format + and if we are in recursive mode... we must have results */ + if (!(lpFlags->bBareFormat ) && !((lpFlags->bRecursive) && (dwCount <= 0))) + { + LoadString(CMD_ModuleHandle, STRING_DIR_HELP7, szMsg, RC_STRING_MAX_SIZE); + if(lpFlags->bPause) + { + if (ConOutPrintfPaging(FALSE,szMsg, szTemp) == 1) + { + return ; + } + } + else + ConOutPrintf(szMsg, szTemp); + } + + if (lpFlags->bBareFormat) + { + /* Bare format */ + DirPrintBareList(ptrFiles, dwCount, szCurPath, lpFlags); + } + else if(lpFlags->bShortName) + { + /* New list style / Short names */ + DirPrintNewList(ptrFiles, dwCount, szCurPath, lpFlags); + } + else if(lpFlags->bWideListColSort || lpFlags->bWideList) + { + /* Wide list */ + DirPrintWideList(ptrFiles, dwCount, szCurPath, lpFlags); + } + else if (lpFlags->bNewLongList ) + { + /* New list style*/ + DirPrintNewList(ptrFiles, dwCount, szCurPath, lpFlags); + } + else + { + /* If nothing is selected old list is the default */ + DirPrintOldList(ptrFiles, dwCount, szCurPath, lpFlags); + } +} + + + +/* + * CompareFiles + * + * Compares 2 files based on the order criteria + */ +static BOOL +CompareFiles(LPWIN32_FIND_DATA lpFile1, /* [IN] A pointer to WIN32_FIND_DATA of file 1 */ + LPWIN32_FIND_DATA lpFile2, /* [IN] A pointer to WIN32_FIND_DATA of file 2 */ + LPDIRSWITCHFLAGS lpFlags) /* [IN] The flags that we use to list */ +{ + ULARGE_INTEGER u64File1; + ULARGE_INTEGER u64File2; + int i; + long iComp = 0; /* The comparison result */ + + /* Calculate critiries by order given from user */ + for (i = 0;i < lpFlags->stOrderBy.sCriteriaCount;i++) + { + + /* Calculate criteria */ + switch(lpFlags->stOrderBy.eCriteria[i]) + { + case ORDER_SIZE: /* Order by size /o:s */ + /* concat the 32bit integers to a 64bit */ + u64File1.LowPart = lpFile1->nFileSizeLow; + u64File1.HighPart = lpFile1->nFileSizeHigh; + u64File2.LowPart = lpFile2->nFileSizeLow; + u64File2.HighPart = lpFile2->nFileSizeHigh; + + /* In case that differnce is too big for a long */ + if (u64File1.QuadPart < u64File2.QuadPart) + iComp = -1; + else if (u64File1.QuadPart > u64File2.QuadPart) + iComp = 1; + else + iComp = 0; + break; + + case ORDER_DIRECTORY: /* Order by directory attribute /o:g */ + iComp = ((lpFile2->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)- + (lpFile1->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)); + break; + + case ORDER_EXTENSION: /* Order by extension name /o:e */ + iComp = _tcsicmp(getExt(lpFile1->cFileName),getExt(lpFile2->cFileName)); + break; + + case ORDER_NAME: /* Order by filename /o:n */ + iComp = _tcsicmp(lpFile1->cFileName, lpFile2->cFileName); + break; + + case ORDER_TIME: /* Order by file's time /o:t */ + /* We compare files based on the time field selected by /t */ + switch(lpFlags->stTimeField.eTimeField) + { + case TF_CREATIONDATE: + /* concat the 32bit integers to a 64bit */ + u64File1.LowPart = lpFile1->ftCreationTime.dwLowDateTime; + u64File1.HighPart = lpFile1->ftCreationTime.dwHighDateTime ; + u64File2.LowPart = lpFile2->ftCreationTime.dwLowDateTime; + u64File2.HighPart = lpFile2->ftCreationTime.dwHighDateTime ; + break; + case TF_LASTACCESSEDDATE : + /* concat the 32bit integers to a 64bit */ + u64File1.LowPart = lpFile1->ftLastAccessTime.dwLowDateTime; + u64File1.HighPart = lpFile1->ftLastAccessTime.dwHighDateTime ; + u64File2.LowPart = lpFile2->ftLastAccessTime.dwLowDateTime; + u64File2.HighPart = lpFile2->ftLastAccessTime.dwHighDateTime ; + break; + case TF_MODIFIEDDATE: + /* concat the 32bit integers to a 64bit */ + u64File1.LowPart = lpFile1->ftLastWriteTime.dwLowDateTime; + u64File1.HighPart = lpFile1->ftLastWriteTime.dwHighDateTime ; + u64File2.LowPart = lpFile2->ftLastWriteTime.dwLowDateTime; + u64File2.HighPart = lpFile2->ftLastWriteTime.dwHighDateTime ; + break; + } + + /* In case that differnce is too big for a long */ + if (u64File1.QuadPart < u64File2.QuadPart) + iComp = -1; + else if (u64File1.QuadPart > u64File2.QuadPart) + iComp = 1; + else + iComp = 0; + break; + } + + /* Reverse if desired */ + if (lpFlags->stOrderBy.bCriteriaRev[i]) + iComp *= -1; + + /* If that criteria was enough for distinguishing + the files/dirs,there is no need to calculate the others*/ + if (iComp != 0) break; + } + + /* Translate the value of iComp to boolean */ + if (iComp > 0) + return TRUE; + else + return FALSE; +} + +/* + * QsortFiles + * + * Sort files by the order criterias using quicksort method + */ +static VOID +QsortFiles(LPWIN32_FIND_DATA ptrArray[], /* [IN/OUT] The array with file info pointers */ + int i, /* [IN] The index of first item in array */ + int j, /* [IN] The index to last item in array */ + LPDIRSWITCHFLAGS lpFlags) /* [IN] The flags that we will use to sort */ +{ + LPWIN32_FIND_DATA lpTemp; /* A temporary pointer */ + int First, Last, Temp; + BOOL Way; + + if (i < j) + { + First = i; + Last = j; + Way = TRUE; + while (i != j) + { + if (Way == CompareFiles(ptrArray[i], ptrArray[j], lpFlags)) + { + /* Swap the pointers of the array */ + lpTemp = ptrArray[i]; + ptrArray[i]= ptrArray[j]; + ptrArray[j] = lpTemp; + + /* Swap the indexes for inverting sorting */ + Temp = i; + i = j; + j =Temp; + + Way = !Way; + } + + j += (!Way - Way); + } + + QsortFiles(ptrArray,First, i-1, lpFlags); + QsortFiles(ptrArray,i+1,Last, lpFlags); + } +} + + + +/* + * DirList + * + * The functions that does everything except for printing results + */ +static INT +DirList(LPTSTR szPath, /* [IN] The path that dir starts */ + LPTSTR szFilespec, /* [IN] The type of file that we are looking for */ + LPINT pLine, /* FIXME: Maybe used for paginating */ + LPDIRSWITCHFLAGS lpFlags) /* [IN] The flags of the listing */ +{ + HANDLE hSearch; /* The handle of the search */ + HANDLE hRecSearch; /* The handle for searching recursivly */ + WIN32_FIND_DATA wfdFileInfo; /* The info of file that found */ + LPWIN32_FIND_DATA * ptrFileArray; /* An array of pointers with all the files */ + PDIRFINDLISTNODE ptrStartNode; /* The pointer to the first node */ + PDIRFINDLISTNODE ptrNextNode; /* A pointer used for relatives refernces */ +TCHAR szFullPath[MAX_PATH]; /* The full path that we are listing with trailing \ */ +TCHAR szFullFileSpec[MAX_PATH]; /* The full path with file specs that we ll request\ */ +DWORD dwCount; /* A counter of files found in directory */ +DWORD dwCountFiles; /* Counter for files */ +DWORD dwCountDirs; /* Counter for directories */ +ULARGE_INTEGER u64CountBytes; /* Counter for bytes */ +ULARGE_INTEGER u64Temp; /* A temporary counter */ + + /* Initialize Variables */ + ptrStartNode = NULL; + ptrNextNode = NULL; + dwCount = 0; + dwCountFiles = 0; + dwCountDirs = 0; + u64CountBytes.QuadPart = 0; + + /* Create szFullPath and szFullFileSpec */ + _tcscpy (szFullPath, szPath); + if (szFullPath[_tcslen(szFullPath) - 1] != _T('\\')) + _tcscat (szFullPath, _T("\\")); + _tcscpy (szFullFileSpec, szFullPath); + _tcscat (szFullFileSpec, szFilespec); + + /* Prepare the linked list, first node is allocated */ + ptrStartNode = malloc(sizeof(DIRFINDLISTNODE)); + if (ptrStartNode == NULL) + { +#ifdef _DEBUG + ConErrPrintf(_T("DEBUG: Cannot allocate memory for ptrStartNode!\n")); +#endif + return 1; /* Error cannot allocate memory for 1st object */ + } + ptrNextNode = ptrStartNode; + + /* Collect the results for the current folder */ + hSearch = FindFirstFile(szFullFileSpec, &wfdFileInfo); + do + { + if (hSearch != INVALID_HANDLE_VALUE) + { + /* Here we filter all the specified attributes */ + if ((wfdFileInfo.dwFileAttributes & lpFlags->stAttribs.dwAttribMask ) + == (lpFlags->stAttribs.dwAttribMask & lpFlags->stAttribs.dwAttribVal )) + { + ptrNextNode->ptrNext = malloc(sizeof(DIRFINDLISTNODE)); + if (ptrNextNode->ptrNext == NULL) + { +#ifdef _DEBUG + ConErrPrintf(_T("DEBUG: Cannot allocate memory for ptrNextNode->ptrNext!\n")); +#endif + while (ptrStartNode) + { + ptrNextNode = ptrStartNode->ptrNext; + free(ptrStartNode); + ptrStartNode = ptrNextNode; + dwCount --; + } + return 1; + } + + /* If malloc fails we go to next file in hope it works, + without braking the linked list! */ + if (ptrNextNode->ptrNext) + { + /* Copy the info of search at linked list */ + memcpy(&ptrNextNode->ptrNext->stFindInfo, + &wfdFileInfo, + sizeof(WIN32_FIND_DATA)); + + /* If lower case is selected do it here */ + if (lpFlags->bLowerCase) + { + _tcslwr(ptrNextNode->ptrNext->stFindInfo.cAlternateFileName); + _tcslwr(ptrNextNode->ptrNext->stFindInfo.cFileName); + } + + /* Continue at next node at linked list */ + ptrNextNode = ptrNextNode->ptrNext; + dwCount ++; + + /* Grab statistics */ + if (wfdFileInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + { + /* Directory */ + dwCountDirs++; + } + else + { + /* File */ + dwCountFiles++; + u64Temp.HighPart = wfdFileInfo.nFileSizeHigh; + u64Temp.LowPart = wfdFileInfo.nFileSizeLow; + u64CountBytes.QuadPart += u64Temp.QuadPart; + } + } + } + } + }while(FindNextFile(hSearch, &wfdFileInfo)); + FindClose(hSearch); + + /* Terminate list */ + ptrNextNode->ptrNext = NULL; + + /* Calculate and allocate space need for making an array of pointers */ + ptrFileArray = malloc(sizeof(LPWIN32_FIND_DATA) * dwCount); + if (ptrFileArray == NULL) + { +#ifdef _DEBUG + ConErrPrintf(_T("DEBUG: Cannot allocate memory for ptrFileArray!\n")); +#endif + while (ptrStartNode) + { + ptrNextNode = ptrStartNode->ptrNext; + free(ptrStartNode); + ptrStartNode = ptrNextNode; + dwCount --; + } + return 1; + } + + /* + * Create an array of pointers from the linked list + * this will be used to sort and print data, rather than the list + */ + ptrNextNode = ptrStartNode; + dwCount = 0; + while (ptrNextNode->ptrNext) + { + *(ptrFileArray + dwCount) = &ptrNextNode->ptrNext->stFindInfo; + ptrNextNode = ptrNextNode->ptrNext; + dwCount++; + } + + /* Sort Data if requested*/ + if (lpFlags->stOrderBy.sCriteriaCount > 0) + QsortFiles(ptrFileArray, 0, dwCount-1,lpFlags); + + /* Print Data */ + DirPrintFiles(ptrFileArray, dwCount, szFullPath, lpFlags); + + /* Free array */ + free(ptrFileArray); + if (CheckCtrlBreak(BREAK_INPUT)) + return 1; + + + /* Add statistics to recursive statistics*/ + recurse_dir_cnt += dwCountDirs; + recurse_file_cnt += dwCountFiles; + recurse_bytes.QuadPart += u64CountBytes.QuadPart; + + /* Do the recursive job if requested + the recursive is be done on ALL(indepent of their attribs) + directoried of the current one.*/ + if (lpFlags->bRecursive) + { + /* The new search is involving any *.* file */ + _tcscpy(szFullFileSpec, szFullPath); + _tcscat(szFullFileSpec, _T("*.*")); + hRecSearch = FindFirstFile (szFullFileSpec, &wfdFileInfo); + do + { + if (hRecSearch != INVALID_HANDLE_VALUE) + { + /* We search for directories other than "." and ".." */ + if ((_tcsicmp(wfdFileInfo.cFileName, _T(".")) != 0) && + (_tcsicmp(wfdFileInfo.cFileName, _T("..")) != 0 ) && + (wfdFileInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) + { + /* Concat the path and the directory to do recursive */ + _tcscpy(szFullFileSpec, szFullPath); + _tcscat(szFullFileSpec, wfdFileInfo.cFileName); + /* We do the same for tha folder */ + if (DirList(szFullFileSpec, szFilespec, pLine,lpFlags) != 0) + { + return 1; + } + } + } + }while(FindNextFile(hRecSearch,&wfdFileInfo)); + FindClose(hRecSearch); + } + + /* Free linked list */ + while (ptrStartNode) + { + ptrNextNode = ptrStartNode->ptrNext; + free(ptrStartNode); + ptrStartNode = ptrNextNode; + dwCount --; + } + + return 0; +} + + + +/* + * dir + * + * internal dir command + */ +INT +CommandDir(LPTSTR first, LPTSTR rest) +{ + TCHAR dircmd[256]; /* A variable to store the DIRCMD enviroment variable */ + TCHAR cDrive; + TCHAR szPath[MAX_PATH]; + TCHAR szFilespec[MAX_PATH]; + LPTSTR* params; + INT entries = 0; + INT nLine = 0; + UINT loop = 0; + DIRSWITCHFLAGS stFlags; + + /* Initialize variables */ + cDrive = 0; + recurse_dir_cnt = 0L; + recurse_file_cnt = 0L; + recurse_bytes.QuadPart = 0; + + /* Initialize Switch Flags < Default switches are setted here!> */ + stFlags.b4Digit = TRUE; + stFlags.bBareFormat = FALSE; + stFlags.bLowerCase = FALSE; + stFlags.bNewLongList = TRUE; + stFlags.bPause = FALSE; + stFlags.bRecursive = FALSE; + stFlags.bShortName = FALSE; + stFlags.bTSeperator = TRUE; + stFlags.bUser = FALSE; + stFlags.bWideList = FALSE; + stFlags.bWideListColSort = FALSE; + stFlags.stTimeField.eTimeField = TF_MODIFIEDDATE; + stFlags.stTimeField.bUnSet = FALSE; + stFlags.stAttribs.dwAttribMask = FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM; + stFlags.stAttribs.dwAttribVal = 0L; + stFlags.stAttribs.bUnSet = FALSE; + stFlags.stOrderBy.sCriteriaCount = 0; + stFlags.stOrderBy.bUnSet = FALSE; + + nErrorLevel = 0; + + /* read the parameters from the DIRCMD environment variable */ + if (GetEnvironmentVariable (_T("DIRCMD"), dircmd, 256)) + if (!DirReadParam(dircmd, ¶ms, &entries, &stFlags)) + { + nErrorLevel = 1; + return 1; + } + + /* read the parameters */ + if (!DirReadParam(rest, ¶ms, &entries, &stFlags) || CheckCtrlBreak(BREAK_INPUT)) + { + nErrorLevel = 1; + return 1; + } + + /* default to current directory */ + if(entries == 0) { + if(!add_entry(&entries, ¶ms, _T("."))) { + nErrorLevel = 1; + return 1; + } + } + + for(loop = 0; loop < entries; loop++) + { + /* parse the directory info */ + if (DirParsePathspec (params[loop], szPath, szFilespec) || CheckCtrlBreak(BREAK_INPUT)) + { + nErrorLevel = 1; + return 1; + } + + /* + Uncomment this to show the final state of switch flags*/ + #ifdef _DEBUG + { + int i; + ConOutPrintf(_T("Attributes mask/value %x/%x\n"),stFlags.stAttribs.dwAttribMask,stFlags.stAttribs.dwAttribVal ); + ConOutPrintf(_T("(B) Bare format : %i\n"), stFlags.bBareFormat ); + ConOutPrintf(_T("(C) Thousand : %i\n"), stFlags.bTSeperator ); + ConOutPrintf(_T("(W) Wide list : %i\n"), stFlags.bWideList ); + ConOutPrintf(_T("(D) Wide list sort by column : %i\n"), stFlags.bWideListColSort ); + ConOutPrintf(_T("(L) Lowercase : %i\n"), stFlags.bLowerCase ); + ConOutPrintf(_T("(N) New : %i\n"), stFlags.bNewLongList ); + ConOutPrintf(_T("(O) Order : %i\n"), stFlags.stOrderBy.sCriteriaCount ); + for (i =0;i) + * Implemented PUSHD and POPD command. + * + * 20-Jan-1999 (Eric Kohl ) + * Unicode and redirection safe! + * + * 20-Jan-1999 (Eric Kohl ) + * Added DIRS command. + */ + +#include +#include "resource.h" + +#ifdef FEATURE_DIRECTORY_STACK + +typedef struct tagDIRENTRY +{ + struct tagDIRENTRY *prev; + struct tagDIRENTRY *next; + LPTSTR pszPath; +} DIRENTRY, *LPDIRENTRY; + + +static INT nStackDepth; +static LPDIRENTRY lpStackTop; +static LPDIRENTRY lpStackBottom; + + +static INT +PushDirectory (LPTSTR pszPath) +{ + LPDIRENTRY lpDir; + + nErrorLevel = 0; + + lpDir = (LPDIRENTRY)malloc (sizeof (DIRENTRY)); + if (!lpDir) + { + error_out_of_memory (); + return -1; + } + + lpDir->prev = NULL; + if (lpStackTop == NULL) + { + lpDir->next = NULL; + lpStackBottom = lpDir; + } + else + { + lpDir->next = lpStackTop; + lpStackTop->prev = lpDir; + } + lpStackTop = lpDir; + + lpDir->pszPath = (LPTSTR)malloc ((_tcslen(pszPath)+1)*sizeof(TCHAR)); + if (!lpDir->pszPath) + { + free (lpDir); + error_out_of_memory (); + return -1; + } + + _tcscpy (lpDir->pszPath, pszPath); + + nStackDepth++; + + return 0; +} + + +static VOID +PopDirectory (VOID) +{ + LPDIRENTRY lpDir; + + nErrorLevel = 0; + + if (nStackDepth == 0) + return; + + lpDir = lpStackTop; + lpStackTop = lpDir->next; + if (lpStackTop != NULL) + lpStackTop->prev = NULL; + else + lpStackBottom = NULL; + + free (lpDir->pszPath); + free (lpDir); + + nStackDepth--; +} + + +static VOID +GetDirectoryStackTop (LPTSTR pszPath) +{ + nErrorLevel = 0; + + if (lpStackTop) + _tcsncpy (pszPath, lpStackTop->pszPath, MAX_PATH); + else + *pszPath = _T('\0'); +} + + +/* + * initialize directory stack + */ +VOID InitDirectoryStack (VOID) +{ + nStackDepth = 0; + lpStackTop = NULL; + lpStackBottom = NULL; +} + + +/* + * destroy directory stack + */ +VOID DestroyDirectoryStack (VOID) +{ + while (nStackDepth) + PopDirectory (); +} + + +INT GetDirectoryStackDepth (VOID) +{ + return nStackDepth; +} + + +/* + * pushd command + */ +INT CommandPushd (LPTSTR first, LPTSTR rest) +{ + TCHAR curPath[MAX_PATH]; + TCHAR newPath[MAX_PATH]; + BOOL bChangePath = FALSE; + + if (!_tcsncmp (rest, _T("/?"), 2)) + { + ConOutResPuts(STRING_DIRSTACK_HELP1); + return 0; + } + + nErrorLevel = 0; + + if (rest[0] != _T('\0')) + { + GetFullPathName (rest, MAX_PATH, newPath, NULL); + bChangePath = IsValidPathName (newPath); + } + + GetCurrentDirectory (MAX_PATH, curPath); + if (PushDirectory (curPath)) + return 0; + + if (bChangePath) + SetCurrentDirectory (newPath); + + return 0; +} + + +/* + * popd command + */ +INT CommandPopd (LPTSTR first, LPTSTR rest) +{ + TCHAR szPath[MAX_PATH]; + + if (!_tcsncmp(rest, _T("/?"), 2)) + { + ConOutResPuts(STRING_DIRSTACK_HELP2); + return 0; + } + + nErrorLevel = 0; + + if (GetDirectoryStackDepth () == 0) + return 0; + + GetDirectoryStackTop (szPath); + PopDirectory (); + + SetCurrentDirectory (szPath); + + return 0; +} + + +/* + * dirs command + */ +INT CommandDirs (LPTSTR first, LPTSTR rest) +{ + LPDIRENTRY lpDir; + + if (!_tcsncmp(rest, _T("/?"), 2)) + { + ConOutResPuts(STRING_DIRSTACK_HELP3); + return 0; + } + + nErrorLevel = 0; + + lpDir = lpStackBottom; + + if (lpDir == NULL) + { + ConOutResPuts(STRING_DIRSTACK_HELP4); + return 0; + } + + while (lpDir != NULL) + { + ConOutPuts (lpDir->pszPath); + + lpDir = lpDir->prev; + } + + return 0; +} + +#endif /* FEATURE_DIRECTORY_STACK */ diff --git a/reactos/base/shell/cmd/echo.c b/reactos/base/shell/cmd/echo.c new file mode 100644 index 00000000000..0019c15f502 --- /dev/null +++ b/reactos/base/shell/cmd/echo.c @@ -0,0 +1,181 @@ +/* + * ECHO.C - internal echo commands. + * + * + * History: + * + * 16 Jul 1998 (Hans B Pufal) + * Started. + * + * 16 Jul 1998 (John P Price) + * Separated commands into individual files. + * + * 27-Jul-1998 (John P Price ) + * Added config.h include + * + * 08-Dec-1998 (Eric Kohl ) + * Added help text ("/?"). + * + * 19-Jan-1999 (Eric Kohl ) + * Unicode and redirection ready! + * + * 13-Jul-2000 (Eric Kohl ) + * Implemented 'echo.' and 'echoerr.'. + * + * 28-Apr-2005 (Magnus Olsen) ) + * Remove all hardcode string to En.rc + */ + +#include +#include "resource.h" + + +INT CommandEcho (LPTSTR cmd, LPTSTR param) +{ + TCHAR szMsg[RC_STRING_MAX_SIZE]; + LPTSTR p1, p2; + +#ifdef _DEBUG + DebugPrintf (_T("CommandEcho '%s' : '%s'\n"), cmd, param); +#endif + + if (_tcsicmp (cmd, _T("echo.")) == 0) + { + if (param[0] == 0) + ConOutChar (_T('\n')); + else + ConOutPuts (param); + } + else + { + /* skip the first delimiter */ + if (_istspace(*param)) + param++; + + /* skip all spaces for the check of '/?', 'ON' and 'OFF' */ + p1 = param; + while(_istspace(*p1)) + p1++; + + if (!_tcsncmp (p1, _T("/?"), 2)) + { + ConOutResPaging(TRUE,STRING_ECHO_HELP4); + return 0; + } + + if (_tcsnicmp (p1, D_OFF, sizeof(D_OFF)/sizeof(TCHAR) - 1) == 0) + { + p2 = p1 + sizeof(D_OFF)/sizeof(TCHAR) - 1; + while (_istspace(*p2)) + p2++; + if (*p2 == _T('\0')) + { + bEcho = FALSE; + return 0; + } + } + else if (_tcsnicmp (p1, D_ON, sizeof(D_ON)/sizeof(TCHAR) - 1) == 0) + { + p2 = p1 + sizeof(D_ON)/sizeof(TCHAR) - 1; + while (_istspace(*p2)) + p2++; + if (*p2 == _T('\0')) + { + bEcho = TRUE; + return 0; + } + } + if (*p1 != _T('\0')) + { + p1 = param; + while (NULL != (p1 = _tcschr(p1, _T('^')))) + { + memmove(p1, p1 + 1, (_tcslen(p1 + 1) + 1) * sizeof(TCHAR)); + if (*p1) + { + //skip past the char being escaped + p1++; + } + } + ConOutPuts (param); + } + else + { + LoadString(CMD_ModuleHandle, STRING_ECHO_HELP5, szMsg, RC_STRING_MAX_SIZE); + ConOutPrintf(szMsg, bEcho ? D_ON : D_OFF); + } + } + + return 0; +} + + +INT CommandEchos (LPTSTR cmd, LPTSTR param) +{ + +#ifdef _DEBUG + DebugPrintf (_T("CommandEchos '%s' : '%s'\n"), cmd, param); +#endif + + if (!_tcsncmp (param, _T("/?"), 2)) + { + ConOutResPuts(STRING_ECHO_HELP1); + return 0; + } + + if (*param) + ConOutPrintf (_T("%s"), param); + + return 0; +} + + +INT CommandEchoerr (LPTSTR cmd, LPTSTR param) +{ + +#ifdef _DEBUG + DebugPrintf (_T("CommandEchoerr '%s' : '%s'\n"), cmd, param); +#endif + + if (!_tcsncmp (param, _T("/?"), 2)) + { + ConOutResPuts(STRING_ECHO_HELP2); + return 0; + } + + if (_tcsicmp (cmd, _T("echoerr.")) == 0) + { + if (param[0] == 0) + ConErrChar (_T('\n')); + else + ConErrPuts (param); + } + else if (*param) + { + ConErrPuts (param); + } + + return 0; +} + + +INT CommandEchoserr (LPTSTR cmd, LPTSTR param) +{ + +#ifdef _DEBUG + DebugPrintf (_T("CommandEchoserr '%s' : '%s'\n"), cmd, param); +#endif + + if (!_tcsncmp (param, _T("/?"), 2)) + { + ConOutResPuts(STRING_ECHO_HELP3); + return 0; + } + + if (*param) + ConOutPrintf (_T("%s"), param); + + return 0; +} + +/* EOF */ diff --git a/reactos/base/shell/cmd/error.c b/reactos/base/shell/cmd/error.c new file mode 100644 index 00000000000..9bbc13b3fb1 --- /dev/null +++ b/reactos/base/shell/cmd/error.c @@ -0,0 +1,179 @@ +/* + * ERROR.C - error reporting functions. + * + * + * History: + * + * 07/12/98 (Rob Lake) + * started + * + * 27-Jul-1998 (John P Price ) + * added config.h include + * + * 24-Jan-1999 (Eric Kohl ) + * Redirection safe! + * + * 02-Feb-1999 (Eric Kohl ) + * Use FormatMessage() for error reports. + * + * 28-Apr-2005 (Magnus Olsen) ) + * Remove all hardcode string to En.rc + */ + +#include +#include "resource.h" + + +VOID ErrorMessage (DWORD dwErrorCode, LPTSTR szFormat, ...) +{ + TCHAR szMsg[RC_STRING_MAX_SIZE]; + TCHAR szMessage[1024]; + LPTSTR szError; + va_list arg_ptr; + + if (dwErrorCode == ERROR_SUCCESS) + return; + + nErrorLevel = 1; + + if (szFormat) + { + va_start (arg_ptr, szFormat); + _vstprintf (szMessage, szFormat, arg_ptr); + va_end (arg_ptr); + } + + if (FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER, + NULL, dwErrorCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + (LPTSTR)&szError, 0, NULL)) + { + ConErrPrintf (_T("%s %s\n"), szError, szMessage); + if(szError) + LocalFree (szError); + return; + } + + /* Fall back just in case the error is not defined */ + if (szFormat) + ConErrPrintf (_T("%s -- %s\n"), szMsg, szMessage); + else + ConErrPrintf (_T("%s\n"), szMsg); +} + +VOID error_parameter_format(TCHAR ch) +{ + TCHAR szMsg[RC_STRING_MAX_SIZE]; + + LoadString(CMD_ModuleHandle, STRING_ERROR_PARAMETERF_ERROR, szMsg, RC_STRING_MAX_SIZE); + ConErrPrintf(szMsg, ch); + nErrorLevel = 1; +} + + +VOID error_invalid_switch (TCHAR ch) +{ + TCHAR szMsg[RC_STRING_MAX_SIZE]; + + LoadString(CMD_ModuleHandle, STRING_ERROR_INVALID_SWITCH, szMsg, RC_STRING_MAX_SIZE); + ConErrPrintf(szMsg, ch); + nErrorLevel = 1; +} + + +VOID error_too_many_parameters (LPTSTR s) +{ + TCHAR szMsg[RC_STRING_MAX_SIZE]; + + LoadString(CMD_ModuleHandle, STRING_ERROR_TOO_MANY_PARAMETERS, szMsg, RC_STRING_MAX_SIZE); + ConErrPrintf(szMsg, s); + nErrorLevel = 1; +} + + +VOID error_path_not_found (VOID) +{ + ConErrResPuts(STRING_ERROR_PATH_NOT_FOUND); + nErrorLevel = 1; +} + + +VOID error_file_not_found (VOID) +{ + ConErrResPuts(STRING_ERROR_FILE_NOT_FOUND); + nErrorLevel = 1; +} + + +VOID error_sfile_not_found (LPTSTR f) +{ + TCHAR szMsg[RC_STRING_MAX_SIZE]; + + LoadString(CMD_ModuleHandle, STRING_ERROR_FILE_NOT_FOUND, szMsg, RC_STRING_MAX_SIZE); + ConErrPrintf(_T("%s - %s\n"), szMsg, f); + nErrorLevel = 1; +} + + +VOID error_req_param_missing (VOID) +{ + ConErrResPuts(STRING_ERROR_REQ_PARAM_MISSING); + nErrorLevel = 1; +} + + +VOID error_invalid_drive (VOID) +{ + ConErrResPuts(STRING_ERROR_INVALID_DRIVE); + nErrorLevel = 1; +} + + +VOID error_bad_command (VOID) +{ + ConErrResPuts(STRING_ERROR_BADCOMMAND); + nErrorLevel = 9009; +} + + +VOID error_no_pipe (VOID) +{ + ConErrResPuts(STRING_ERROR_CANNOTPIPE); + nErrorLevel = 1; +} + + +VOID error_out_of_memory (VOID) +{ + ConErrResPuts(STRING_ERROR_OUT_OF_MEMORY); + nErrorLevel = 1; +} + + +VOID error_invalid_parameter_format (LPTSTR s) +{ + ConErrResPuts(STRING_ERROR_INVALID_PARAM_FORMAT); + nErrorLevel = 1; +} + + +VOID error_syntax (LPTSTR s) +{ + TCHAR szMsg[RC_STRING_MAX_SIZE]; + + LoadString(CMD_ModuleHandle, STRING_ERROR_ERROR2, szMsg, RC_STRING_MAX_SIZE); + + if (s) + ConErrPrintf(_T("%s - %s\n"), szMsg, s); + else + ConErrPrintf(_T("%s.\n"), szMsg); + + nErrorLevel = 1; +} + + +VOID msg_pause (VOID) +{ + ConOutResPuts(STRING_ERROR_D_PAUSEMSG); +} + +/* EOF */ diff --git a/reactos/base/shell/cmd/filecomp.c b/reactos/base/shell/cmd/filecomp.c new file mode 100644 index 00000000000..5ef710147f5 --- /dev/null +++ b/reactos/base/shell/cmd/filecomp.c @@ -0,0 +1,751 @@ +/* + * FILECOMP.C - handles filename completion. + * + * + * Comments: + * + * 30-Jul-1998 (John P Price ) + * moved from command.c file + * made second TAB display list of filename matches + * made filename be lower case if last character typed is lower case + * + * 25-Jan-1999 (Eric Kohl ) + * Cleanup. Unicode safe! + * + * 30-Apr-2004 (Filip Navara ) + * Make the file listing readable when there is a lot of long names. + * + + * 05-Jul-2004 (Jens Collin ) + * Now expands lfn even when trailing " is omitted. + */ + +#include +#include "cmd.h" + +#ifdef FEATURE_UNIX_FILENAME_COMPLETION + +VOID CompleteFilename (LPTSTR str, UINT charcount) +{ + WIN32_FIND_DATA file; + HANDLE hFile; + INT curplace = 0; + INT start; + INT count; + INT step; + INT c = 0; + BOOL found_dot = FALSE; + BOOL perfectmatch = TRUE; + TCHAR path[MAX_PATH]; + TCHAR fname[MAX_PATH]; + TCHAR maxmatch[MAX_PATH] = _T(""); + TCHAR directory[MAX_PATH]; + LPCOMMAND cmds_ptr; + + /* expand current file name */ + count = charcount - 1; + if (count < 0) + count = 0; + + /* find how many '"'s there is typed already.*/ + step = count; + while (step > 0) + { + if (str[step] == _T('"')) + c++; + step--; + } + /* if c is odd, then user typed " before name, else not.*/ + + /* find front of word */ + if (str[count] == _T('"') || (c % 2)) + { + count--; + while (count > 0 && str[count] != _T('"')) + count--; + } + else + { + while (count > 0 && str[count] != _T(' ')) + count--; + } + + /* if not at beginning, go forward 1 */ + if (str[count] == _T(' ')) + count++; + + start = count; + + if (str[count] == _T('"')) + count++; /* don't increment start */ + + /* extract directory from word */ + _tcscpy (directory, &str[count]); + curplace = _tcslen (directory) - 1; + + if (curplace >= 0 && directory[curplace] == _T('"')) + directory[curplace--] = _T('\0'); + + _tcscpy (path, directory); + + while (curplace >= 0 && directory[curplace] != _T('\\') && + directory[curplace] != _T(':')) + { + directory[curplace] = 0; + curplace--; + } + + /* look for a '.' in the filename */ + for (count = _tcslen (directory); path[count] != _T('\0'); count++) + { + if (path[count] == _T('.')) + { + found_dot = TRUE; + break; + } + } + + if (found_dot) + _tcscat (path, _T("*")); + else + _tcscat (path, _T("*.*")); + + /* current fname */ + curplace = 0; + + hFile = FindFirstFile (path, &file); + if (hFile != INVALID_HANDLE_VALUE) + { + /* find anything */ + do + { + /* ignore "." and ".." */ + if (!_tcscmp (file.cFileName, _T(".")) || + !_tcscmp (file.cFileName, _T(".."))) + continue; + + _tcscpy (fname, file.cFileName); + + if (file.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + _tcscat (fname, _T("\\")); + + if (!maxmatch[0] && perfectmatch) + { + _tcscpy(maxmatch, fname); + } + else + { + for (count = 0; maxmatch[count] && fname[count]; count++) + { + if (tolower(maxmatch[count]) != tolower(fname[count])) + { + perfectmatch = FALSE; + maxmatch[count] = 0; + break; + } + } + + if (maxmatch[count] == _T('\0') && + fname[count] != _T('\0')) + perfectmatch = FALSE; + } + } + while (FindNextFile (hFile, &file)); + + FindClose (hFile); + + /* only quote if the filename contains spaces */ + if (_tcschr(directory, _T(' ')) || + _tcschr(maxmatch, _T(' '))) + { + str[start] = _T('\"'); + _tcscpy (&str[start+1], directory); + _tcscat (&str[start], maxmatch); + _tcscat (&str[start], _T("\"") ); + } + else + { + _tcscpy (&str[start], directory); + _tcscat (&str[start], maxmatch); + } + + if(!perfectmatch) + { + MessageBeep (-1); + } + } + else + { + /* no match found - search for internal command */ + for (cmds_ptr = cmds; cmds_ptr->name; cmds_ptr++) + { + if (!_tcsnicmp (&str[start], cmds_ptr->name, + _tcslen (&str[start]))) + { + /* return the mach only if it is unique */ + if (_tcsnicmp (&str[start], (cmds_ptr+1)->name, _tcslen (&str[start]))) + _tcscpy (&str[start], cmds_ptr->name); + break; + } + } + + MessageBeep (-1); + } +} + + +/* + * returns 1 if at least one match, else returns 0 + */ + +BOOL ShowCompletionMatches (LPTSTR str, INT charcount) +{ + WIN32_FIND_DATA file; + HANDLE hFile; + BOOL found_dot = FALSE; + INT curplace = 0; + INT start; + UINT count; + TCHAR path[MAX_PATH]; + TCHAR fname[MAX_PATH]; + TCHAR directory[MAX_PATH]; + UINT longestfname = 0; + SHORT screenwidth; + + /* expand current file name */ + count = charcount - 1; + if (count < 0) + count = 0; + + /* find front of word */ + if (str[count] == _T('"')) + { + count--; + while (count > 0 && str[count] != _T('"')) + count--; + } + else + { + while (count > 0 && str[count] != _T(' ')) + count--; + } + + /* if not at beginning, go forward 1 */ + if (str[count] == _T(' ')) + count++; + + start = count; + + if (str[count] == _T('"')) + count++; /* don't increment start */ + + /* extract directory from word */ + _tcscpy (directory, &str[count]); + curplace = _tcslen (directory) - 1; + + if (curplace >= 0 && directory[curplace] == _T('"')) + directory[curplace--] = _T('\0'); + + _tcscpy (path, directory); + + while (curplace >= 0 && + directory[curplace] != _T('\\') && + directory[curplace] != _T(':')) + { + directory[curplace] = 0; + curplace--; + } + + /* look for a . in the filename */ + for (count = _tcslen (directory); path[count] != _T('\0'); count++) + { + if (path[count] == _T('.')) + { + found_dot = TRUE; + break; + } + } + + if (found_dot) + _tcscat (path, _T("*")); + else + _tcscat (path, _T("*.*")); + + /* current fname */ + curplace = 0; + + hFile = FindFirstFile (path, &file); + if (hFile != INVALID_HANDLE_VALUE) + { + /* Get the size of longest filename first. */ + do + { + if (_tcslen(file.cFileName) > longestfname) + { + longestfname = _tcslen(file.cFileName); + /* Directories get extra brackets around them. */ + if (file.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + longestfname += 2; + } + } + while (FindNextFile (hFile, &file)); + FindClose (hFile); + + hFile = FindFirstFile (path, &file); + + /* Count the highest number of columns */ + GetScreenSize(&screenwidth, 0); + + /* For counting columns of output */ + count = 0; + + /* Increase by the number of spaces behind file name */ + longestfname += 3; + + /* find anything */ + ConOutChar (_T('\n')); + do + { + /* ignore . and .. */ + if (!_tcscmp (file.cFileName, _T(".")) || + !_tcscmp (file.cFileName, _T(".."))) + continue; + + if (file.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + _stprintf (fname, _T("[%s]"), file.cFileName); + else + _tcscpy (fname, file.cFileName); + + ConOutPrintf (_T("%*s"), - longestfname, fname); + count++; + /* output as much columns as fits on the screen */ + if (count >= (screenwidth / longestfname)) + { + /* print the new line only if we aren't on the + * last column, in this case it wraps anyway */ + if (count * longestfname != (UINT)screenwidth) + ConOutPrintf (_T("\n")); + count = 0; + } + } + while (FindNextFile (hFile, &file)); + + FindClose (hFile); + + if (count) + ConOutChar (_T('\n')); + } + else + { + /* no match found */ + MessageBeep (-1); + return FALSE; + } + + return TRUE; +} +#endif + +#ifdef FEATURE_4NT_FILENAME_COMPLETION + +typedef struct _FileName +{ + TCHAR Name[MAX_PATH]; +} FileName; + +VOID FindPrefixAndSuffix(LPTSTR strIN, LPTSTR szPrefix, LPTSTR szSuffix) +{ + /* String that is to be examined */ + TCHAR str[MAX_PATH]; + /* temp pointers to used to find needed parts */ + TCHAR * szSearch; + TCHAR * szSearch1; + TCHAR * szSearch2; + /* number of quotes in the string */ + INT nQuotes = 0; + /* used in for loops */ + UINT i; + /* Char number to break the string at */ + INT PBreak = 0; + INT SBreak = 0; + /* when phrasing a string, this tells weather + you are inside quotes ot not. */ + BOOL bInside = FALSE; + + szPrefix[0] = _T('\0'); + szSuffix[0] = _T('\0'); + + /* Copy over the string to later be edited */ + _tcscpy(str,strIN); + + /* Count number of " */ + for(i = 0; i < _tcslen(str); i++) + if(str[i] == _T('\"')) + nQuotes++; + + /* Find the prefix and suffix */ + if(nQuotes % 2 && nQuotes >= 1) + { + /* Odd number of quotes. Just start from the last " */ + /* THis is the way MS does it, and is an easy way out */ + szSearch = _tcsrchr(str, _T('\"')); + /* Move to the next char past the " */ + szSearch++; + _tcscpy(szSuffix,szSearch); + /* Find the one closest to end */ + szSearch1 = _tcsrchr(str, _T('\"')); + szSearch2 = _tcsrchr(str, _T('\\')); + if(szSearch2 != NULL && _tcslen(szSearch1) > _tcslen(szSearch2)) + szSearch = szSearch2; + else + szSearch = szSearch1; + /* Move one char past */ + szSearch++; + szSearch[0] = _T('\0'); + _tcscpy(szPrefix,str); + return; + + } + + if(!_tcschr(str, _T(' '))) + { + /* No spaces, everything goes to Suffix */ + _tcscpy(szSuffix,str); + /* look for a slash just in case */ + szSearch = _tcsrchr(str, _T('\\')); + if(szSearch) + { + szSearch++; + szSearch[0] = _T('\0'); + _tcscpy(szPrefix,str); + } + else + { + szPrefix[0] = _T('\0'); + } + return; + } + + if(!nQuotes) + { + /* No quotes, and there is a space*/ + /* Take it after the last space */ + szSearch = _tcsrchr(str, _T(' ')); + szSearch++; + _tcscpy(szSuffix,szSearch); + /* Find the closest to the end space or \ */ + _tcscpy(str,strIN); + szSearch1 = _tcsrchr(str, _T(' ')); + szSearch2 = _tcsrchr(str, _T('\\')); + if(szSearch2 != NULL && _tcslen(szSearch1) > _tcslen(szSearch2)) + szSearch = szSearch2; + else + szSearch = szSearch1; + szSearch++; + szSearch[0] = _T('\0'); + _tcscpy(szPrefix,str); + return; + } + + /* All else fails and there is a lot of quotes, spaces and | + Then we search through and find the last space or \ that is + not inside a quotes */ + for(i = 0; i < _tcslen(str); i++) + { + if(str[i] == _T('\"')) + bInside = !bInside; + if(str[i] == _T(' ') && !bInside) + SBreak = i; + if((str[i] == _T(' ') || str[i] == _T('\\')) && !bInside) + PBreak = i; + + } + SBreak++; + PBreak++; + _tcscpy(szSuffix,&strIN[SBreak]); + strIN[PBreak] = _T('\0'); + _tcscpy(szPrefix,strIN); + if(szPrefix[_tcslen(szPrefix) - 2] == _T('\"')) + { + /* need to remove the " right before a \ at the end to + allow the next stuff to stay inside one set of quotes + otherwise you would have multiple sets of quotes*/ + _tcscpy(&szPrefix[_tcslen(szPrefix) - 2],_T("\\")); + + } + +} + int __cdecl compare(const void *arg1,const void *arg2) + { + FileName * File1; + FileName * File2; + INT ret; + + File1 = malloc(sizeof(FileName)); + File2 = malloc(sizeof(FileName)); + if(!File1 || !File2) + return 0; + + memcpy(File1,arg1,sizeof(FileName)); + memcpy(File2,arg2,sizeof(FileName)); + + /* ret = _tcsicmp(File1->Name, File2->Name); */ + ret = lstrcmpi(File1->Name, File2->Name); + + free(File1); + free(File2); + return ret; + } + +VOID CompleteFilename (LPTSTR strIN, BOOL bNext, LPTSTR strOut, UINT cusor) +{ + /* Length of string before we complete it */ + INT StartLength; + /* Length of string after completed */ + INT EndLength; + /* The number of chars added too it */ + static INT DiffLength = 0; + /* Used to find and assemble the string that is returned */ + TCHAR szBaseWord[MAX_PATH]; + TCHAR szPrefix[MAX_PATH]; + TCHAR szOrginal[MAX_PATH]; + TCHAR szSearchPath[MAX_PATH]; + /* Save the strings used last time, so if they hit tab again */ + static TCHAR LastReturned[MAX_PATH]; + static TCHAR LastSearch[MAX_PATH]; + static TCHAR LastPrefix[MAX_PATH]; + /* Used to search for files */ + HANDLE hFile; + WIN32_FIND_DATA file; + /* List of all the files */ + FileName * FileList = NULL; + /* Number of files */ + INT FileListSize = 0; + /* Used for loops */ + UINT i; + /* Editable string of what was passed in */ + TCHAR str[MAX_PATH]; + /* Keeps track of what element was last selected */ + static INT Sel; + BOOL NeededQuote = FALSE; + BOOL ShowAll = TRUE; + TCHAR * line = strIN; + + strOut[0] = _T('\0'); + + while (_istspace (*line)) + line++; + if(!_tcsnicmp (line, _T("rd "), 3) || !_tcsnicmp (line, _T("cd "), 3)) + ShowAll = FALSE; + + /* Copy the string, str can be edited and orginal should not be */ + _tcscpy(str,strIN); + _tcscpy(szOrginal,strIN); + + /* Look to see if the cusor is not at the end of the string */ + if((cusor + 1) < _tcslen(str)) + str[cusor] = _T('\0'); + + /* Look to see if they hit tab again, if so cut off the diff length */ + if(_tcscmp(str,LastReturned) || !_tcslen(str)) + { + /* We need to know how many chars we added from the start */ + StartLength = _tcslen(str); + + /* no string, we need all files in that directory */ + if(!StartLength) + { + _tcscat(str,_T("*")); + } + + /* Zero it out first */ + szBaseWord[0] = _T('\0'); + szPrefix[0] = _T('\0'); + + /*What comes out of this needs to be: + szBaseWord = path no quotes to the object + szPrefix = what leads up to the filename + no quote at the END of the full name */ + FindPrefixAndSuffix(str,szPrefix,szBaseWord); + /* Strip quotes */ + for(i = 0; i < _tcslen(szBaseWord); ) + { + if(szBaseWord[i] == _T('\"')) + memmove(&szBaseWord[i],&szBaseWord[i + 1], _tcslen(&szBaseWord[i]) * sizeof(TCHAR)); + else + i++; + } + + /* clear it out */ + memset(szSearchPath, 0, sizeof(szSearchPath)); + + /* Start the search for all the files */ + GetFullPathName(szBaseWord, MAX_PATH, szSearchPath, NULL); + if(StartLength > 0) + { + _tcscat(szSearchPath,_T("*")); + } + _tcscpy(LastSearch,szSearchPath); + _tcscpy(LastPrefix,szPrefix); + } + else + { + _tcscpy(szSearchPath, LastSearch); + _tcscpy(szPrefix, LastPrefix); + StartLength = 0; + } + /* search for the files it might be */ + hFile = FindFirstFile (szSearchPath, &file); + + /* aseemble a list of all files names */ + do + { + if(hFile == INVALID_HANDLE_VALUE) + { + /* Assemble the orginal string and return */ + _tcscpy(strOut,szOrginal); + CloseHandle(hFile); + if(FileList != NULL) + free(FileList); + return; + } + + if(!_tcscmp (file.cFileName, _T(".")) || + !_tcscmp (file.cFileName, _T(".."))) + continue; + + /* Don't show files when they are doing 'cd' or 'rd' */ + if(!ShowAll && + file.dwFileAttributes != 0xFFFFFFFF && + !(file.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) + { + continue; + } + + /* Add the file to the list of files */ + if(FileList == NULL) + { + FileListSize = 1; + FileList = malloc(FileListSize * sizeof(FileName)); + } + else + { + FileListSize++; + FileList = realloc(FileList, FileListSize * sizeof(FileName)); + } + + if(FileList == NULL) + { + /* Assemble the orginal string and return */ + _tcscpy(strOut,szOrginal); + CloseHandle(hFile); + ConOutFormatMessage (GetLastError()); + return; + } + /* Copies the file name into the struct */ + _tcscpy(FileList[FileListSize-1].Name,file.cFileName); + + }while(FindNextFile(hFile,&file)); + + /* Check the size of the list to see if we + found any matches */ + if(FileListSize == 0) + { + _tcscpy(strOut,szOrginal); + CloseHandle(hFile); + if(FileList != NULL) + free(FileList); + return; + + } + /* Sort the files */ + qsort(FileList,FileListSize,sizeof(FileName), compare); + + /* Find the next/previous */ + if(!_tcscmp(szOrginal,LastReturned)) + { + if(bNext) + { + if(FileListSize - 1 == Sel) + Sel = 0; + else + Sel++; + } + else + { + if(!Sel) + Sel = FileListSize - 1; + else + Sel--; + } + } + else + { + Sel = 0; + } + + /* nothing found that matched last time + so return the first thing in the list */ + strOut[0] = _T('\0'); + + /* space in the name */ + if(_tcschr(FileList[Sel].Name, _T(' '))) + { + INT LastSpace; + BOOL bInside; + /* It needs a " at the end */ + NeededQuote = TRUE; + LastSpace = -1; + bInside = FALSE; + /* Find the place to put the " at the start */ + for(i = 0; i < _tcslen(szPrefix); i++) + { + if(szPrefix[i] == _T('\"')) + bInside = !bInside; + if(szPrefix[i] == _T(' ') && !bInside) + LastSpace = i; + + } + /* insert the quoation and move things around */ + if(szPrefix[LastSpace + 1] != _T('\"') && LastSpace != -1) + { + memmove ( &szPrefix[LastSpace+1], &szPrefix[LastSpace], (_tcslen(szPrefix)-LastSpace+1) * sizeof(TCHAR) ); + + if((UINT)(LastSpace + 1) == _tcslen(szPrefix)) + { + _tcscat(szPrefix,_T("\"")); + } + szPrefix[LastSpace + 1] = _T('\"'); + } + else if(LastSpace == -1) + { + _tcscpy(szBaseWord,_T("\"")); + _tcscat(szBaseWord,szPrefix); + _tcscpy(szPrefix,szBaseWord); + + } + } + + _tcscpy(strOut,szPrefix); + _tcscat(strOut,FileList[Sel].Name); + + /* check for odd number of quotes means we need to close them */ + if(!NeededQuote) + { + for(i = 0; i < _tcslen(strOut); i++) + if(strOut[i] == _T('\"')) + NeededQuote = !NeededQuote; + } + + if(szPrefix[_tcslen(szPrefix) - 1] == _T('\"') || NeededQuote) + _tcscat(strOut,_T("\"")); + + _tcscpy(LastReturned,strOut); + EndLength = _tcslen(strOut); + DiffLength = EndLength - StartLength; + CloseHandle(hFile); + if(FileList != NULL) + free(FileList); + +} +#endif diff --git a/reactos/base/shell/cmd/files.txt b/reactos/base/shell/cmd/files.txt new file mode 100644 index 00000000000..0004b4f0b1c --- /dev/null +++ b/reactos/base/shell/cmd/files.txt @@ -0,0 +1,57 @@ +Archive Contents +~~~~~~~~~~~~~~~~ +files.txt This file list +history.txt History of revsions. Not to date. see svn.reactos.com for more info. +license.txt GNU license - applies to all files named here +readme.txt General shell info +readme2.txt Techincal shell info +todo.txt Things that need to be implmented or fixed(including bugs) + +alias.c Alias code +alias.h Alias header file +attrib.c Implements attrib command +batch.c Batch file interpreter +beep.c Implements beep command +call.c Implements call command +chcp.c Implements chcp command +choice.c Implements choice command +cls.c Implements cls command +cmdinput.c Command-line input functions +cmdtable.c Table of available internal commands +cmd.c Main code for command-line interpreter +cmd.h Command header file +color.c Implements color command +console.c Windows console handling code +copy.c Implements copy command +date.c Implements date command +del.c Implements del command +dir.c Directory listing code +dirstack.c Directory stack code (PUSHD and POPD) +echo.c Implements echo command +error.c Error Message Routines +filecomp.c Filename completion functions +for.c Implements for command +free.c Implements free command +goto.c Implements goto command +history.c Command-line history handling +if.c Implements if command +internal.c Internal commands (DIR, RD, CD, etc) +label.c Implements label command +locale.c Locale handling code +memory.c Implements memory command +misc.c Misc. Functions +msgbox.c Implements msgbox command +move.c Implements move command +path.c Implements path command +pause.c Implements pause command +prompt.c Prompt handling functions +redir.c Redirection and piping parsing functions +ren.c Implements rename command +set.c Implements set command +shift.c Implements shift command +time.c Implements time command +timer.c Implements timer command +type.c Implements type command +ver.c Implements ver command +where.c Code to search path for executables +verify.c Implements verify command diff --git a/reactos/base/shell/cmd/for.c b/reactos/base/shell/cmd/for.c new file mode 100644 index 00000000000..b503a57b141 --- /dev/null +++ b/reactos/base/shell/cmd/for.c @@ -0,0 +1,152 @@ +/* + * FOR.C - for internal batch command. + * + * + * History: + * + * 16-Jul-1998 (Hans B Pufal) + * Started. + * + * 16-Jul-1998 (John P Price) + * Seperated commands into individual files. + * + * 19-Jul-1998 (Hans B Pufal) + * Implementation of FOR. + * + * 27-Jul-1998 (John P Price ) + * Added config.h include. + * + * 20-Jan-1999 (Eric Kohl) + * Unicode and redirection safe! + * + * 01-Sep-1999 (Eric Kohl) + * Added help text. + * + * 23-Feb-2001 (Carl Nettelblad ) + * Implemented preservation of echo flag. Some other for related + * code in other files fixed, too. + * + * 28-Apr-2005 (Magnus Olsen) ) + * Remove all hardcode string to En.rc + */ + +#include +#include "resource.h" + + +/* + * Perform FOR command. + * + * First check syntax is correct : FOR %v IN ( ) DO + * v must be alphabetic, must not be empty. + * + * If all is correct build a new bcontext structure which preserves + * the necessary information so that readbatchline can expand + * each the command prototype for each list element. + * + * You might look on a FOR as being a called batch file with one line + * per list element. + */ + +INT cmd_for (LPTSTR cmd, LPTSTR param) +{ + LPBATCH_CONTEXT lpNew; + LPTSTR pp; + TCHAR var; + TCHAR szMsg[RC_STRING_MAX_SIZE]; + +#ifdef _DEBUG + DebugPrintf (_T("cmd_for (\'%s\', \'%s\'\n"), cmd, param); +#endif + + if (!_tcsncmp (param, _T("/?"), 2)) + { + ConOutResPaging(TRUE,STRING_FOR_HELP1); + return 0; + } + + /* Check that first element is % then an alpha char followed by space */ + if ((*param != _T('%')) || !_istalpha (*(param + 1)) || !_istspace (*(param + 2))) + { + LoadString( CMD_ModuleHandle, STRING_FOR_ERROR, szMsg, RC_STRING_MAX_SIZE); + error_syntax (szMsg); + return 1; + } + + param++; + var = *param++; /* Save FOR var name */ + + while (_istspace (*param)) + param++; + + /* Check next element is 'IN' */ + if ((_tcsnicmp (param, _T("in"), 2) != 0) || !_istspace (*(param + 2))) + { + LoadString(CMD_ModuleHandle, STRING_FOR_ERROR1, szMsg, RC_STRING_MAX_SIZE); + error_syntax(szMsg); + return 1; + } + + param += 2; + while (_istspace (*param)) + param++; + + /* Folowed by a '(', find also matching ')' */ + if ((*param != _T('(')) || (NULL == (pp = _tcsrchr (param, _T(')'))))) + { + LoadString(CMD_ModuleHandle, STRING_FOR_ERROR2, szMsg, RC_STRING_MAX_SIZE); + error_syntax(szMsg); + return 1; + } + + *pp++ = _T('\0'); + param++; /* param now points at null terminated list */ + + while (_istspace (*pp)) + pp++; + + /* Check DO follows */ + if ((_tcsnicmp (pp, _T("do"), 2) != 0) || !_istspace (*(pp + 2))) + { + LoadString(CMD_ModuleHandle, STRING_FOR_ERROR3, szMsg, RC_STRING_MAX_SIZE); + error_syntax(szMsg); + return 1; + } + + pp += 2; + while (_istspace (*pp)) + pp++; + + /* Check that command tail is not empty */ + if (*pp == _T('\0')) + { + LoadString(CMD_ModuleHandle, STRING_FOR_ERROR4, szMsg, RC_STRING_MAX_SIZE); + error_syntax(szMsg); + return 1; + } + + /* OK all is correct, build a bcontext.... */ + lpNew = (LPBATCH_CONTEXT)malloc (sizeof (BATCH_CONTEXT)); + + lpNew->prev = bc; + bc = lpNew; + + bc->hBatchFile = INVALID_HANDLE_VALUE; + bc->ffind = NULL; + bc->params = BatchParams (_T(""), param); /* Split out list */ + bc->shiftlevel = 0; + bc->forvar = var; + bc->forproto = _tcsdup (pp); + if (bc->prev) + bc->bEcho = bc->prev->bEcho; + else + bc->bEcho = bEcho; + bc->In[0] = _T('\0'); + bc->Out[0] = _T('\0'); + bc->Err[0] = _T('\0'); + + + return 0; +} + +/* EOF */ diff --git a/reactos/base/shell/cmd/free.c b/reactos/base/shell/cmd/free.c new file mode 100644 index 00000000000..f739cd3522f --- /dev/null +++ b/reactos/base/shell/cmd/free.c @@ -0,0 +1,124 @@ +/* + * FREE.C - internal command. + * + * + * History: + * + * 01-Sep-1999 (Eric Kohl) + * Started. + * + * 28-Apr-2005 (Magnus Olsen) ) + * Remove all hardcode string to En.rc + */ + +#include +#include "resource.h" + +#ifdef INCLUDE_CMD_FREE + +static VOID +PrintDiskInfo (LPTSTR szDisk) +{ + TCHAR szMsg[RC_STRING_MAX_SIZE]; + TCHAR szRootPath[4] = _T("A:\\"); + TCHAR szDrive[2] = _T("A"); + TCHAR szVolume[64]; + TCHAR szSerial[10]; + TCHAR szTotal[40]; + TCHAR szUsed[40]; + TCHAR szFree[40]; + DWORD dwSerial; + ULARGE_INTEGER uliSize; + DWORD dwSecPerCl; + DWORD dwBytPerSec; + DWORD dwFreeCl; + DWORD dwTotCl; + + if (_tcslen (szDisk) < 2 || szDisk[1] != _T(':')) + { + LoadString(CMD_ModuleHandle, STRING_FREE_ERROR1, szMsg, RC_STRING_MAX_SIZE); + ConErrPrintf(szMsg); + return; + } + + szRootPath[0] = szDisk[0]; + szDrive[0] = _totupper (szRootPath[0]); + + if (!GetVolumeInformation (szRootPath, szVolume, 64, &dwSerial, + NULL, NULL, NULL, 0)) + { + LoadString(CMD_ModuleHandle, STRING_FREE_ERROR1, szMsg, RC_STRING_MAX_SIZE); + ConErrPrintf(_T("%s %s:\n"), szMsg, szDrive); + return; + } + + if (szVolume[0] == _T('\0')) + { + + LoadString(CMD_ModuleHandle, STRING_FREE_ERROR2, szMsg, RC_STRING_MAX_SIZE); + _tcscpy (szVolume, szMsg); + } + + _stprintf (szSerial, + _T("%04X-%04X"), + HIWORD(dwSerial), + LOWORD(dwSerial)); + + if (!GetDiskFreeSpace (szRootPath, &dwSecPerCl, + &dwBytPerSec, &dwFreeCl, &dwTotCl)) + { + LoadString(CMD_ModuleHandle, STRING_FREE_ERROR1, szMsg, RC_STRING_MAX_SIZE); + ConErrPrintf (_T("%s %s:\n"), szMsg, szDrive); + return; + } + + uliSize.QuadPart = dwSecPerCl * dwBytPerSec * dwTotCl; + ConvertULargeInteger (uliSize, szTotal, 40, TRUE); + + uliSize.QuadPart = dwSecPerCl * dwBytPerSec * (dwTotCl - dwFreeCl); + ConvertULargeInteger (uliSize, szUsed, 40, TRUE); + + uliSize.QuadPart = dwSecPerCl * dwBytPerSec * dwFreeCl; + ConvertULargeInteger (uliSize, szFree, 40, TRUE); + + + LoadString(CMD_ModuleHandle, STRING_FREE_HELP1, szMsg, RC_STRING_MAX_SIZE); + ConOutPrintf(szMsg, szDrive, szVolume, szSerial, szTotal, szUsed, szFree); +} + + +INT CommandFree (LPTSTR cmd, LPTSTR param) +{ + LPTSTR szParam; + TCHAR szDefPath[MAX_PATH]; + INT argc, i; + LPTSTR *arg; + + if (!_tcsncmp (param, _T("/?"), 2)) + { + ConOutResPaging(TRUE,STRING_FREE_HELP2); + return 0; + } + + if (!param || *param == _T('\0')) + { + GetCurrentDirectory (MAX_PATH, szDefPath); + szDefPath[2] = _T('\0'); + szParam = szDefPath; + } + else + szParam = param; + + arg = split (szParam, &argc, FALSE); + + for (i = 0; i < argc; i++) + PrintDiskInfo (arg[i]); + + freep (arg); + + return 0; +} + +#endif /* INCLUDE_CMD_FREE */ + +/* EOF */ diff --git a/reactos/base/shell/cmd/goto.c b/reactos/base/shell/cmd/goto.c new file mode 100644 index 00000000000..4f2cf77d553 --- /dev/null +++ b/reactos/base/shell/cmd/goto.c @@ -0,0 +1,127 @@ +/* + * GOTO.C - goto internal batch command. + * + * History: + * + * 16 Jul 1998 (Hans B Pufal) + * started. + * + * 16 Jul 1998 (John P Price) + * Seperated commands into individual files. + * + * 27-Jul-1998 (John P Price ) + * added config.h include + * + * 28 Jul 1998 (Hans B Pufal) [HBP_003] + * Terminate label on first space character, use only first 8 chars of + * label string + * + * 24-Jan-1999 (Eric Kohl ) + * Unicode and redirection safe! + * + * 27-Jan-1999 (Eric Kohl ) + * Added help text ("/?"). + * + * 28-Apr-2005 (Magnus Olsen) ) + * Remove all hardcode string to En.rc + */ + +#include +#include "resource.h" + + +/* + * Perform GOTO command. + * + * Only valid if batch file current. + * + */ + +INT cmd_goto (LPTSTR cmd, LPTSTR param) +{ + TCHAR szMsg[RC_STRING_MAX_SIZE]; + LPTSTR tmp; + LONG lNewPosHigh; + +#ifdef _DEBUG + DebugPrintf (_T("cmd_goto (\'%s\', \'%s\'\n"), cmd, param); +#endif + + if (!_tcsncmp (param, _T("/?"), 2)) + { + ConOutResPaging(TRUE,STRING_GOTO_HELP1); + return 0; + } + + /* if not in batch -- error!! */ + if (bc == NULL) + { + return 1; + } + + if (*param == _T('\0')) + { + LoadString(CMD_ModuleHandle, STRING_GOTO_ERROR1, szMsg, RC_STRING_MAX_SIZE); + ExitBatch(szMsg); + return 1; + } + + /* terminate label at first space char */ + tmp = param+1; + while (!_istcntrl (*tmp) && !_istspace (*tmp) && (*tmp != _T(':'))) + tmp++; + *(tmp) = _T('\0'); + + /* set file pointer to the beginning of the batch file */ + lNewPosHigh = 0; + + /* jump to end of the file */ + if ( _tcsicmp( param, _T(":eof"))==0) + { + SetFilePointer (bc->hBatchFile, 0, &lNewPosHigh, FILE_END); + return 0; + } + + /* jump to begin of the file */ + SetFilePointer (bc->hBatchFile, 0, &lNewPosHigh, FILE_BEGIN); + + while (FileGetString (bc->hBatchFile, textline, sizeof(textline) / sizeof(textline[0]))) + { + int pos; + int size; + + /* Strip out any trailing spaces or control chars */ + tmp = textline + _tcslen (textline) - 1; + + + while (_istcntrl (*tmp) || _istspace (*tmp) || (*tmp == _T(':'))) + tmp--; + *(tmp + 1) = _T('\0'); + + /* Then leading spaces... */ + tmp = textline; + while (_istspace (*tmp)) + tmp++; + + /* All space after leading space terminate the string */ + size = _tcslen(tmp) -1; + pos=0; + while (tmp+pos < tmp+size) + { + if (_istspace(tmp[pos])) + tmp[pos]=_T('\0'); + pos++; + } + + /* use whole label name */ + if ((*tmp == _T(':')) && (_tcsicmp (++tmp, param) == 0)) + return 0; + } + + LoadString(CMD_ModuleHandle, STRING_GOTO_ERROR2, szMsg, RC_STRING_MAX_SIZE); + ConErrPrintf(szMsg, param); + ExitBatch(NULL); + return 1; +} + +/* EOF */ diff --git a/reactos/base/shell/cmd/history.c b/reactos/base/shell/cmd/history.c new file mode 100644 index 00000000000..aae395d0d8a --- /dev/null +++ b/reactos/base/shell/cmd/history.c @@ -0,0 +1,486 @@ +/* + * HISTORY.C - command line history. + * + * + * History: + * + * 14/01/95 (Tim Norman) + * started. + * + * 08/08/95 (Matt Rains) + * i have cleaned up the source code. changes now bring this source + * into guidelines for recommended programming practice. + * + * 27-Jul-1998 (John P Price ) + * added config.h include + * + * 25-Jan-1999 (Eric Kohl ) + * Cleanup! + * Unicode and redirection safe! + * + * 25-Jan-1999 (Paolo Pantaleo ) + * Added lots of comments (beginning studying the source) + * Added command.com's F3 support (see cmdinput.c) + * + */ + + + +/* + * HISTORY.C - command line history. Second version + * + * + * History: + * + * 06/12/99 (Paolo Pantaleo ) + * started. + * + */ + +#include + +#ifdef FEATURE_HISTORY + +typedef struct tagHISTORY +{ + struct tagHISTORY *prev; + struct tagHISTORY *next; + LPTSTR string; +} HIST_ENTRY, * LPHIST_ENTRY; + +static INT size, + max_size=100; + + + +static LPHIST_ENTRY Top; +static LPHIST_ENTRY Bottom; + + +static LPHIST_ENTRY curr_ptr=0; + + +VOID InitHistory(VOID); +VOID History_move_to_bottom(VOID); +VOID History (INT dir, LPTSTR commandline); +VOID CleanHistory(VOID); +VOID History_del_current_entry(LPTSTR str); + +/*service functions*/ +static VOID del(LPHIST_ENTRY item); +static VOID add_at_bottom(LPTSTR string); +/*VOID add_before_last(LPTSTR string);*/ +VOID set_size(INT new_size); + + + +INT CommandHistory (LPTSTR cmd, LPTSTR param) +{ + LPTSTR tmp; + INT tmp_int; + LPHIST_ENTRY h_tmp; + TCHAR szBuffer[2048]; + + tmp=_tcschr(param,_T('/')); + + if (tmp) + { + param=tmp; + switch (_totupper(param[1])) + { + case _T('F'):/*delete history*/ + CleanHistory();InitHistory(); + break; + + case _T('R'):/*read history from standard in*/ + //hIn=GetStdHandle (STD_INPUT_HANDLE); + + for(;;) + { + ConInString(szBuffer,sizeof(szBuffer)/sizeof(TCHAR)); + if (*szBuffer!=_T('\0')) + History(0,szBuffer); + else + break; + } + break; + + case _T('A'):/*add an antry*/ + History(0,param+2); + break; + + case _T('S'):/*set history size*/ + if ((tmp_int=_ttoi(param+2))) + set_size(tmp_int); + break; + + default: + return 1; + } + } + else + { + for (h_tmp = Top->prev; h_tmp != Bottom; h_tmp = h_tmp->prev) + ConErrPuts(h_tmp->string); + } + return 0; +} + +VOID set_size(INT new_size) +{ + while (new_sizeprev); + + max_size=new_size; +} + + +VOID InitHistory(VOID) +{ + size=0; + + Top = malloc(sizeof(HIST_ENTRY)); + Bottom = malloc(sizeof(HIST_ENTRY)); + + Top->prev = Bottom; + Top->next = NULL; + Top->string = NULL; + + Bottom->prev = NULL; + Bottom->next = Top; + Bottom->string = NULL; + + curr_ptr=Bottom; +} + + + + +VOID CleanHistory(VOID) +{ + while (Bottom->next!=Top) + del(Bottom->next); + + free(Top); + free(Bottom); +} + + +VOID History_del_current_entry(LPTSTR str) +{ + LPHIST_ENTRY tmp; + + if (size == 0) + return; + + if (curr_ptr == Bottom) + curr_ptr=Bottom->next; + + if (curr_ptr == Top) + curr_ptr=Top->prev; + + + tmp = curr_ptr; + curr_ptr = curr_ptr->prev; + del(tmp); + History(-1, str); +} + + +static +VOID del(LPHIST_ENTRY item) +{ + if (item==NULL || item==Top || item==Bottom) + { +#ifdef _DEBUG + DebugPrintf(_T("del in ") _T(__FILE__) _T(": retrning\n") + _T("item is 0x%08x (Bottom is0x%08x)\n"), + item, Bottom); +#endif + return; + } + + + + /*free string's mem*/ + if (item->string) + free(item->string); + + /*set links in prev and next item*/ + item->next->prev=item->prev; + item->prev->next=item->next; + + free(item); + + size--; +} + + +#if 0 +static +VOID add_before_last(LPTSTR string) +{ + LPHIST_ENTRY tmp,before,after; + + /*delete first entry if maximum number of entries is reached*/ + while(size>=max_size) + del(Top->prev); + + while (_istspace(*string)) + string++; + + if (*string==_T('\0')) + return; + + /*allocte entry and string*/ + tmp=malloc(sizeof(HIST_ENTRY)); + tmp->string=malloc((_tcslen(string)+1)*sizeof(TCHAR)); + _tcscpy(tmp->string,string); + + /*set links*/ + before=Bottom->next; + after=before->next; + + tmp->prev=before; + tmp->next=after; + + after->prev=tmp; + before->next=tmp; + + /*set new size*/ + size++; + + +} +#endif/*0*/ + +static +VOID add_at_bottom(LPTSTR string) +{ + + + LPHIST_ENTRY tmp; + + + /*delete first entry if maximum number of entries is reached*/ + while(size>=max_size) + del(Top->prev); + + while (_istspace(*string)) + string++; + + if (*string==_T('\0')) + return; + + + /*if new entry is the same than the last do not add it*/ + if(size) + if(_tcscmp(string,Bottom->next->string)==0) + return; + + + /*fill bottom with string, it will become Bottom->next*/ + Bottom->string=malloc((_tcslen(string)+1)*sizeof(TCHAR)); + _tcscpy(Bottom->string,string); + + /*save Bottom value*/ + tmp=Bottom; + + + /*create new void Bottom*/ + Bottom=malloc(sizeof(HIST_ENTRY)); + Bottom->next=tmp; + Bottom->prev=NULL; + Bottom->string=NULL; + + tmp->prev=Bottom; + + /*set new size*/ + size++; + +} + + + +VOID History_move_to_bottom(VOID) +{ + curr_ptr=Bottom; + +} + + +VOID History (INT dir, LPTSTR commandline) +{ + + if(dir==0) + { + add_at_bottom(commandline); + curr_ptr=Bottom; + return; + } + + if (size==0) + { + commandline[0]=_T('\0'); + return; + } + + + if(dir<0)/*key up*/ + { + if (curr_ptr->next==Top || curr_ptr==Top) + { +#ifdef WRAP_HISTORY + curr_ptr=Bottom; +#else + curr_ptr=Top; + commandline[0]=_T('\0'); + return; +#endif + } + + + curr_ptr = curr_ptr->next; + if(curr_ptr->string) + _tcscpy(commandline,curr_ptr->string); + + } + + + + + + if(dir>0) + { + + if (curr_ptr->prev==Bottom || curr_ptr==Bottom) + { +#ifdef WRAP_HISTORY + curr_ptr=Top; +#else + curr_ptr=Bottom; + commandline[0]=_T('\0'); + return; +#endif + } + + curr_ptr=curr_ptr->prev; + if(curr_ptr->string) + _tcscpy(commandline,curr_ptr->string); + + } +} + + + + + + +#if 0 + +LPTSTR history = NULL; /*buffer to sotre all the lines*/ +LPTSTR lines[MAXLINES]; /*array of pointers to each line(entry)*/ + /*located in history buffer*/ + +INT curline = 0; /*the last line recalled by user*/ +INT numlines = 0; /*number of entries, included the last*/ + /*empty one*/ + +INT maxpos = 0; /*index of last byte of last entry*/ + + + +VOID History (INT dir, LPTSTR commandline) +{ + + INT count; /*used in for loops*/ + INT length; /*used in the same loops of count*/ + /*both to make room when is full + either history or lines*/ + + /*first time History is called allocate mem*/ + if (!history) + { + history = malloc (history_size * sizeof (TCHAR)); + lines[0] = history; + history[0] = 0; + } + + if (dir > 0) + { + /* next command */ + if (curline < numlines) + { + curline++; + } + + if (curline == numlines) + { + commandline[0] = 0; + } + else + { + _tcscpy (commandline, lines[curline]); + } + } + else if (dir < 0) + { + /* prev command */ + if (curline > 0) + { + curline--; + } + + _tcscpy (commandline, lines[curline]); + } + else + { + /* add to history */ + /* remove oldest string until there's enough room for next one */ + /* strlen (commandline) must be less than history_size! */ + while ((maxpos + (INT)_tcslen (commandline) + 1 > history_size) || (numlines >= MAXLINES)) + { + length = _tcslen (lines[0]) + 1; + + for (count = 0; count < maxpos && count + (lines[1] - lines[0]) < history_size; count++) + { + history[count] = history[count + length]; + } + + maxpos -= length; + + for (count = 0; count <= numlines && count < MAXLINES; count++) + { + lines[count] = lines[count + 1] - length; + } + + numlines--; +#ifdef DEBUG + ConOutPrintf (_T("Reduced size: %ld lines\n"), numlines); + + for (count = 0; count < numlines; count++) + { + ConOutPrintf (_T("%d: %s\n"), count, lines[count]); + } +#endif + } + + /*copy entry in the history bufer*/ + _tcscpy (lines[numlines], commandline); + numlines++; + + /*set last lines[numlines] pointer next the end of last, valid, + just setted entry (the two lines above)*/ + lines[numlines] = lines[numlines - 1] + _tcslen (commandline) + 1; + maxpos += _tcslen (commandline) + 1; + /* last line, empty */ + + curline = numlines; + } + + return; +} + +#endif + +#endif //#if 0 diff --git a/reactos/base/shell/cmd/history.txt b/reactos/base/shell/cmd/history.txt new file mode 100644 index 00000000000..a0cac6f59d1 --- /dev/null +++ b/reactos/base/shell/cmd/history.txt @@ -0,0 +1,367 @@ +FreeDOS Command Line Interface Development History +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +11/11/94 version 0.01 +~~~~~~~~~~~~~~~~~~~~~ +o initial release. + +01/01/95 version 0.10 +~~~~~~~~~~~~~~~~~~~~~ +o removed some scaffolding. +o modified CD. +o added tab file completion. +o added command line history. + +01/15/95 version 0.20 +~~~~~~~~~~~~~~~~~~~~~ +o formatted all existing source modules. +o added prompt support. +o added drive selection. +o added dir command. +o started this development log. + +08/06/95 prerelease of version 0.30 +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +o reorganized code into separate source modules. +o added batch processing support (thanks to Evan Jeffrey). +o added exec code (thanks to Steffan Kaiser). +o removed environment handling (thanks again to Steffan Kaiser) + + [ 08/08/95 -- Matt Rains ] +o formatted this development log. +o formatted all existing source modules so that they comply with recommended + programming practice. +o added MD command. +o added RD command. +o added VER command. +o replaced CD command. +o modified DIR command. +o DIR now called regardless of other DIR.??? files. this is done because of + exec() problems. + +12/10/95 version 0.30 +~~~~~~~~~~~~~~~~~~~~~ +o used Borland's spawnve to fix exec problem +o fixed CD again so you don't need a space after it +o couple of spelling fixes + +12/14/95 version 0.31 +~~~~~~~~~~~~~~~~~~~~~ +o modified cmdinput.c to work with non-standard screen sizes (see 28.com) +o fixed a bug in history.c that made it not work when you hit the up arrow + on the first line +o fixed DIR to work a little more like MS-DOS's DIR (see internal.c) +o fixed some code in where.c to make things a bit more efficient and nicer + +01/06/96 version 0.40 (never released) +~~~~~~~~~~~~~~~~~~~~~ +o added redirection and piping support!!! (see redir.c and command.c) +o fixed a stupid pointer problem in where.c that was causing LOTS of + problems in the strangest places... +o added day of the week support to prompt.c (oops, that was already supposed + to be there! :) +o fixed and reorganized the EXEC code!!! Thanks to Svante Frey! +o reorganized command.c and internal.c to handle parsing internal commands + more efficiently and consistently. +o changed the behavior of MD, CD, RD to work without spaces (e.g. CD\DOS) +o small changes here and there to make it work with redirection/piping + (e.g. DIR only pauses if you're not doing redirection) + +01/17/96 version 0.50 +~~~~~~~~~~~~~~~~~~~~~ +Version 0.40 was never released because I was home on Christmas vacation, +and I couldn't upload it. By the time I got back to school, I had the +LOADHIGH patch from Svante Frey, so I decided to jump up to 0.50 without any +release of 0.40... - Tim Norman + +o LOADHIGH/LOADFIX/LH support added!!!! Many thanks go to Svante Frey! +o bug fixed in command parsing that didn't handle / switches correctly... +o removed debugging output from history.c + +07/26/96 version 0.60 +~~~~~~~~~~~~~~~~~~~~~ +Lots of internal changes here... Not much added to the interface. + +o Changed internals to use first,rest parameters instead of arrays of params +o Fixed some bugs +o Some other things I don't remember :) + +07/26/96 version 0.61 +~~~~~~~~~~~~~~~~~~~~~ +Bugfixes + +o Added hook to the PATH command +o Fixed CD.. bug + +08/27/96 version 0.70 +~~~~~~~~~~~~~~~~~~~~~ +Finally added Oliver Mueller's ALIAS command! Also numerous bug fixes. + +o Added ALIAS command +o Removed support for - as a switch in LOADHIGH.C +o Bugfixes in BATCH.C. %0 was returning garbage +o Removed lots of unused variables, reducing # of warnings when compiling +o Other miscellaneous code clean-ups +o Changed WHERE.C to use a little less memory + +06/14/97 version 0.71 +~~~~~~~~~~~~~~~~~~~~~ +Lots of bug fixes, plus some additional features. + +o New DIR command. Now more like MS-DOS's DIR. /p supported, /s coming soon +o bug fix in internal.c - parse_firstarg +o Rewrote parser in batch.c (Steffan Kaiser) +o Ctrl-Break checking in various places (Steffan Kaiser) +o Error level setting/checking (%? in batch files) (Steffan Kaiser) +o bug fix in cmdinput.c ("%i" on command-line caused weird behavior) +o bug fix in where.c (first item in path wasn't searched) + +07/12/97 version 0.72 +~~~~~~~~~~~~~~~~~~~~~ +More bug fixes and code cleanup + +o Rewrote cmdinput.c to be more efficient (Marc Desrochers) +o Added insert/overstrike modes (Marc Desrochers) +o Replaced findxy() with pointers into BIOS (maxx, maxy) (Marc Desrochers) +o Fixed bug that disallowed listing of root directories +o Fixed bug that didn't search the first path (again!) + +07/13/97 version 0.72b +~~~~~~~~~~~~~~~~~~~~~~ +Disabled a feature that caused a crash on some machines. + +o Replaced setcursor calls in cmdinput.c with _setcursortype +o Added dir.c to the distribution (was left out in 0.72) + +07/01/98 version 0.73 (Rob Lake) +~~~~~~~~~~~~~~~~~~~~~~ +o New DIR commands supported: /S, /B, /L, /A and /W. + (/R changed to /S). Also /? added. +o Supports DIRCMD in environment. +o Supports turning off commands with hyphen (ex. /-S + turns off recursive listing) +o Changed error messages for DIR and DEL to more MS-DOS'ish +o Moved error messages from DIR.C and DEL.C to COMMAND.H + (more may go there soon) +o Fixed bug that caused dir *.ext/X not to work (no spaces + between filespec and slash) +o Added wildcard support for DEL command +o Added prompt and help switch for DEL command, /P and /? + respectively. +o Added support for /C when envoking the shell +o Added /P support when Kernel loads shell. This means + the shell now is permanent and runs the autoexec.bat + (/E is not implemented) +o Added my name (Rob Lake) to the developer listing +o Changed version routine to print out copyright notice + with no args, and with appropriate switches, warranty + and redistribution notices and developer listing + +07/08/1998 version 0.74 (John P. Price (linux-guru@gcfl.net)) +~~~~~~~~~~~~~~~~~~~~~~~~ +COMMAND.C/COMMAND.H: +o Now sets COMSPEC environment variable +o misc clean up and optimization +o added date, time and type commands +o changed to using spawnl instead of exec. exec does not copy the + environment to the child process! +DIR.C +o removed extra returns; closer to MSDOS +o fixed wide display so that an extra return is not displayed when + there is five filenames in the last line. +ENVIRON.C +o commented out show_environment function. Not used anymore. +INTERAL.C +o removed call to show_environment in set command. +o moved test for syntax before allocating memory in set command. +o misc clean up and optimization. + +o created DATE.C +o created TIME.C +o created TYPE.C + +07/08/1998 version 0.74b (John P. Price (linux-guru@gcfl.net)) +~~~~~~~~~~~~~~~~~~~~~~~~ +COMMAND.C +o fixed call to spawnl so that it would pass command line arguments + correctly. + +07/12/98 version 0.74c (Rob Lake rlake@cs.mun.ca) +~~~~~~~~~~~~~~~~~~~~~~ +Various Files: +o removed redundant use of error message defines and moved + error printing calls to ERROR.C to reduced program size. + +o created MISC.C +o created ERR_HAND.C/H +o created ERROR.C + +07/13/98 version 0.74d (Rob Lake rlake@cs.mun.ca) +~~~~~~~~~~~~~~~~~~~~~~ +INTERNAL.C +o removed most of the commands and placed them in there own file + -- del, ren, set and ver +o created DEL.C, REN.C SET.C and VER.C +o fixed bug that caused del not to delete files with no attributes +o the critical error handler count number of times called, autofails + at 5 calls + + +16 Jul 1998 (Hans B Pufal ) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +batch.c + A new version, implements CALL, ECHO, GOT, IF, PAUSE, SHIFT and + BEEP. There is a stub for FOR but that's all. + +cmdtable.c + New file to keep the internal command table. I plan on getting rid + of the table real soon now and replacing it with a dynamic + mechanism. + +command.c + A new (improved ;) version. Conforms closely to MS-DOS specs. + Cleaned up (and fixed) the redirection handler. + +command.h + Version D with changes. Look for the HBP tag. + +redir.c + Modified file, now supports append redirects. + + +16 Jul 1998 (Rob Lake rlake@cs.mun.ca) +~~~~~~~~~~~~~~~~~~~~~~ +Added TRUENAME command. + + +19 Jul 1998 (Hans B Pufal) ) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +o Preserve state of echo flag across batch calls. +o Implementation of FOR command + + +20 Jul 1998 (John P Price ) +~~~~~~~~~~~~~~~~~~~~~~ +o Fixed bug in DATE.C. +o Fixed bug in LH.ASM. +o Separated commands into individual files. + + +28 Jul 1998 (John P Price ) +~~~~~~~~~~~~~~~~~~~~~~ +o Added CLS command. +o Put ifdef's around all commands and added include file config.h + Now you can define exact what commands you want to include in + command.com. +o Also added ifdefs for optional features: aliases, command history + and filename completion. +o Added display of available internal commands and options at startup. + + +29 Jul 1998 (Rob Lake rlake@cs.mun.ca) +~~~~~~~~~~~~~~~~~~~~~~ +o changed date.c and time.c, and wrote datefunc.c and timefunc.c to + impliment _dos_getdate, _dos_setdate, _dos_gettime and _dos_settime. + This is the first of many steps to make the shell compatible under + Pacific C. + +30-Jul-1998 (John P Price ) +~~~~~~~~~~~~~~~~~~~~~~ +o Changed filename completion so that a second TAB displays a list of + matching filenames! +o made filename be lower case if last character typed is lower case. +o Moved filename completion code to filecomp.c. +o Change ver command to display email address to report bugs, and the + web page address for updates. +o fixed so that it find_which returns NULL if filename is not + executable (does not have .bat, .com, or .exe extension). Before + command would to execute any file with any extension. (opps!) + +30-Jul-1998 (John P Price ) +~~~~~~~~~~~~~~~~~~~~~~ +o Fixed bug where if you typed something, then hit HOME, then tried to + type something else in insert mode, it locked up. +o Changed default insert mode to on. There should be a way to change + this. Maybe options to doskey command. +o Added VERIFY command + +02-Aug-1998 (Hans B Pufal) ) +~~~~~~~~~~~~~~~~~~~~~~ +o batch.c: Fixed bug in ECHO flag restoration at exit from batch file +o command.c: Fixed return value when called with /C option +o Terminate label on first space character, use only first 8 chars of + label string + +04-Aug-1998 (Hans B Pufal) ) +~~~~~~~~~~~~~~~~~~~~~~ +o call.c: added lines to initialize for pointers. This fixed the + lock-up that happened sometimes when calling a batch file from + another batch file. + +07-Aug-1998 (John P Price ) +~~~~~~~~~~~~~~~~~~~~~~ +o Fixed carrage return output to better match MSDOS with echo on or off. + + +07-Dec-1998 ReactOS CMD version 0.0.1 (Eric Kohl ) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +o First test release. +o Added internal ATTRIB command. + +11-Dec-1998 ReactOS CMD version 0.0.2 (Eric Kohl ) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +o Fixed bug in ALIAS. CMD crashed when you tried to remove an alias. +o Fixed bug in split(). Added freep(). This fixed the DEL command. +o Improved ATTRIB command. +o Added most help texts. +o Fixed recursive DIR ("dir /s"). +o Fixed DATE and TIME command. Now they accept values when used + without parameter. +o Implemented LABEL command. + +05-Jan-1999 ReactOS CMD version 0.0.3 (Eric Kohl ) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +o Added COLOR command and "/t" option. +o Cursor shows insert/overwrite mode. +o COMSPEC environment variable is set upon startup. +o Started COPY command. +o Started MOVE command. +o Added directory stack (PUSHD and POPD commands). +o Added support for file names or paths that contain spaces + (quoted paths / file names). +o Added recursion to ATTRIB command. +o Added locale support for DIR, DATE, TIME and PROMPT. +o Fixed VERIFY. + +10-Feb-1999 ReactOS CMD version 0.0.4 (Eric Kohl ) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +o "?" lists all available commands. +o Most commands are unicode and redirection aware now. +o Input-, Output- and Error-Redirections works with most commands. +o ATTRIB and DEL can handle multiple filenames now. +o Fixed handling of environment variables. +o Added CHCP command. +o Fixed keyboard input bug. +o Rewrote DEL and MOVE commands. + +28-Dec-1999 ReactOS CMD version 0.1 (Eric Kohl ) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +o Cleaned up DIR command. +o Searching for executables in the right order. +o Fixed some little but nasty bugs. +o Added TITLE command. Thanks to Emanuele Aliberti! +o Added "/Q", "/W" and "/Z" options to DEL command. +o Added CHOICE, TIMER, FREE and MEMORY commands. +o Added MSGBOX command (not available under ReactOS). +o Added and fixed missing help texts. +o Fixed bugs in MD and RD that crashed cmd when no directory was specified. +o Improved history support. +o Improved COLOR command. + +09-Apr-2000 ReactOS CMD version 0.1 (EricKohl +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +o Fixed bug in COPY command. CMD crashed if source file didn't exist. + +13-Jul-2000 ReactOS CMD version 0.1.1 (EricKohl +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +o Implemented 'ECHO.' and 'ECHOERR.' commands. diff --git a/reactos/base/shell/cmd/if.c b/reactos/base/shell/cmd/if.c new file mode 100644 index 00000000000..b040d1c098d --- /dev/null +++ b/reactos/base/shell/cmd/if.c @@ -0,0 +1,213 @@ +/* + * IF.C - if internal batch command. + * + * + * History: + * + * 16 Jul 1998 (Hans B Pufal) + * started. + * + * 16 Jul 1998 (John P Price) + * Seperated commands into individual files. + * + * 27-Jul-1998 (John P Price ) + * added config.h include + * + * 07-Jan-1999 (Eric Kohl ) + * Added help text ("if /?") and cleaned up. + * + * 21-Jan-1999 (Eric Kohl ) + * Unicode and redirection ready! + * + * 01-Sep-1999 (Eric Kohl ) + * Fixed help text. + * + * 17-Feb-2001 (ea) + * IF DEFINED variable command + * + * 28-Apr-2005 (Magnus Olsen) ) + * Remove all hardcode string to En.rc + * + */ + +#include +#include "resource.h" + + +#define X_EXEC 1 +#define X_EMPTY 0x80 + +INT cmd_if (LPTSTR cmd, LPTSTR param) +{ + INT x_flag = 0; /* when set cause 'then' clause to be executed */ + LPTSTR pp; + +#ifdef _DEBUG + DebugPrintf (_T("cmd_if: (\'%s\', \'%s\')\n"), cmd, param); +#endif + + if (!_tcsncmp (param, _T("/?"), 2)) + { + ConOutResPaging(TRUE,STRING_IF_HELP1); + return 0; + } + + /* First check if param string begins with 'not' */ + if (!_tcsnicmp (param, _T("not"), 3) && _istspace (*(param + 3))) + { + x_flag = X_EXEC; /* Remember 'NOT' */ + param += 3; /* Step over 'NOT' */ + while (_istspace (*param)) /* And subsequent spaces */ + param++; + } + + /* Check for 'exist' form */ + if (!_tcsnicmp (param, _T("exist"), 5) && _istspace (*(param + 5))) + { + UINT i; + BOOL bInside = FALSE; + + param += 5; + while (_istspace (*param)) + param++; + + pp = param; + + /* find the whole path to the file */ + for(i = 0; i < _tcslen(param); i++) + { + if(param[i] == _T('\"')) + bInside = !bInside; + if((param[i] == _T(' ')) && !bInside) + { + break; + } + pp++; + } + *pp++ = _T('\0'); + i = 0; + /* remove quotes */ + while(i < _tcslen(param)) + { + if(param[i] == _T('\"')) + memmove(¶m[i],¶m[i + 1], _tcslen(¶m[i]) * sizeof(TCHAR)); + else + i++; + } + + if (*pp) + { + WIN32_FIND_DATA f; + HANDLE hFind; + + hFind = FindFirstFile (param, &f); + x_flag ^= (hFind == INVALID_HANDLE_VALUE) ? 0 : X_EXEC; + if (hFind != INVALID_HANDLE_VALUE) + { + FindClose (hFind); + } + } + else + return 0; + } + else if (!_tcsnicmp (param, _T("defined"), 7) && _istspace (*(param + 7))) + { + /* Check for 'defined' form */ + TCHAR Value [1]; + INT ValueSize = 0; + + param += 7; + /* IF [NOT] DEFINED var COMMAND */ + /* ^ */ + while (_istspace (*param)) + param++; + /* IF [NOT] DEFINED var COMMAND */ + /* ^ */ + pp = param; + while (*pp && !_istspace (*pp)) + pp++; + /* IF [NOT] DEFINED var COMMAND */ + /* ^ */ + if (*pp) + { + *pp++ = _T('\0'); + ValueSize = GetEnvironmentVariable(param, Value, sizeof(Value) / sizeof(Value[0])); + x_flag ^= (0 == ValueSize) + ? 0 + : X_EXEC; + x_flag |= X_EMPTY; + } + else + return 0; + } + else if (!_tcsnicmp (param, _T("errorlevel"), 10) && _istspace (*(param + 10))) + { + /* Check for 'errorlevel' form */ + INT n = 0; + + pp = param + 10; + while (_istspace (*pp)) + pp++; + + while (_istdigit (*pp)) + n = n * 10 + (*pp++ - _T('0')); + + x_flag ^= (nErrorLevel != n) ? 0 : X_EXEC; + + x_flag |= X_EMPTY; /* Syntax error if comd empty */ + } + else + { + BOOL bInQuote = FALSE; + INT p1len; + pp = param; + while ( *pp && ( bInQuote || *pp != _T('=') ) ) + { + if ( *pp == _T('\"') ) + bInQuote = !bInQuote; + ++pp; + } + p1len = pp-param; + /* check for "==" */ + if ( *pp++ != _T('=') || *pp++ != _T('=') ) + { + error_syntax ( NULL ); + return 1; + } + while (_istspace (*pp)) /* Skip subsequent spaces */ + pp++; + + /* are the two sides equal, and does the second end in the same place? */ + if ( !_tcsncmp(param,pp,p1len) && _tcschr(_T(" ("),pp[p1len]) ) + x_flag ^= X_EXEC; + pp += p1len; + + if ( x_flag ) + { + while (*pp && !_istspace (*pp)) /* Find first space, */ + pp++; + x_flag |= X_EMPTY; + } + } + + if (x_flag & X_EMPTY) + { + while (_istspace (*pp)) /* Then skip spaces */ + pp++; + + if (*pp == _T('\0')) /* If nothing left then syntax err */ + { + error_syntax (NULL); + return 1; + } + } + + if (x_flag & X_EXEC) + { + ParseCommandLine (pp); + } + + return 0; +} + +/* EOF */ diff --git a/reactos/base/shell/cmd/internal.c b/reactos/base/shell/cmd/internal.c new file mode 100644 index 00000000000..5c62a9bbd2b --- /dev/null +++ b/reactos/base/shell/cmd/internal.c @@ -0,0 +1,767 @@ +/* + * INTERNAL.C - command.com internal commands. + * + * + * History: + * + * 17/08/94 (Tim Norman) + * started. + * + * 08/08/95 (Matt Rains) + * i have cleaned up the source code. changes now bring this source into + * guidelines for recommended programming practice. + * + * cd() + * started. + * + * dir() + * i have added support for file attributes to the DIR() function. the + * routine adds "d" (directory) and "r" (read only) output. files with the + * system attribute have the filename converted to lowercase. files with + * the hidden attribute are not displayed. + * + * i have added support for directorys. now if the directory attribute is + * detected the file size if replaced with the string "". + * + * ver() + * started. + * + * md() + * started. + * + * rd() + * started. + * + * del() + * started. + * + * does not support wildcard selection. + * + * todo: add delete directory support. + * add recursive directory delete support. + * + * ren() + * started. + * + * does not support wildcard selection. + * + * todo: add rename directory support. + * + * a general structure has been used for the cd, rd and md commands. this + * will be better in the long run. it is too hard to maintain such diverse + * functions when you are involved in a group project like this. + * + * 12/14/95 (Tim Norman) + * fixed DIR so that it will stick \*.* if a directory is specified and + * that it will stick on .* if a file with no extension is specified or + * *.* if it ends in a \ + * + * 1/6/96 (Tim Norman) + * added an isatty call to DIR so it won't prompt for keypresses unless + * stdin and stdout are the console. + * + * changed parameters to be mutually consistent to make calling the + * functions easier + * + * rem() + * started. + * + * doskey() + * started. + * + * 01/22/96 (Oliver Mueller) + * error messages are now handled by perror. + * + * 02/05/96 (Tim Norman) + * converted all functions to accept first/rest parameters + * + * 07/26/96 (Tim Norman) + * changed return values to int instead of void + * + * path() started. + * + * 12/23/96 (Aaron Kaufman) + * rewrote dir() to mimic MS-DOS's dir + * + * 01/28/97 (Tim Norman) + * cleaned up Aaron's DIR code + * + * 06/13/97 (Tim Norman) + * moved DIR code to dir.c + * re-implemented Aaron's DIR code + * + * 06/14/97 (Steffan Kaiser) + * ctrl-break handling + * bug fixes + * + * 27-Jul-1998 (John P Price ) + * added config.h include + * + * 03-Dec-1998 (Eric Kohl ) + * Replaced DOS calls by Win32 calls. + * + * 08-Dec-1998 (Eric Kohl ) + * Added help texts ("/?"). + * + * 18-Dec-1998 (Eric Kohl ) + * Added support for quoted arguments (cd "program files"). + * + * 07-Jan-1999 (Eric Kohl ) + * Clean up. + * + * 26-Jan-1999 (Eric Kohl ) + * Replaced remaining CRT io functions by Win32 io functions. + * Unicode safe! + * + * 30-Jan-1999 (Eric Kohl ) + * Added "cd -" feature. Changes to the previous directory. + * + * 15-Mar-1999 (Eric Kohl ) + * Fixed bug in "cd -" feature. If the previous directory was a root + * directory, it was ignored. + * + * 23-Feb-2001 (Carl Nettelblad ) + * Improved chdir/cd command. + * + * 02-Apr-2004 (Magnus Olsen ) + * Remove all hard code string so they can be + * translate to other langues. + * + * 19-jul-2005 (Brandon Turner +#include "resource.h" + +#ifdef INCLUDE_CMD_CHDIR + +static LPTSTR lpLastPath; + + +VOID InitLastPath (VOID) +{ + lpLastPath = NULL; +} + + +VOID FreeLastPath (VOID) +{ + if (lpLastPath) + free (lpLastPath); +} + +/* help functions for getting current path from drive + without changing drive. Return code 0 = ok, 1 = fail. + INT GetRootPath("C:",outbuffer,chater size of outbuffer); + the first param can have any size, if the the two frist + letter are not a drive with : it will get Currentpath on + current drive exacly as GetCurrentDirectory does. + */ + +INT GetRootPath(TCHAR *InPath,TCHAR *OutPath,INT size) +{ + INT retcode = 1; + + if (_tcslen(InPath)>1) + { + if (InPath[1]==_T(':')) + { + INT t=0; + + if ((InPath[0] >= _T('0')) && (InPath[0] <= _T('9'))) + { + t = (InPath[0] - _T('0')) +28; + } + + if ((InPath[0] >= _T('a')) && (InPath[0] <= _T('z'))) + { + t = (InPath[0] - _T('a')) +1; + InPath[0] = t + _T('A') - 1; + } + + if ((InPath[0] >= _T('A')) && (InPath[0] <= _T('Z'))) + { + t = (InPath[0] - _T('A')) +1; + } + + if (_tgetdcwd(t,OutPath,size) != NULL) + { + return 0; + } + } + } + + /* fail */ + if (_tcslen(InPath)>1) + { + if (InPath[1]==_T(':')) + return 1; + } + + /* Get current directory */ + retcode = GetCurrentDirectory(size,OutPath); + if (retcode==0) + return 1; + + return 0; +} + + +BOOL SetRootPath(TCHAR *InPath) +{ + TCHAR oldpath[MAX_PATH]; + TCHAR OutPath[MAX_PATH]; + TCHAR OutPathTemp[MAX_PATH]; + TCHAR OutPathTemp2[MAX_PATH]; + BOOL fail; + + + /* Get The current directory path and save it */ + fail = GetCurrentDirectory(MAX_PATH,oldpath); + if (!fail) + return 1; + + /* Get current drive directory path if C: was only pass down*/ + + if (_tcsncicmp(&InPath[1],_T(":\\"),2)!=0) + { + if (!GetRootPath(InPath,OutPathTemp,MAX_PATH)) + _tcscpy(OutPathTemp,InPath); + } + else + { + _tcscpy(OutPathTemp,InPath); + } + + _tcsupr(OutPathTemp); + /* The use of both of these together will correct the case of a path + where as one alone or GetFullPath will not. Exameple: + c:\windows\SYSTEM32 => C:\WINDOWS\system32 */ + GetFullPathName(OutPathTemp, MAX_PATH, OutPathTemp2, NULL); + GetPathCase(OutPathTemp2, OutPath); + + fail = SetCurrentDirectory(OutPath); + if (!fail) + return 1; + + + + SetCurrentDirectory(OutPath); + GetCurrentDirectory(MAX_PATH,OutPath); + _tchdir(OutPath); + + if (_tcsncicmp(OutPath,oldpath,2)!=0) + SetCurrentDirectory(oldpath); + + return 0; +} + + +/* + * CD / CHDIR + * + */ +INT cmd_chdir (LPTSTR cmd, LPTSTR param) +{ + + WIN32_FIND_DATA f; + HANDLE hFile; + BOOL bChangeDrive = FALSE; + TCHAR szPath[MAX_PATH]; + TCHAR szFinalPath[MAX_PATH]; + TCHAR * tmpPath; + TCHAR szCurrent[MAX_PATH]; + TCHAR szMsg[RC_STRING_MAX_SIZE]; + INT i; + + + /* Filter out special cases first */ + + /* Print Help */ + if (!_tcsncmp(param, _T("/?"), 2)) + { + ConOutResPaging(TRUE,STRING_CD_HELP); + return 0; + } + + /* Set Error Level to Success */ + nErrorLevel = 0; + + /* Input String Contains /D Switch */ + if (!_tcsncicmp(param, _T("/D"), 2)) + { + bChangeDrive = TRUE; + tmpPath = _tcsstr(param,_T(" ")); + if(!tmpPath) + { + /* Didnt find an directories */ + LoadString(CMD_ModuleHandle, STRING_ERROR_PATH_NOT_FOUND, szMsg, RC_STRING_MAX_SIZE); + ConErrPrintf(szMsg); + nErrorLevel = 1; + return 1; + } + tmpPath++; + _tcscpy(szPath,tmpPath); + } + else + { + _tcscpy(szPath,param); + } + + /* Print Current Directory on a disk */ + if (_tcslen(szPath) == 2 && szPath[1] == _T(':')) + { + if(GetRootPath(szPath,szCurrent,MAX_PATH)) + { + nErrorLevel = 1; + return 1; + } + ConOutPuts(szCurrent); + return 0; + } + + /* Get Current Directory */ + GetRootPath(_T("."),szCurrent,MAX_PATH); + + /* Remove " */ + i = 0; + while(i < (INT)_tcslen(szPath)) + { + if(szPath[i] == _T('\"')) + memmove(&szPath[i],&szPath[i + 1], _tcslen(&szPath[i]) * sizeof(TCHAR)); + else + i++; + } + + tmpPath = szPath; + while (_istspace (*tmpPath)) + tmpPath++; + _tcscpy(szPath,tmpPath); + + if (szPath[0] == _T('\0')) + { + ConOutPuts(szCurrent); + return 0; + } + + + /* change to full path if relative path was given */ + GetFullPathName(szPath,MAX_PATH,szFinalPath,NULL); + + if(szFinalPath[_tcslen(szFinalPath) - 1] == _T('\\') && _tcslen(szFinalPath) > 3) + szFinalPath[_tcslen(szFinalPath) - 1] = _T('\0'); + + /* Handle Root Directory Alone*/ + if (_tcslen(szFinalPath) == 3 && szFinalPath[1] == _T(':')) + { + if(!SetRootPath(szFinalPath)) + { + /* Change prompt if it is one the same drive or /D */ + if(bChangeDrive || !_tcsncicmp(szFinalPath,szCurrent,1)) + SetCurrentDirectory(szFinalPath); + return 0; + } + /* Didnt find an directories */ + LoadString(CMD_ModuleHandle, STRING_ERROR_PATH_NOT_FOUND, szMsg, RC_STRING_MAX_SIZE); + ConErrPrintf(szMsg); + nErrorLevel = 1; + return 1; + + } + + /* Get a list of all the files */ + hFile = FindFirstFile (szFinalPath, &f); + + do + { + if(hFile == INVALID_HANDLE_VALUE) + { + ConErrFormatMessage (GetLastError(), szFinalPath); + nErrorLevel = 1; + return 1; + } + + /* Strip the paths back to the folder they are in */ + for(i = (_tcslen(szFinalPath) - 1); i > -1; i--) + if(szFinalPath[i] != _T('\\')) + szFinalPath[i] = _T('\0'); + else + break; + + _tcscat(szFinalPath,f.cFileName); + + if ((f.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY) + { + if(!SetRootPath(szFinalPath)) + { + /* Change for /D */ + if(bChangeDrive) + { + _tcsupr(szFinalPath); + GetPathCase(szFinalPath, szPath); + SetCurrentDirectory(szPath); + } + return 0; + } + + } + }while(FindNextFile (hFile, &f)); + + /* Didnt find an directories */ + LoadString(CMD_ModuleHandle, STRING_ERROR_PATH_NOT_FOUND, szMsg, RC_STRING_MAX_SIZE); + ConErrPrintf(szMsg); + nErrorLevel = 1; + return 1; +} + +#endif + + + +#ifdef INCLUDE_CMD_MKDIR + +/* Helper funtion for mkdir to make directories in a path. +Dont use the api to decrease depence on libs */ +BOOL +MakeFullPath(TCHAR * DirPath) +{ + TCHAR path[MAX_PATH]; + TCHAR *p = DirPath; + INT n; + + if (p[0] && p[1] == _T(':')) + p += 2; + while (*p == _T('\\')) + p++; /* skip drive root */ + while ((p = _tcschr(p, _T('\\'))) != NULL) + { + n = p - DirPath + 1; + memcpy(path, DirPath, n); + path[n] = _T('\0'); + if( !CreateDirectory(path, NULL) && + (GetLastError() != ERROR_ALREADY_EXISTS)) + return FALSE; + p++; + } + if (GetLastError() == ERROR_ALREADY_EXISTS) + SetLastError(ERROR_SUCCESS); + + return TRUE; +} + +/* + * MD / MKDIR + * + */ +INT cmd_mkdir (LPTSTR cmd, LPTSTR param) +{ + LPTSTR dir; /* pointer to the directory to change to */ + LPTSTR place; /* used to search for the \ when no space is used */ + LPTSTR *p = NULL; + INT argc; + nErrorLevel = 0; + if (!_tcsncmp (param, _T("/?"), 2)) + { + ConOutResPaging(TRUE,STRING_MKDIR_HELP); + return 0; + } + + + /* check if there is no space between the command and the path */ + if (param[0] == _T('\0')) + { + /* search for the \ or . so that both short & long names will work */ + for (place = cmd; *place; place++) + if (*place == _T('.') || *place == _T('\\')) + break; + + if (*place) + dir = place; + else + /* signal that there are no parameters */ + dir = NULL; + } + else + { + p = split (param, &argc, FALSE); + if (argc > 1) + { + /*JPP 20-Jul-1998 use standard error message */ + error_too_many_parameters (param); + freep (p); + return 1; + } + else + dir = p[0]; + } + + if (!dir) + { + ConErrResPuts (STRING_ERROR_REQ_PARAM_MISSING); + nErrorLevel = 1; + if(p != NULL) + freep (p); + return 1; + } + + /* Add a \ at the end of the path is there isnt on already */ + if (dir[_tcslen (dir) - 1] != _T('\\')) + _tcscat(dir,_T("\\")); + + if (!MakeFullPath(dir)) + { + if(GetLastError() == ERROR_PATH_NOT_FOUND) + { + ConErrResPuts(STRING_MD_ERROR2); + } + else + { + ErrorMessage (GetLastError(), _T("MD")); + } + nErrorLevel = 1; + freep (p); + return 1; + } + + freep (p); + + return 0; +} +#endif + + +#ifdef INCLUDE_CMD_RMDIR +/* + * RD / RMDIR + * + */ +BOOL DeleteFolder(LPTSTR FileName) +{ + TCHAR Base[MAX_PATH]; + TCHAR TempFileName[MAX_PATH]; + HANDLE hFile; + WIN32_FIND_DATA f; + _tcscpy(Base,FileName); + _tcscat(Base,_T("\\*")); + hFile = FindFirstFile(Base, &f); + Base[_tcslen(Base) - 1] = _T('\0'); + if (hFile != INVALID_HANDLE_VALUE) + { + do + { + if (!_tcscmp(f.cFileName, _T(".")) || + !_tcscmp(f.cFileName, _T(".."))) + continue; + _tcscpy(TempFileName,Base); + _tcscat(TempFileName,f.cFileName); + + if(f.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + DeleteFolder(TempFileName); + else + { + SetFileAttributes(TempFileName,FILE_ATTRIBUTE_NORMAL); + if(!DeleteFile(TempFileName)) + return 0; + } + + }while (FindNextFile (hFile, &f)); + FindClose (hFile); + } + return RemoveDirectory(FileName); +} +INT cmd_rmdir (LPTSTR cmd, LPTSTR param) +{ + TCHAR dir[MAX_PATH]; /* pointer to the directory to change to */ + char ch; + INT args; + LPTSTR *arg = NULL; + INT i; + BOOL RD_SUB = FALSE; + BOOL RD_QUIET = FALSE; + HANDLE hFile; + WIN32_FIND_DATA f; + INT res; + TCHAR szMsg[RC_STRING_MAX_SIZE]; + TCHAR szFullPath[MAX_PATH]; + + if (!_tcsncmp (param, _T("/?"), 2)) + { + ConOutResPaging(TRUE,STRING_RMDIR_HELP); + return 0; + } + + nErrorLevel = 0; + + arg = split (param, &args, FALSE); + + if (args == 0) + { + /* only command given */ + error_req_param_missing (); + freep (arg); + return 1; + } + + dir[0] = 0; + /* check for options anywhere in command line */ + for (i = 0; i < args; i++) + { + if (*arg[i] == _T('/')) + { + /*found a command, but check to make sure it has something after it*/ + if (_tcslen (arg[i]) == 2) + { + ch = _totupper (arg[i][1]); + if (ch == _T('S')) + { + RD_SUB = TRUE; + } + else if (ch == _T('Q')) + { + RD_QUIET = TRUE; + } + } + } + else + { + /* get the folder name */ + _tcscpy(dir,arg[i]); + } + } + + if (dir[0] == _T('\0')) + { + /* No folder to remove */ + ConErrResPuts(STRING_ERROR_REQ_PARAM_MISSING); + freep(arg); + return 1; + } + + GetFullPathName(dir,MAX_PATH,szFullPath,NULL); + /* remove trailing \ if any, but ONLY if dir is not the root dir */ + if (_tcslen (szFullPath) >= 2 && szFullPath[_tcslen (szFullPath) - 1] == _T('\\')) + szFullPath[_tcslen(szFullPath) - 1] = _T('\0'); + + if(RD_SUB) + { + /* ask if they want to delete evrything in the folder */ + if (!RD_QUIET) + { + LoadString( CMD_ModuleHandle, STRING_DEL_HELP2, szMsg, RC_STRING_MAX_SIZE); + res = FilePromptYNA (szMsg); + if ((res == PROMPT_NO) || (res == PROMPT_BREAK)) + { + freep(arg); + nErrorLevel = 1; + return 1; + } + } + + } + else + { + /* check for files in the folder */ + _tcscat(szFullPath,_T("\\*")); + + hFile = FindFirstFile(szFullPath, &f); + if (hFile != INVALID_HANDLE_VALUE) + { + do + { + if (!_tcscmp(f.cFileName,_T(".")) || + !_tcscmp(f.cFileName,_T(".."))) + continue; + ConOutResPuts(STRING_RMDIR_HELP2); + freep(arg); + FindClose (hFile); + nErrorLevel = 1; + return 1; + }while (FindNextFile (hFile, &f)); + FindClose (hFile); + } + /* reovme the \\* */ + szFullPath[_tcslen(szFullPath) - 2] = _T('\0'); + } + + if (!DeleteFolder(szFullPath)) + { + /* Couldnt delete the folder, clean up and print out the error */ + ErrorMessage (GetLastError(), _T("RD")); + freep (arg); + nErrorLevel = 1; + return 1; + } + + freep (arg); + return 0; +} +#endif + + +/* + * set the exitflag to true + * + */ +INT CommandExit (LPTSTR cmd, LPTSTR param) +{ + if (!_tcsncmp (param, _T("/?"), 2)) + { + ConOutResPaging(TRUE,STRING_EXIT_HELP); + /* Just make sure */ + bExit = FALSE; + /* Dont exit */ + return 0; + } + + if (bc != NULL && _tcsnicmp(param,_T("/b"),2) == 0) + { + param += 2; + while (_istspace (*param)) + param++; + if (_istdigit(*param)) + nErrorLevel = _ttoi(param); + ExitBatch (NULL); + } + + else + bExit = TRUE; + + + return 0; + +} + +#ifdef INCLUDE_CMD_REM +/* + * does nothing + * + */ +INT CommandRem (LPTSTR cmd, LPTSTR param) +{ + if (!_tcsncmp (param, _T("/?"), 2)) + { + ConOutResPaging(TRUE,STRING_REM_HELP); + } + + return 0; +} +#endif /* INCLUDE_CMD_REM */ + + +INT CommandShowCommands (LPTSTR cmd, LPTSTR param) +{ + PrintCommandList (); + return 0; +} + +INT CommandShowCommandsDetail (LPTSTR cmd, LPTSTR param) +{ + PrintCommandListDetail (); + return 0; +} + +/* EOF */ diff --git a/reactos/base/shell/cmd/label.c b/reactos/base/shell/cmd/label.c new file mode 100644 index 00000000000..670e0b3deb9 --- /dev/null +++ b/reactos/base/shell/cmd/label.c @@ -0,0 +1,129 @@ +/* + * LABEL.C - label internal command. + * + * + * History: + * + * 10-Dec-1998 (Eric Kohl ) + * Started. + * + * 11-Dec-1998 (Eric Kohl ) + * Finished. + * + * 19-Jan-1998 (Eric Kohl ) + * Unicode ready! + * + * 28-Apr-2005 (Magnus Olsen) ) + * Remove all hardcode string to En.rc + */ + +#include +#include "resource.h" + +#ifdef INCLUDE_CMD_LABEL + + +INT cmd_label (LPTSTR cmd, LPTSTR param) +{ + TCHAR szMsg[RC_STRING_MAX_SIZE]; + TCHAR szRootPath[] = _T("A:\\"); + TCHAR szLabel[80]; + TCHAR szOldLabel[80]; + DWORD dwSerialNr; + LPTSTR *arg; + INT args; + + /* set empty label string */ + szLabel[0] = _T('\0'); + + /* print help */ + if (!_tcsncmp (param, _T("/?"), 2)) + { + ConOutResPaging(TRUE,STRING_LABEL_HELP1); + return 0; + } + + nErrorLevel = 0; + + /* get parameters */ + arg = split (param, &args, FALSE); + + if (args > 2) + { + /* too many parameters */ + error_too_many_parameters (arg[args - 1]); + freep (arg); + nErrorLevel = 1; + return 1; + } + + if (args == 0) + { + /* get label of current drive */ + TCHAR szCurPath[MAX_PATH]; + GetCurrentDirectory (MAX_PATH, szCurPath); + szRootPath[0] = szCurPath[0]; + } + else + { + if ((_tcslen (arg[0]) >= 2) && (arg[0][1] == _T(':'))) + { + szRootPath[0] = toupper (*arg[0]); + if (args == 2) + _tcsncpy (szLabel, arg[1], 12); + } + else + { + TCHAR szCurPath[MAX_PATH]; + GetCurrentDirectory (MAX_PATH, szCurPath); + szRootPath[0] = szCurPath[0]; + _tcsncpy (szLabel, arg[0], 12); + } + } + + /* check root path */ + if (!IsValidPathName (szRootPath)) + { + error_invalid_drive (); + freep (arg); + nErrorLevel = 1; + return 1; + } + + GetVolumeInformation(szRootPath, szOldLabel, 80, &dwSerialNr, + NULL, NULL, NULL, 0); + + /* print drive info */ + if (szOldLabel[0] != _T('\0')) + { + LoadString(CMD_ModuleHandle, STRING_LABEL_HELP2, szMsg, RC_STRING_MAX_SIZE); + ConOutPrintf(szMsg, _totupper(szRootPath[0]), szOldLabel); + } + else + { + LoadString(CMD_ModuleHandle, STRING_LABEL_HELP3, szMsg, RC_STRING_MAX_SIZE); + ConOutPrintf(szMsg, _totupper(szRootPath[0])); + } + + /* print the volume serial number */ + LoadString(CMD_ModuleHandle, STRING_LABEL_HELP4, szMsg, RC_STRING_MAX_SIZE); + ConOutPrintf(szMsg, HIWORD(dwSerialNr), LOWORD(dwSerialNr)); + + if (szLabel[0] == _T('\0')) + { + LoadString(CMD_ModuleHandle, STRING_LABEL_HELP5, szMsg, RC_STRING_MAX_SIZE); + ConOutResPuts(STRING_LABEL_HELP5); + + ConInString(szLabel, 80); + } + + SetVolumeLabel(szRootPath, szLabel); + + freep(arg); + + return 0; +} + +#endif /* INCLUDE_CMD_LABEL */ + +/* EOF */ diff --git a/reactos/base/shell/cmd/license.txt b/reactos/base/shell/cmd/license.txt new file mode 100644 index 00000000000..c4fb365c774 --- /dev/null +++ b/reactos/base/shell/cmd/license.txt @@ -0,0 +1,342 @@ + + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 675 Mass Ave, Cambridge, MA 02139, USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + Appendix: How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) 19yy + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) 19yy name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. + + diff --git a/reactos/base/shell/cmd/locale.c b/reactos/base/shell/cmd/locale.c new file mode 100644 index 00000000000..fe77f67699e --- /dev/null +++ b/reactos/base/shell/cmd/locale.c @@ -0,0 +1,81 @@ +/* + * LOCALE.C - locale handling. + * + * + * History: + * + * 09-Jan-1999 (Eric Kohl ) + * Started. + * + * 20-Jan-1999 (Eric Kohl ) + * Unicode safe! + */ + +#include +#include "resource.h" + + +TCHAR cDateSeparator; +TCHAR cTimeSeparator; +TCHAR cThousandSeparator; +TCHAR cDecimalSeparator; +INT nDateFormat; +INT nTimeFormat; +INT nNumberGroups; + + +VOID InitLocale (VOID) +{ + TCHAR szBuffer[256]; + + /* date settings */ + GetLocaleInfo (LOCALE_USER_DEFAULT, LOCALE_SDATE, szBuffer, sizeof(szBuffer) / sizeof(szBuffer[0])); + cDateSeparator = szBuffer[0]; + GetLocaleInfo (LOCALE_USER_DEFAULT, LOCALE_IDATE | LOCALE_RETURN_NUMBER, (LPTSTR)&nDateFormat, sizeof(nDateFormat) / sizeof(TCHAR)); + + /* time settings */ + GetLocaleInfo (LOCALE_USER_DEFAULT, LOCALE_STIME, szBuffer, sizeof(szBuffer) / sizeof(szBuffer[0])); + cTimeSeparator = szBuffer[0]; + GetLocaleInfo (LOCALE_USER_DEFAULT, LOCALE_ITIME | LOCALE_RETURN_NUMBER, (LPTSTR)&nTimeFormat, sizeof(nTimeFormat) / sizeof(TCHAR)); + + /* number settings */ + GetLocaleInfo (LOCALE_USER_DEFAULT, LOCALE_STHOUSAND, szBuffer, sizeof(szBuffer) / sizeof(szBuffer[0])); + cThousandSeparator = szBuffer[0]; + GetLocaleInfo (LOCALE_USER_DEFAULT, LOCALE_SDECIMAL, szBuffer, sizeof(szBuffer) / sizeof(szBuffer[0])); + cDecimalSeparator = szBuffer[0]; + GetLocaleInfo (LOCALE_USER_DEFAULT, LOCALE_SGROUPING, szBuffer, sizeof(szBuffer) / sizeof(szBuffer[0])); + nNumberGroups = _ttoi(szBuffer); +#if 0 + /* days of week */ + for (i = 0; i < 7; i++) + { + GetLocaleInfo (LOCALE_USER_DEFAULT, LOCALE_SABBREVDAYNAME1 + i, szBuffer, sizeof(szBuffer) / sizeof(szBuffer[0])); + _tcscpy (aszDayNames[(i+1)%7], szBuffer); /* little hack */ + } +#endif +} + + +VOID PrintDate (VOID) +{ + TCHAR szDateDay[32]; + TCHAR szDate[32]; + + GetDateFormat(LOCALE_USER_DEFAULT, 0, NULL, _T("ddd"), szDateDay, sizeof (szDateDay)); + + GetDateFormat(LOCALE_USER_DEFAULT, DATE_SHORTDATE, NULL, NULL,szDate, sizeof (szDate)); + ConOutPrintf(_T("%s %s"),szDateDay, szDate); +} + + +VOID PrintTime (VOID) +{ + TCHAR szMsg[RC_STRING_MAX_SIZE]; + SYSTEMTIME t; + GetLocalTime(&t); + + LoadString(CMD_ModuleHandle, STRING_LOCALE_HELP1, szMsg, RC_STRING_MAX_SIZE); + ConOutPrintf(_T("%s: %02d%c%02d%c%02d%c%02d\n"), szMsg, t.wHour, cTimeSeparator, + t.wMinute , cTimeSeparator, + t.wSecond , cDecimalSeparator, t.wMilliseconds ); +} diff --git a/reactos/base/shell/cmd/main.c b/reactos/base/shell/cmd/main.c new file mode 100644 index 00000000000..85bb80b7542 --- /dev/null +++ b/reactos/base/shell/cmd/main.c @@ -0,0 +1,26 @@ +#include +#include "resource.h" + +#ifdef _UNICODE +extern int _main (void); +#else +extern int _main (int argc, char *argv[]); +#endif + +/* + * main function + */ +#ifdef _UNICODE +int main(void) +#else +int main (int argc, char *argv[]) +#endif +{ +#ifdef _UNICODE + return _main(); +#else + return _main(argc, argv); +#endif +} + +/* EOF */ diff --git a/reactos/base/shell/cmd/memory.c b/reactos/base/shell/cmd/memory.c new file mode 100644 index 00000000000..2a917ffd8d1 --- /dev/null +++ b/reactos/base/shell/cmd/memory.c @@ -0,0 +1,97 @@ +/* + * MEMORY.C - internal command. + * + * + * History: + * + * 01-Sep-1999 (Eric Kohl) + * Started. + * + * 28-Apr-2005 (Magnus Olsen) ) + * Remove all hardcode string to En.rc + */ + +#include +#include "resource.h" + +#ifdef INCLUDE_CMD_MEMORY + + +/* + * convert + * + * insert commas into a number + */ +static INT +ConvertDWord (DWORD num, LPTSTR des, INT len, BOOL bSeparator) +{ + TCHAR temp[32]; + INT c = 0; + INT n = 0; + + if (num == 0) + { + des[0] = _T('0'); + des[1] = _T('\0'); + n = 1; + } + else + { + temp[31] = 0; + while (num > 0) + { + if (bSeparator && (((c + 1) % (nNumberGroups + 1)) == 0)) + temp[30 - c++] = cThousandSeparator; + temp[30 - c++] = (TCHAR)(num % 10) + _T('0'); + num /= 10; + } + + for (n = 0; n <= c; n++) + des[n] = temp[31 - c + n]; + } + + return n; +} + + +INT CommandMemory (LPTSTR cmd, LPTSTR param) +{ + TCHAR szMsg[RC_STRING_MAX_SIZE]; + MEMORYSTATUS ms; + TCHAR szMemoryLoad[20]; + TCHAR szTotalPhys[20]; + TCHAR szAvailPhys[20]; + TCHAR szTotalPageFile[20]; + TCHAR szAvailPageFile[20]; + TCHAR szTotalVirtual[20]; + TCHAR szAvailVirtual[20]; + + if (!_tcsncmp (param, _T("/?"), 2)) + { + ConOutResPaging(TRUE,STRING_MEMMORY_HELP1); + return 0; + } + + ms.dwLength = sizeof(MEMORYSTATUS); + + GlobalMemoryStatus (&ms); + + ConvertDWord (ms.dwMemoryLoad, szMemoryLoad, 20, FALSE); + ConvertDWord (ms.dwTotalPhys, szTotalPhys, 20, TRUE); + ConvertDWord (ms.dwAvailPhys, szAvailPhys, 20, TRUE); + ConvertDWord (ms.dwTotalPageFile, szTotalPageFile, 20, TRUE); + ConvertDWord (ms.dwAvailPageFile, szAvailPageFile, 20, TRUE); + ConvertDWord (ms.dwTotalVirtual, szTotalVirtual, 20, TRUE); + ConvertDWord (ms.dwAvailVirtual, szAvailVirtual, 20, TRUE); + + LoadString(CMD_ModuleHandle, STRING_MEMMORY_HELP2, szMsg, RC_STRING_MAX_SIZE); + ConOutPrintf(szMsg, + szMemoryLoad, szTotalPhys, szAvailPhys, szTotalPageFile, + szAvailPageFile, szTotalVirtual, szAvailVirtual); + + return 0; +} + +#endif /* INCLUDE_CMD_MEMORY */ + +/* EOF */ diff --git a/reactos/base/shell/cmd/misc.c b/reactos/base/shell/cmd/misc.c new file mode 100644 index 00000000000..38843619a1e --- /dev/null +++ b/reactos/base/shell/cmd/misc.c @@ -0,0 +1,659 @@ +/* + * MISC.C - misc. functions. + * + * + * History: + * + * 07/12/98 (Rob Lake) + * started + * + * 07/13/98 (Rob Lake) + * moved functions in here + * + * 27-Jul-1998 (John P Price ) + * added config.h include + * + * 18-Dec-1998 (Eric Kohl ) + * Changed split() to accept quoted arguments. + * Removed parse_firstarg(). + * + * 23-Jan-1999 (Eric Kohl ) + * Fixed an ugly bug in split(). In rare cases (last character + * of the string is a space) it ignored the NULL character and + * tried to add the following to the argument list. + * + * 28-Jan-1999 (Eric Kohl ) + * FileGetString() seems to be working now. + * + * 06-Nov-1999 (Eric Kohl ) + * Added PagePrompt() and FilePrompt(). + * + * 30-Apr-2005 (Magnus Olsen) ) + * Remove all hardcode string to En.rc + */ + +#include +#include "resource.h" + + +/* + * get a character out-of-band and honor Ctrl-Break characters + */ +TCHAR cgetchar (VOID) +{ + HANDLE hInput = GetStdHandle (STD_INPUT_HANDLE); + INPUT_RECORD irBuffer; + DWORD dwRead; +/* + do + { + ReadConsoleInput (hInput, &irBuffer, 1, &dwRead); + if ((irBuffer.EventType == KEY_EVENT) && + (irBuffer.Event.KeyEvent.bKeyDown == TRUE)) + { + if ((irBuffer.Event.KeyEvent.dwControlKeyState & + (LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED)) & + (irBuffer.Event.KeyEvent.wVirtualKeyCode == 'C')) + bCtrlBreak = TRUE; + + break; + } + } + while (TRUE); +*/ + do + { + ReadConsoleInput (hInput, &irBuffer, 1, &dwRead); + + if (irBuffer.EventType == KEY_EVENT) + { + if (irBuffer.Event.KeyEvent.dwControlKeyState & + (LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED)) + { + if (irBuffer.Event.KeyEvent.wVirtualKeyCode == 'C') + { +// if (irBuffer.Event.KeyEvent.bKeyDown == TRUE) +// { + bCtrlBreak = TRUE; + break; +// } + } + } + else if ((irBuffer.Event.KeyEvent.wVirtualKeyCode == VK_SHIFT) || + (irBuffer.Event.KeyEvent.wVirtualKeyCode == VK_MENU) || + (irBuffer.Event.KeyEvent.wVirtualKeyCode == VK_CONTROL)) + { + ; + } + + else + { + break; + } + } + } + while (TRUE); + +#ifndef _UNICODE + return irBuffer.Event.KeyEvent.uChar.AsciiChar; +#else + return irBuffer.Event.KeyEvent.uChar.UnicodeChar; +#endif /* _UNICODE */ +} + +/* + * Takes a path in and returns it with the correct case of the letters + */ +VOID GetPathCase( TCHAR * Path, TCHAR * OutPath) +{ + INT i = 0; + TCHAR TempPath[MAX_PATH]; + WIN32_FIND_DATA FindFileData; + HANDLE hFind; + _tcscpy(TempPath, _T("")); + _tcscpy(OutPath, _T("")); + + + for(i = 0; i < _tcslen(Path); i++) + { + if(Path[i] != _T('\\')) + { + _tcsncat(TempPath, &Path[i], 1); + if(i != _tcslen(Path) - 1) + continue; + } + /* Handle the base part of the path different. + Because if you put it into findfirstfile, it will + return your current folder */ + if(_tcslen(TempPath) == 2 && TempPath[1] == _T(':')) + { + _tcscat(OutPath, TempPath); + _tcscat(OutPath, _T("\\")); + _tcscat(TempPath, _T("\\")); + } + else + { + hFind = FindFirstFile(TempPath,&FindFileData); + if(hFind == INVALID_HANDLE_VALUE) + { + _tcscpy(OutPath, Path); + return; + } + _tcscat(TempPath, _T("\\")); + _tcscat(OutPath, FindFileData.cFileName); + _tcscat(OutPath, _T("\\")); + CloseHandle(hFind); + } + } +} + +/* + * Check if Ctrl-Break was pressed during the last calls + */ + +BOOL CheckCtrlBreak (INT mode) +{ + static BOOL bLeaveAll = FALSE; /* leave all batch files */ + TCHAR c; + + switch (mode) + { + case BREAK_OUTOFBATCH: + bLeaveAll = 0; + return FALSE; + + case BREAK_BATCHFILE: + if (bLeaveAll) + return TRUE; + + if (!bCtrlBreak) + return FALSE; + + /* we need to be sure the string arrives on the screen! */ + do + ConOutPuts (_T("\r\nCtrl-Break pressed. Cancel batch file? (Yes/No/All) ")); + while (!_tcschr (_T("YNA\3"), c = _totupper (cgetchar())) || !c); + + ConOutPuts (_T("\r\n")); + + if (c == _T('N')) + return bCtrlBreak = FALSE; /* ignore */ + + /* leave all batch files */ + bLeaveAll = ((c == _T('A')) || (c == _T('\3'))); + break; + + case BREAK_INPUT: + if (!bCtrlBreak) + return FALSE; + break; + } + + /* state processed */ + bCtrlBreak = FALSE; + return TRUE; +} + +/* add new entry for new argument */ +BOOL add_entry (LPINT ac, LPTSTR **arg, LPCTSTR entry) +{ + LPTSTR q; + LPTSTR *oldarg; + + q = malloc ((_tcslen(entry) + 1) * sizeof (TCHAR)); + if (NULL == q) + { + return FALSE; + } + _tcscpy (q, entry); + + oldarg = *arg; + *arg = realloc (oldarg, (*ac + 2) * sizeof (LPTSTR)); + if (NULL == *arg) + { + *arg = oldarg; + return FALSE; + } + + /* save new entry */ + (*arg)[*ac] = q; + (*arg)[++(*ac)] = NULL; + + return TRUE; +} + +static BOOL expand (LPINT ac, LPTSTR **arg, LPCTSTR pattern) +{ + HANDLE hFind; + WIN32_FIND_DATA FindData; + BOOL ok; + LPCTSTR pathend; + LPTSTR dirpart, fullname; + + pathend = _tcsrchr (pattern, _T('\\')); + if (NULL != pathend) + { + dirpart = malloc((pathend - pattern + 2) * sizeof(TCHAR)); + if (NULL == dirpart) + { + return FALSE; + } + memcpy(dirpart, pattern, pathend - pattern + 1); + dirpart[pathend - pattern + 1] = _T('\0'); + } + else + { + dirpart = NULL; + } + hFind = FindFirstFile (pattern, &FindData); + if (INVALID_HANDLE_VALUE != hFind) + { + do + { + if (NULL != dirpart) + { + fullname = malloc((_tcslen(dirpart) + _tcslen(FindData.cFileName) + 1) * sizeof(TCHAR)); + if (NULL == fullname) + { + ok = FALSE; + } + else + { + _tcscat (_tcscpy (fullname, dirpart), FindData.cFileName); + ok = add_entry(ac, arg, fullname); + free (fullname); + } + } + else + { + ok = add_entry(ac, arg, FindData.cFileName); + } + } while (FindNextFile (hFind, &FindData) && ok); + FindClose (hFind); + } + else + { + ok = add_entry(ac, arg, pattern); + } + + if (NULL != dirpart) + { + free (dirpart); + } + + return ok; +} + +/* + * split - splits a line up into separate arguments, deliminators + * are spaces and slashes ('/'). + */ + +LPTSTR *split (LPTSTR s, LPINT args, BOOL expand_wildcards) +{ + LPTSTR *arg; + LPTSTR start; + LPTSTR q; + INT ac; + INT len; + BOOL bQuoted = FALSE; + + arg = malloc (sizeof (LPTSTR)); + if (!arg) + return NULL; + *arg = NULL; + + ac = 0; + while (*s) + { + /* skip leading spaces */ + while (*s && (_istspace (*s) || _istcntrl (*s))) + ++s; + + /* if quote (") then set bQuoted */ + if (*s == _T('\"')) + { + ++s; + bQuoted = TRUE; + } + + start = s; + + /* the first character can be '/' */ + if (*s == _T('/')) + ++s; + + /* skip to next word delimiter or start of next option */ + if (bQuoted) + { + while (_istprint (*s) && (*s != _T('\"')) && (*s != _T('/'))) + ++s; + } + else + { + while (_istprint (*s) && !_istspace (*s) && (*s != _T('/'))) + ++s; + } + + /* a word was found */ + if (s != start) + { + q = malloc (((len = s - start) + 1) * sizeof (TCHAR)); + if (!q) + { + return NULL; + } + memcpy (q, start, len * sizeof (TCHAR)); + q[len] = _T('\0'); + if (expand_wildcards && _T('/') != *start && + (NULL != _tcschr(q, _T('*')) || NULL != _tcschr(q, _T('?')))) + { + if (! expand(&ac, &arg, q)) + { + free (q); + freep (arg); + return NULL; + } + } + else + { + if (! add_entry(&ac, &arg, q)) + { + free (q); + freep (arg); + return NULL; + } + } + free (q); + } + + /* adjust string pointer if quoted (") */ + if (bQuoted) + { + /* Check to make sure if there is no ending " + * we dont run over the null char */ + if(*s == _T('\0')) + { + break; + } + ++s; + bQuoted = FALSE; + } + } + + *args = ac; + + return arg; +} + + +/* + * freep -- frees memory used for a call to split + * + */ +VOID freep (LPTSTR *p) +{ + LPTSTR *q; + + if (!p) + return; + + q = p; + while (*q) + free(*q++); + + free(p); +} + + +LPTSTR _stpcpy (LPTSTR dest, LPCTSTR src) +{ + _tcscpy (dest, src); + return (dest + _tcslen (src)); +} + + + +/* + * Checks if a path is valid (accessible) + */ + +BOOL IsValidPathName (LPCTSTR pszPath) +{ + TCHAR szOldPath[MAX_PATH]; + BOOL bResult; + + GetCurrentDirectory (MAX_PATH, szOldPath); + bResult = SetCurrentDirectory (pszPath); + + SetCurrentDirectory (szOldPath); + + return bResult; +} + + +/* + * Checks if a file exists (accessible) + */ + +BOOL IsExistingFile (LPCTSTR pszPath) +{ + DWORD attr = GetFileAttributes (pszPath); + return (attr != 0xFFFFFFFF && (! (attr & FILE_ATTRIBUTE_DIRECTORY)) ); +} + + +BOOL IsExistingDirectory (LPCTSTR pszPath) +{ + DWORD attr = GetFileAttributes (pszPath); + return (attr != 0xFFFFFFFF && (attr & FILE_ATTRIBUTE_DIRECTORY) ); +} + + +BOOL FileGetString (HANDLE hFile, LPTSTR lpBuffer, INT nBufferLength) +{ + LPSTR lpString; + CHAR ch; + DWORD dwRead; + INT len; +#ifdef _UNICODE + lpString = malloc(nBufferLength); +#else + lpString = lpBuffer; +#endif + len = 0; + while ((--nBufferLength > 0) && + ReadFile(hFile, &ch, 1, &dwRead, NULL) && dwRead) + { + lpString[len++] = ch; + if ((ch == _T('\n')) || (ch == _T('\r'))) + { + /* break at new line*/ + break; + } + } + + if (!dwRead && !len) + return FALSE; + + lpString[len++] = _T('\0'); +#ifdef _UNICODE + MultiByteToWideChar(CP_ACP, 0, lpString, len, lpBuffer, len); + free(lpString); +#endif + return TRUE; +} + +INT PagePrompt (VOID) +{ + INPUT_RECORD ir; + + ConOutResPuts(STRING_MISC_HELP1); + + RemoveBreakHandler (); + ConInDisable (); + + do + { + ConInKey (&ir); + } + while ((ir.Event.KeyEvent.wVirtualKeyCode == VK_SHIFT) || + (ir.Event.KeyEvent.wVirtualKeyCode == VK_MENU) || + (ir.Event.KeyEvent.wVirtualKeyCode == VK_CONTROL)); + + AddBreakHandler (); + ConInEnable (); + + if ((ir.Event.KeyEvent.wVirtualKeyCode == VK_ESCAPE) || + ((ir.Event.KeyEvent.wVirtualKeyCode == _T('C')) && + (ir.Event.KeyEvent.dwControlKeyState & (LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED)))) + { + bCtrlBreak = TRUE; + return PROMPT_BREAK; + } + + return PROMPT_YES; +} + + +INT FilePromptYN (LPTSTR szFormat, ...) +{ + TCHAR szMsg[RC_STRING_MAX_SIZE]; + TCHAR szOut[512]; + va_list arg_ptr; +// TCHAR cKey = 0; +// LPTSTR szKeys = _T("yna"); + + TCHAR szIn[10]; + LPTSTR p; + + va_start (arg_ptr, szFormat); + _vstprintf (szOut, szFormat, arg_ptr); + va_end (arg_ptr); + + ConOutPrintf (szFormat); + + /* preliminary fix */ + ConInString (szIn, 10); + ConOutPrintf (_T("\n")); + + _tcsupr (szIn); + for (p = szIn; _istspace (*p); p++) + ; + + LoadString(CMD_ModuleHandle, STRING_CHOICE_OPTION, szMsg, RC_STRING_MAX_SIZE); + + if (_tcsncmp(p, &szMsg[0], 1) == 0) + return PROMPT_YES; + else if (_tcsncmp(p, &szMsg[1], 1) == 0) + return PROMPT_NO; +#if 0 + else if (*p == _T('\03')) + return PROMPT_BREAK; +#endif + + return PROMPT_NO; + + + /* unfinished sollution */ +#if 0 + RemoveBreakHandler (); + ConInDisable (); + + do + { + ConInKey (&ir); + cKey = _totlower (ir.Event.KeyEvent.uChar.AsciiChar); + if (_tcschr (szKeys, cKey[0]) == NULL) + cKey = 0; + + + } + while ((ir.Event.KeyEvent.wVirtualKeyCode == VK_SHIFT) || + (ir.Event.KeyEvent.wVirtualKeyCode == VK_MENU) || + (ir.Event.KeyEvent.wVirtualKeyCode == VK_CONTROL)); + + AddBreakHandler (); + ConInEnable (); + + if ((ir.Event.KeyEvent.wVirtualKeyCode == VK_ESCAPE) || + ((ir.Event.KeyEvent.wVirtualKeyCode == 'C') && + (ir.Event.KeyEvent.dwControlKeyState & (LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED)))) + return PROMPT_BREAK; + + return PROMPT_YES; +#endif +} + + +INT FilePromptYNA (LPTSTR szFormat, ...) +{ + TCHAR szMsg[RC_STRING_MAX_SIZE]; + TCHAR szOut[512]; + va_list arg_ptr; +// TCHAR cKey = 0; +// LPTSTR szKeys = _T("yna"); + + TCHAR szIn[10]; + LPTSTR p; + + va_start (arg_ptr, szFormat); + _vstprintf (szOut, szFormat, arg_ptr); + va_end (arg_ptr); + + ConOutPrintf (szFormat); + + /* preliminary fix */ + ConInString (szIn, 10); + ConOutPrintf (_T("\n")); + + _tcsupr (szIn); + for (p = szIn; _istspace (*p); p++) + ; + + LoadString( CMD_ModuleHandle, STRING_COPY_OPTION, szMsg, RC_STRING_MAX_SIZE); + + if (_tcsncmp(p, &szMsg[0], 1) == 0) + return PROMPT_YES; + else if (_tcsncmp(p, &szMsg[1], 1) == 0) + return PROMPT_NO; + else if (_tcsncmp(p, &szMsg[2], 1) == 0) + return PROMPT_ALL; + +#if 0 + else if (*p == _T('\03')) + return PROMPT_BREAK; +#endif + + return PROMPT_NO; + + +/* unfinished sollution */ +#if 0 + RemoveBreakHandler (); + ConInDisable (); + + do + { + ConInKey (&ir); + cKey = _totlower (ir.Event.KeyEvent.uChar.AsciiChar); + if (_tcschr (szKeys, cKey[0]) == NULL) + cKey = 0; + } + while ((ir.Event.KeyEvent.wVirtualKeyCode == VK_SHIFT) || + (ir.Event.KeyEvent.wVirtualKeyCode == VK_MENU) || + (ir.Event.KeyEvent.wVirtualKeyCode == VK_CONTROL)); + + AddBreakHandler (); + ConInEnable (); + + if ((ir.Event.KeyEvent.wVirtualKeyCode == VK_ESCAPE) || + ((ir.Event.KeyEvent.wVirtualKeyCode == _T('C')) && + (ir.Event.KeyEvent.dwControlKeyState & (LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED)))) + return PROMPT_BREAK; + + return PROMPT_YES; +#endif +} + +/* EOF */ diff --git a/reactos/base/shell/cmd/move.c b/reactos/base/shell/cmd/move.c new file mode 100644 index 00000000000..fe3e942f81a --- /dev/null +++ b/reactos/base/shell/cmd/move.c @@ -0,0 +1,556 @@ +/* +* MOVE.C - move internal command. +* +* +* History: +* +* 14-Dec-1998 (Eric Kohl ) +* Started. +* +* 18-Jan-1999 (Eric Kohl ) +* Unicode safe! +* Preliminary version!!! +* +* 20-Jan-1999 (Eric Kohl ) +* Redirection safe! +* +* 27-Jan-1999 (Eric Kohl ) +* Added help text ("/?"). +* Added more error checks. +* +* 03-Feb-1999 (Eric Kohl ) +* Added "/N" option. +* +* 30-Apr-2005 (Magnus Olsen) ) +* Remove all hardcode string to En.rc +* +* 24-Jun-2005 (Brandon Turner) ) +* Fixed bug to allow MS style wildcards + code clean up +* added /y and /-y +*/ + +#include +#include "resource.h" + +#ifdef INCLUDE_CMD_MOVE + +enum +{ + MOVE_NOTHING = 0x001, /* /N */ + MOVE_OVER_YES = 0x002, /* /Y */ + MOVE_OVER_NO = 0x004, /* /-Y */ +}; + +enum +{ /* Move status flags */ + MOVE_SOURCE_IS_DIR = 0x001, + MOVE_SOURCE_IS_FILE = 0x002, + MOVE_DEST_IS_DIR = 0x004, + MOVE_DEST_IS_FILE = 0x008, + MOVE_SOURCE_HAS_WILD = 0x010, /* source has wildcard */ + MOVE_SRC_CURRENT_IS_DIR = 0x020, /* source is file but at the current round we found a directory */ + MOVE_DEST_EXISTS = 0x040, + MOVE_PATHS_ON_DIF_VOL = 0x080 /* source and destination paths are on different volume */ +}; + +static INT MoveOverwrite (LPTSTR fn) +{ + /*ask the user if they want to override*/ + TCHAR szMsg[RC_STRING_MAX_SIZE]; + INT res; + LoadString(CMD_ModuleHandle, STRING_MOVE_HELP1, szMsg, RC_STRING_MAX_SIZE); + ConOutPrintf(szMsg,fn); + res = FilePromptYNA (_T("")); + return res; +} + +void GetDirectory (LPTSTR wholepath, LPTSTR directory, BOOL CheckExisting) +{ + /* returns only directory part of path with backslash */ + /* TODO: make code unc aware */ + /* Is there a better alternative to this? */ + LPTSTR last; + if (CheckExisting && IsExistingDirectory(wholepath)) + { + _tcscpy(directory, wholepath); + } + else if ((last = _tcsrchr(wholepath,_T('\\'))) != NULL) + { + _tcsncpy(directory, wholepath, last - wholepath + 1); + directory[last - wholepath + 1] = 0; + } + else + { + GetRootPath(wholepath,directory, MAX_PATH); + } +} + + +INT cmd_move (LPTSTR cmd, LPTSTR param) +{ + TCHAR szMsg[RC_STRING_MAX_SIZE]; + LPTSTR *arg; + INT argc, i, nFiles; + TCHAR szDestPath[MAX_PATH]; + TCHAR szFullDestPath[MAX_PATH]; + TCHAR szSrcDirPath[MAX_PATH]; + TCHAR szSrcPath[MAX_PATH]; + TCHAR szFullSrcPath[MAX_PATH]; + DWORD dwFlags = 0; + INT nOverwrite = 0; + WIN32_FIND_DATA findBuffer; + HANDLE hFile; + + /* used only when source and destination directories are on different volume*/ + HANDLE hDestFile; + WIN32_FIND_DATA findDestBuffer; + TCHAR szMoveDest[MAX_PATH]; + TCHAR szMoveSrc[MAX_PATH]; + LPTSTR pszDestDirPointer; + LPTSTR pszSrcDirPointer; + INT nDirLevel = 0; + + LPTSTR pszFile; + BOOL OnlyOneFile; + BOOL FoundFile; + BOOL MoveStatus; + DWORD dwMoveFlags = 0; + DWORD dwMoveStatusFlags = 0; + + + if (!_tcsncmp (param, _T("/?"), 2)) + { +#if 0 + ConOutPuts (_T("Moves files and renames files and directories.\n\n" + "To move one or more files:\n" + "MOVE [/N][/Y|/-Y][drive:][path]filename1[,...] destination\n" + "\n" + "To rename a directory:\n" + "MOVE [/N][/Y|/-Y][drive:][path]dirname1 dirname2\n" + "\n" + " [drive:][path]filename1 Specifies the location and name of the file\n" + " or files you want to move.\n" + " /N Nothing. Don everthing but move files or direcories.\n" + " /Y\n" + " /-Y\n" + "...")); +#else + ConOutResPaging(TRUE,STRING_MOVE_HELP2); +#endif + return 0; + } + + nErrorLevel = 0; + arg = split (param, &argc, FALSE); + nFiles = argc; + + /* read options */ + for (i = 0; i < argc; i++) + { + if (*arg[i] == _T('/')) + { + if (_tcslen(arg[i]) >= 2) + { + switch (_totupper(arg[i][1])) + { + case _T('N'): + dwFlags |= MOVE_NOTHING; + break; + + case _T('Y'): + dwFlags |= MOVE_OVER_YES; + break; + + case _T('-'): + dwFlags |= MOVE_OVER_NO; + break; + } + } + nFiles--; + } + } + + if (nFiles < 2) + { + /* there must be at least two pathspecs */ + error_req_param_missing (); + return 1; + } + + /* check for wildcards in source and destination */ + if (_tcschr (arg[argc - 1], _T('*')) != NULL || _tcschr (arg[argc - 1], _T('?')) != NULL) + { + /* '*'/'?' in dest, this doesnt happen. give folder name instead*/ + error_invalid_parameter_format(arg[argc - 1]); + return 1; + } + if (_tcschr (arg[argc - 2], _T('*')) != NULL || _tcschr (arg[argc - 2], _T('?')) != NULL) + { + dwMoveStatusFlags |= MOVE_SOURCE_HAS_WILD; + } + + + /* get destination */ + GetFullPathName (arg[argc - 1], MAX_PATH, szDestPath, NULL); +#ifdef _DEBUG + DebugPrintf (_T("Destination: %s\n"), szDestPath); +#endif + + /* get source folder */ + GetDirectory(arg[argc - 2], szSrcDirPath, 1); + GetFullPathName(szSrcDirPath, MAX_PATH, szSrcPath, &pszFile); + _tcscpy(szSrcDirPath,szSrcPath); + /* we need following check to see if source happens to be directly given directory + and if it is then rip off last directory part so that there won't be any clashes with codes after this point */ + GetFullPathName(arg[argc - 2], MAX_PATH, szSrcPath, &pszFile); + if (_tcscmp(szSrcDirPath,szSrcPath) == 0) + szSrcDirPath[pszFile - szSrcPath] = _T('\0'); +#ifdef _DEBUG + DebugPrintf (_T("Source Folder: %s\n"), szSrcDirPath); +#endif + + hFile = FindFirstFile (arg[argc - 2], &findBuffer); + if (hFile == INVALID_HANDLE_VALUE) + { + ErrorMessage (GetLastError (), arg[argc - 2]); + freep (arg); + return 1; + + } + + /* check for special cases "." and ".." and if found skip them */ + FoundFile = TRUE; + while(FoundFile && + (_tcscmp(findBuffer.cFileName,_T(".")) == 0 || + _tcscmp(findBuffer.cFileName,_T("..")) == 0)) + FoundFile = FindNextFile (hFile, &findBuffer); + + if (!FoundFile) + { + /* what? we don't have anything to move? */ + error_file_not_found(); + FindClose(hFile); + freep(arg); + return 1; + } + + OnlyOneFile = TRUE; + _tcscpy(szSrcPath,szSrcDirPath); + /*check to see if there is an ending slash, if not add one*/ + if(szSrcPath[_tcslen(szSrcPath) - 1] != _T('\\')) + _tcscat (szSrcPath, _T("\\")); + _tcscat(szSrcPath,findBuffer.cFileName); +#ifdef _DEBUG + DebugPrintf (_T("Source Path: %s\n"), szSrcPath); +#endif + /* check if there can be found files as files have first priority */ + if (IsExistingFile(szSrcPath)) dwMoveStatusFlags |= MOVE_SOURCE_IS_FILE; + else dwMoveStatusFlags |= MOVE_SOURCE_IS_DIR; + while(OnlyOneFile && FindNextFile(hFile,&findBuffer)) + { + _tcscpy(szSrcPath,szSrcDirPath); + if(szSrcPath[_tcslen(szSrcPath) - 1] != _T('\\')) + _tcscat (szSrcPath, _T("\\")); + _tcscat(szSrcPath,findBuffer.cFileName); + if (IsExistingFile(szSrcPath)) + { + ConOutPrintf(_T("")); + if (dwMoveStatusFlags & MOVE_SOURCE_IS_FILE) OnlyOneFile = FALSE; + else + { /* this has been done this way so that we don't disturb other settings if they have been set before this */ + dwMoveStatusFlags |= MOVE_SOURCE_IS_FILE; + dwMoveStatusFlags &= ~MOVE_SOURCE_IS_DIR; + } + } + } + FindClose(hFile); + +#ifdef _DEBUG + DebugPrintf(_T("Do we have only one file: %s\n"), OnlyOneFile ? _T("TRUE") : _T("FALSE")); +#endif + + /* we have to start again to be sure we don't miss any files or folders*/ + hFile = FindFirstFile (arg[argc - 2], &findBuffer); + if (hFile == INVALID_HANDLE_VALUE) + { + ErrorMessage (GetLastError (), arg[argc - 2]); + freep (arg); + return 1; + + } + + /* check for special cases "." and ".." and if found skip them */ + FoundFile = TRUE; + while(FoundFile && + (_tcscmp(findBuffer.cFileName,_T(".")) == 0 || + _tcscmp(findBuffer.cFileName,_T("..")) == 0)) + FoundFile = FindNextFile (hFile, &findBuffer); + + if (!FoundFile) + { + /* huh? somebody removed files and/or folders which were there */ + error_file_not_found(); + FindClose(hFile); + freep(arg); + return 1; + } + + /* check if source and destination paths are on different volumes */ + if (szSrcPath[0] != szDestPath[0]) + dwMoveStatusFlags |= MOVE_PATHS_ON_DIF_VOL; + + /* move it */ + do + { +#ifdef _DEBUG + DebugPrintf (_T("Found file/directory: %s\n"), findBuffer.cFileName); +#endif + nOverwrite = 1; + dwMoveFlags = 0; + dwMoveStatusFlags &= ~MOVE_DEST_IS_FILE & + ~MOVE_DEST_IS_DIR & + ~MOVE_SRC_CURRENT_IS_DIR & + ~MOVE_DEST_EXISTS; + _tcscpy(szFullSrcPath,szSrcDirPath); + if(szFullSrcPath[_tcslen(szFullSrcPath) - 1] != _T('\\')) + _tcscat (szFullSrcPath, _T("\\")); + _tcscat(szFullSrcPath,findBuffer.cFileName); + _tcscpy(szSrcPath, szFullSrcPath); + + if (IsExistingDirectory(szSrcPath)) + { + /* source is directory */ + + if (dwMoveStatusFlags & MOVE_SOURCE_IS_FILE) + { + dwMoveStatusFlags |= MOVE_SRC_CURRENT_IS_DIR; /* source is file but at the current round we found a directory */ + continue; + } +#ifdef _DEBUG + DebugPrintf (_T("Source is dir: %s\n"), szSrcPath); +#endif + dwMoveFlags = MOVEFILE_REPLACE_EXISTING | MOVEFILE_WRITE_THROUGH | MOVEFILE_COPY_ALLOWED; + } + + /* if source is file we don't need to do anything special */ + + if (IsExistingDirectory(szDestPath)) + { + /* destination is existing directory */ +#ifdef _DEBUG + DebugPrintf (_T("Destination is directory: %s\n"), szDestPath); +#endif + + dwMoveStatusFlags |= MOVE_DEST_IS_DIR; + + /*build the dest string(accounts for *)*/ + _tcscpy (szFullDestPath, szDestPath); + /*check to see if there is an ending slash, if not add one*/ + if(szFullDestPath[_tcslen(szFullDestPath) - 1] != _T('\\')) + _tcscat (szFullDestPath, _T("\\")); + _tcscat (szFullDestPath, findBuffer.cFileName); + + if (IsExistingFile(szFullDestPath) || IsExistingDirectory(szFullDestPath)) + dwMoveStatusFlags |= MOVE_DEST_EXISTS; + + dwMoveFlags |= MOVEFILE_REPLACE_EXISTING | MOVEFILE_WRITE_THROUGH | MOVEFILE_COPY_ALLOWED; + + } + if (IsExistingFile(szDestPath)) + { + /* destination is a file */ +#ifdef _DEBUG + DebugPrintf (_T("Destination is file: %s\n"), szDestPath); +#endif + + dwMoveStatusFlags |= MOVE_DEST_IS_FILE | MOVE_DEST_EXISTS; + _tcscpy (szFullDestPath, szDestPath); + + dwMoveFlags |= MOVEFILE_REPLACE_EXISTING | MOVEFILE_WRITE_THROUGH | MOVEFILE_COPY_ALLOWED; + + } + +#ifdef _DEBUG + DebugPrintf(_T("Move Status Flags: 0x%X\n"),dwMoveStatusFlags); +#endif + + if (dwMoveStatusFlags & MOVE_SOURCE_IS_DIR && + dwMoveStatusFlags & MOVE_DEST_IS_DIR && + dwMoveStatusFlags & MOVE_SOURCE_HAS_WILD) + { + /* We are not allowed to have existing source and destination dir when there is wildcard in source */ + error_syntax(NULL); + FindClose(hFile); + freep(arg); + return 1; + } + + if (!(dwMoveStatusFlags & (MOVE_DEST_IS_FILE | MOVE_DEST_IS_DIR))) + { + /* destination doesn't exist */ + _tcscpy (szFullDestPath, szDestPath); + if (dwMoveStatusFlags & MOVE_SOURCE_IS_FILE) dwMoveStatusFlags |= MOVE_DEST_IS_FILE; + if (dwMoveStatusFlags & MOVE_SOURCE_IS_DIR) dwMoveStatusFlags |= MOVE_DEST_IS_DIR; + + dwMoveFlags |= MOVEFILE_REPLACE_EXISTING | MOVEFILE_WRITE_THROUGH | MOVEFILE_COPY_ALLOWED; + } + + if (dwMoveStatusFlags & MOVE_SOURCE_IS_FILE && + dwMoveStatusFlags & MOVE_DEST_IS_FILE && + !OnlyOneFile) + { + /*source has many files but there is only one destination file*/ + error_invalid_parameter_format(arg[argc - 1]); + FindClose(hFile); + freep (arg); + return 1; + } + + /*checks to make sure user wanted/wants the override*/ + if((dwFlags & MOVE_OVER_NO) && + (dwMoveStatusFlags & MOVE_DEST_EXISTS)) + continue; + if(!(dwFlags & MOVE_OVER_YES) && + (dwMoveStatusFlags & MOVE_DEST_EXISTS)) + nOverwrite = MoveOverwrite (szFullDestPath); + if (nOverwrite == PROMPT_NO || nOverwrite == PROMPT_BREAK) + continue; + if (nOverwrite == PROMPT_ALL) + dwFlags |= MOVE_OVER_YES; + + + ConOutPrintf (_T("%s => %s "), szSrcPath, szFullDestPath); + + /* are we really supposed to do something */ + if (dwFlags & MOVE_NOTHING) + continue; + + /*move the file*/ + if (!(dwMoveStatusFlags & MOVE_SOURCE_IS_DIR && + dwMoveStatusFlags & MOVE_PATHS_ON_DIF_VOL)) + /* we aren't moving source folder to different drive */ + MoveStatus = MoveFileEx (szSrcPath, szFullDestPath, dwMoveFlags); + else + { /* we are moving source folder to different drive */ + _tcscpy(szMoveDest, szFullDestPath); + _tcscpy(szMoveSrc, szSrcPath); + DeleteFile(szMoveDest); + MoveStatus = CreateDirectory(szMoveDest, NULL); /* we use default security settings */ + if (MoveStatus) + { + _tcscat(szMoveDest,_T("\\")); + _tcscat(szMoveSrc,_T("\\")); + nDirLevel = 0; + pszDestDirPointer = szMoveDest + _tcslen(szMoveDest); + pszSrcDirPointer = szMoveSrc + _tcslen(szMoveSrc); + _tcscpy(pszSrcDirPointer,_T("*.*")); + hDestFile = FindFirstFile(szMoveSrc, &findDestBuffer); + if (hDestFile == INVALID_HANDLE_VALUE) + MoveStatus = FALSE; + else + { + BOOL FirstTime = TRUE; + FoundFile = TRUE; + MoveStatus = FALSE; + while(FoundFile) + { + if (FirstTime) + FirstTime = FALSE; + else + FoundFile = FindNextFile (hDestFile, &findDestBuffer); + + if (!FoundFile) + { /* Nothing to do in this folder so we stop working on it */ + FindClose(hDestFile); + (pszSrcDirPointer)--; + (pszDestDirPointer)--; + _tcscpy(pszSrcDirPointer,_T("")); + _tcscpy(pszDestDirPointer,_T("")); + if (nDirLevel > 0) + { + TCHAR szTempPath[MAX_PATH]; + INT nDiff; + + FoundFile = TRUE; /* we need to continue our seek for files */ + nDirLevel--; + RemoveDirectory(szMoveSrc); + GetDirectory(szMoveSrc,szTempPath,0); + nDiff = _tcslen(szMoveSrc) - _tcslen(szTempPath); + pszSrcDirPointer = pszSrcDirPointer - nDiff; + _tcscpy(pszSrcDirPointer,_T("")); + GetDirectory(szMoveDest,szTempPath,0); + nDiff = _tcslen(szMoveDest) - _tcslen(szTempPath); + pszDestDirPointer = pszDestDirPointer - nDiff; + _tcscpy(pszDestDirPointer,_T("")); + if(szMoveSrc[_tcslen(szMoveSrc) - 1] != _T('\\')) + _tcscat (szMoveSrc, _T("\\")); + if(szMoveDest[_tcslen(szMoveDest) - 1] != _T('\\')) + _tcscat (szMoveDest, _T("\\")); + pszDestDirPointer = szMoveDest + _tcslen(szMoveDest); + pszSrcDirPointer = szMoveSrc + _tcslen(szMoveSrc); + _tcscpy(pszSrcDirPointer,_T("*.*")); + hDestFile = FindFirstFile(szMoveSrc, &findDestBuffer); + if (hDestFile == INVALID_HANDLE_VALUE) + continue; + FirstTime = TRUE; + } + else + { + MoveStatus = TRUE; /* we moved everything so lets tell user about it */ + RemoveDirectory(szMoveSrc); + } + continue; + } + + /* if we find "." or ".." we'll skip them */ + if (_tcscmp(findDestBuffer.cFileName,_T(".")) == 0 || + _tcscmp(findDestBuffer.cFileName,_T("..")) == 0) + continue; + + _tcscpy(pszSrcDirPointer, findDestBuffer.cFileName); + _tcscpy(pszDestDirPointer, findDestBuffer.cFileName); + if (IsExistingFile(szMoveSrc)) + { + FoundFile = CopyFile(szMoveSrc, szMoveDest, FALSE); + if (!FoundFile) continue; + DeleteFile(szMoveSrc); + } + else + { + FindClose(hDestFile); + CreateDirectory(szMoveDest, NULL); + _tcscat(szMoveDest,_T("\\")); + _tcscat(szMoveSrc,_T("\\")); + nDirLevel++; + pszDestDirPointer = szMoveDest + _tcslen(szMoveDest); + pszSrcDirPointer = szMoveSrc + _tcslen(szMoveSrc); + _tcscpy(pszSrcDirPointer,_T("*.*")); + hDestFile = FindFirstFile(szMoveSrc, &findDestBuffer); + if (hDestFile == INVALID_HANDLE_VALUE) + { + FoundFile = FALSE; + continue; + } + FirstTime = TRUE; + } + } + } + } + } + if (MoveStatus) + LoadString(CMD_ModuleHandle, STRING_MOVE_ERROR1, szMsg, RC_STRING_MAX_SIZE); + else + LoadString(CMD_ModuleHandle, STRING_MOVE_ERROR2, szMsg, RC_STRING_MAX_SIZE); + + ConOutPrintf(szMsg); + } + while ((!OnlyOneFile || dwMoveStatusFlags & MOVE_SRC_CURRENT_IS_DIR ) && + !(dwMoveStatusFlags & MOVE_SOURCE_IS_DIR) && + FindNextFile (hFile, &findBuffer)); + FindClose (hFile); + + freep (arg); + return 0; +} + +#endif /* INCLUDE_CMD_MOVE */ diff --git a/reactos/base/shell/cmd/msgbox.c b/reactos/base/shell/cmd/msgbox.c new file mode 100644 index 00000000000..f512bb7cf0f --- /dev/null +++ b/reactos/base/shell/cmd/msgbox.c @@ -0,0 +1,158 @@ +/* + * MSGBOX.C - msgbox internal command. + * + * clone from 4nt msgbox command + * + * 25 Aug 1999 + * started - Paolo Pantaleo + * + * 30-Apr-2005 (Magnus Olsen) ) + * Remove all hardcode string to En.rc + */ + +#include +#include "resource.h" + +#ifdef INCLUDE_CMD_MSGBOX + + +#define U_TYPE_INIT 0 + +//undefine it to allow to omit arguments +//that will be replaced by default ones +#define _SYNTAX_CHECK + + +INT CommandMsgbox (LPTSTR cmd, LPTSTR param) +{ + + //used to parse command line + LPTSTR tmp; + + //used to find window title (used as messagebox title) + //and to find window handle to pass to MessageBox + HWND hWnd; + TCHAR buff[128]; + + //these are MessabeBox() parameters + LPTSTR title, prompt = ""; + UINT uType = U_TYPE_INIT; + + /* set default title to window title */ + GetConsoleTitle(buff, 128); + title = buff; + + if (_tcsncmp (param, _T("/?"), 2) == 0) + { + ConOutResPaging(TRUE,STRING_MSGBOX_HELP); + return 0; + } + + //yes here things are quite massed up :) + + //skip spaces + while(_istspace(*param)) + param++; + + //search for type of messagebox (ok, okcancel, ...) + if (_tcsnicmp(param, _T("ok "), 3) == 0) + { + uType |= MB_ICONEXCLAMATION | MB_OK; + param += 3; + } + else if (_tcsnicmp(param, _T("okcancel "), 9) == 0) + { + uType |= MB_ICONQUESTION | MB_OKCANCEL; + param += 9; + } + else if (_tcsnicmp(param, _T("yesno "), 6) == 0) + { + uType |= MB_ICONQUESTION | MB_YESNO; + param += 6; + } + else if (_tcsnicmp(param, _T("yesnocancel "), 12) == 0) + { + uType |= MB_ICONQUESTION | MB_YESNOCANCEL; + param += 12; + } + else + { +#ifdef _SYNTAX_CHECK + error_req_param_missing (); + return 1; +#else + uType |= MB_ICONEXCLAMATION | MB_OK; +#endif + } + + + //skip spaces + while(_istspace(*param)) + param++; + +#ifdef _SYNTAX_CHECK + //if reached end of string + //it is an error becuase we do not yet have prompt + if (*param == 0) + { + error_req_param_missing (); + return 1; + } +#endif + + //search for "title" + tmp = param; + + if (*param == '"') + { + tmp = _tcschr(param + 1, '"'); + if (tmp) + { + *tmp = 0; + title = param + 1; + tmp++; + param = tmp; + } + } + + //skip spaces + while(_istspace(*param)) + param++; + +#ifdef _SYNTAX_CHECK + //get prompt + if (*param == 0) + { + error_req_param_missing (); + return 1; + } +#endif + + prompt = param; + + hWnd=GetConsoleWindow (); +// DebugPrintf("FindWindow hWnd = %d\n",hWnd); +// ConErrPrintf("FindWindow hWnd = %d\n",hWnd); + + switch (MessageBox(hWnd, prompt, title, uType)) + { + case IDYES: + case IDOK: + nErrorLevel = 10; + break; + + case IDNO: + nErrorLevel = 11; + break; + + case IDCANCEL: + nErrorLevel = 12; + break; + } + + return 0; +} + +#endif /* INCLUDE_CMD_MSGBOX */ + +/* EOF */ diff --git a/reactos/base/shell/cmd/path.c b/reactos/base/shell/cmd/path.c new file mode 100644 index 00000000000..601863a1dfa --- /dev/null +++ b/reactos/base/shell/cmd/path.c @@ -0,0 +1,91 @@ +/* + * PATH.C - path internal command. + * + * + * History: + * + * 17 Jul 1998 (John P Price) + * Separated commands into individual files. + * + * 27-Jul-1998 (John P Price ) + * added config.h include + * + * 09-Dec-1998 (Eric Kohl ) + * Added help text ("/?"). + * + * 18-Jan-1999 (Eric Kohl ) + * Unicode ready! + * + * 18-Jan-1999 (Eric Kohl ) + * Redirection safe! + * + * 24-Jan-1999 (Eric Kohl ) + * Fixed Win32 environment handling. + * + * 30-Apr-2005 (Magnus Olsen) ) + * Remove all hardcode string to En.rc + */ +#include +#include "resource.h" + +#ifdef INCLUDE_CMD_PATH + +/* size of environment variable buffer */ +#define ENV_BUFFER_SIZE 1024 + + +INT cmd_path (LPTSTR cmd, LPTSTR param) +{ + + if (!_tcsncmp (param, _T("/?"), 2)) + { + ConOutResPaging(TRUE,STRING_PATH_HELP1); + return 0; + } + + nErrorLevel = 0; + + /* if param is empty, display the PATH environment variable */ + if (!param || !*param) + { + DWORD dwBuffer; + LPTSTR pszBuffer; + TCHAR szMsg[RC_STRING_MAX_SIZE]; + + pszBuffer = (LPTSTR)malloc (ENV_BUFFER_SIZE * sizeof(TCHAR)); + dwBuffer = GetEnvironmentVariable (_T("PATH"), pszBuffer, ENV_BUFFER_SIZE); + if (dwBuffer == 0) + { + LoadString(CMD_ModuleHandle, STRING_VOL_HELP2, szMsg, RC_STRING_MAX_SIZE); + ConOutPrintf(szMsg, _T("PATH")); + return 0; + } + else if (dwBuffer > ENV_BUFFER_SIZE) + { + pszBuffer = (LPTSTR)realloc (pszBuffer, dwBuffer * sizeof (TCHAR)); + GetEnvironmentVariable (_T("PATH"), pszBuffer, ENV_BUFFER_SIZE); + } + + ConOutPrintf (_T("PATH=%s\n"), pszBuffer); + free (pszBuffer); + + return 0; + } + + /* skip leading '=' */ + if (*param == _T('=')) + param++; + + /* set PATH environment variable */ + if (!SetEnvironmentVariable (_T("PATH"), param)) + { + nErrorLevel = 1; + return 1; + } + + return 0; +} + +#endif + +/* EOF */ diff --git a/reactos/base/shell/cmd/pause.c b/reactos/base/shell/cmd/pause.c new file mode 100644 index 00000000000..20024476d05 --- /dev/null +++ b/reactos/base/shell/cmd/pause.c @@ -0,0 +1,63 @@ +/* + * PAUSE.C - pause internal command. + * + * + * History: + * + * 16 Jul 1998 (Hans B Pufal) + * started. + * + * 16 Jul 1998 (John P Price) + * Seperated commands into individual files. + * + * 27-Jul-1998 (John P Price ) + * added config.h include + * + * 18-Jan-1999 (Eric Kohl ) + * Unicode ready! + */ + +#include +#include "resource.h" + +#ifdef INCLUDE_CMD_PAUSE + +/* + * Perform PAUSE command. + * + * FREEDOS extension : If parameter is specified use that as the pause + * message. + * + * ?? Extend to include functionality of CHOICE if switch chars + * specified. + * + * 30-Apr-2005 (Magnus Olsen) ) + * Remove all hardcode string to En.rc + */ + +INT cmd_pause (LPTSTR cmd, LPTSTR param) +{ + +#ifdef _DEBUG + DebugPrintf (_T("cmd_pause: \'%s\' : \'%s\')\n"), cmd, param); +#endif + + if (!_tcsncmp (param, _T("/?"), 2)) + { + ConOutResPaging(TRUE,STRING_PAUSE_HELP1); + return 0; + } + + if (*param) + ConOutPrintf (param); + else + msg_pause (); + + cgetchar (); + + return 0; +} + +#endif + +/* EOF */ diff --git a/reactos/base/shell/cmd/precomp.h b/reactos/base/shell/cmd/precomp.h new file mode 100644 index 00000000000..3fd7e6b22df --- /dev/null +++ b/reactos/base/shell/cmd/precomp.h @@ -0,0 +1,29 @@ +#ifdef _MSC_VER +#pragma warning ( disable : 4103 ) /* use #pragma pack to change alignment */ +#undef _CRT_SECURE_NO_DEPRECATE +#define _CRT_SECURE_NO_DEPRECATE +#endif//_MSC_VER + +#include +#define WIN32_NO_STATUS +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include + +#define NTOS_MODE_USER +#include + +#include "cmd.h" +#include "config.h" +#include "batch.h" + diff --git a/reactos/base/shell/cmd/prompt.c b/reactos/base/shell/cmd/prompt.c new file mode 100644 index 00000000000..4ef8814a779 --- /dev/null +++ b/reactos/base/shell/cmd/prompt.c @@ -0,0 +1,235 @@ +/* + * PROMPT.C - prompt handling. + * + * + * History: + * + * 14/01/95 (Tim Normal) + * started. + * + * 08/08/95 (Matt Rains) + * i have cleaned up the source code. changes now bring this source + * into guidelines for recommended programming practice. + * + * 01/06/96 (Tim Norman) + * added day of the week printing (oops, forgot about that!) + * + * 08/07/96 (Steffan Kaiser) + * small changes for speed + * + * 20-Jul-1998 (John P Price ) + * removed redundant day strings. Use ones defined in date.c. + * + * 27-Jul-1998 (John P Price ) + * added config.h include + * + * 28-Jul-1998 (John P Price ) + * moved cmd_prompt from internal.c to here + * + * 09-Dec-1998 (Eric Kohl ) + * Added help text ("/?"). + * + * 14-Dec-1998 (Eric Kohl ) + * Added "$+" option. + * + * 09-Jan-1999 (Eric Kohl ) + * Added "$A", "$C" and "$F" option. + * Added locale support. + * Fixed "$V" option. + * + * 20-Jan-1999 (Eric Kohl ) + * Unicode and redirection safe! + * + * 24-Jan-1999 (Eric Kohl ) + * Fixed Win32 environment handling. + * + * 30-Apr-2005 (Magnus Olsen) ) + * Remove all hardcode string to En.rc + */ +#include +#include "resource.h" + +/* + * print the command-line prompt + */ +VOID PrintPrompt(VOID) +{ + static TCHAR default_pr[] = _T("$P$G"); + TCHAR szPrompt[256]; + LPTSTR pr; + + if (GetEnvironmentVariable (_T("PROMPT"), szPrompt, 256)) + pr = szPrompt; + else + pr = default_pr; + + while (*pr) + { + if (*pr != _T('$')) + { + ConOutChar (*pr); + } + else + { + pr++; + + switch (_totupper (*pr)) + { + case _T('A'): + ConOutChar (_T('&')); + break; + + case _T('B'): + ConOutChar (_T('|')); + break; + + case _T('C'): + ConOutChar (_T('(')); + break; + + case _T('D'): + PrintDate (); + break; + + case _T('E'): + ConOutChar (_T('\x1B')); + break; + + case _T('F'): + ConOutChar (_T(')')); + break; + + case _T('G'): + ConOutChar (_T('>')); + break; + + case _T('H'): + ConOutChar (_T('\x08')); + ConOutChar (_T(' ')); + ConOutChar (_T('\x08')); + break; + + case _T('L'): + ConOutChar (_T('<')); + break; + + case _T('N'): + { + TCHAR szPath[MAX_PATH]; + GetCurrentDirectory (MAX_PATH, szPath); + ConOutChar (szPath[0]); + } + break; + + case _T('P'): + { + TCHAR szPath[MAX_PATH]; + GetCurrentDirectory (MAX_PATH, szPath); + ConOutPrintf (_T("%s"), szPath); + } + break; + + case _T('Q'): + ConOutChar (_T('=')); + break; + + case _T('S'): + ConOutChar (_T(' ')); + break; + + case _T('T'): + { + SYSTEMTIME t; + GetSystemTime(&t); + ConOutPrintf(_T("%02d%c%02d%c%02d%c%02d\n"),t.wHour, cTimeSeparator,t.wMinute , cTimeSeparator, + t.wSecond , cDecimalSeparator, t.wMilliseconds ); + } + break; + + case _T('V'): + switch (osvi.dwPlatformId) + { + case VER_PLATFORM_WIN32_WINDOWS: + if (osvi.dwMajorVersion == 4 && + osvi.dwMinorVersion == 1) + ConOutPrintf (_T("Windows 98")); + else + ConOutPrintf (_T("Windows 95")); + break; + + + case VER_PLATFORM_WIN32_NT: + ConOutPrintf (_T("Windows NT Version %lu.%lu"), + osvi.dwMajorVersion, osvi.dwMinorVersion); + break; + } + break; + + case _T('_'): + ConOutChar (_T('\n')); + break; + + case '$': + ConOutChar (_T('$')); + break; + +#ifdef FEATURE_DIRECTORY_STACK + case '+': + { + INT i; + for (i = 0; i < GetDirectoryStackDepth (); i++) + ConOutChar (_T('+')); + } + break; +#endif + } + } + pr++; + } +} + + +#ifdef INCLUDE_CMD_PROMPT + +INT cmd_prompt (LPTSTR cmd, LPTSTR param) +{ + if (!_tcsncmp (param, _T("/?"), 2)) + { + ConOutResPaging(TRUE,STRING_PROMPT_HELP1); + +#ifdef FEATURE_DIRECTORY_STACK + ConOutResPaging(FALSE,STRING_PROMPT_HELP2); +#endif + ConOutResPaging(FALSE,STRING_PROMPT_HELP3); + return 0; + } + + /* if it is null, then it needs to set to default, + because that means the user entered "prompt" only. + so even if param is null you _must_ still set prompt + to the default. There seems to be some kinda difference + between winxp and 2k in this matter and this way will + cover both. Do not use fixed size of szParam for param the buffer are 8192bytes + and will later change to dymatic buffer */ + + /* set PROMPT environment variable */ + if (param[0] != _T('\0')) + { + if (!SetEnvironmentVariable (_T("PROMPT"), param)) + return 1; + } + else + { + TCHAR szParam[5]; + _tcscpy(szParam,_T("$P$G")); + if (!SetEnvironmentVariable (_T("PROMPT"),szParam)) + return 1; + } + + + + return 0; +} +#endif + +/* EOF */ diff --git a/reactos/base/shell/cmd/readme.txt b/reactos/base/shell/cmd/readme.txt new file mode 100644 index 00000000000..5ac23049b41 --- /dev/null +++ b/reactos/base/shell/cmd/readme.txt @@ -0,0 +1,55 @@ +ReactOS command line interpreter CMD +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The ReactOS command line interpreter CMD is derived from FreeCOM, the +FreeDOS command line interpreter. + +We are shooting mainly to be just like 2000/XP cmd.exe. They are very close and only a small number(none that i can recall off the top of my head, so maybe 0) differences have been found between those two. It has been reported that ROS cmd.exe does not work on nt4 because of a missing api. I'm hoping to fix this at some point. + + +Compiling +~~~~~~~~~ +ROS cmd used to depend on __REACTOS__ to provide two different ways to build cmd. There is still code left in it for this but... The __REACTOS__ = 0 has not been develped, maintained. And therefore it does not even compile anymore. __REACTOS__ = 1 works fine on both windows(nt). and someday i plan to remove all the __REACTOS__ = 0. + +Using rbuild you can compile cmd seperatly by "make cmd_install". Also you can compile cmd using MSVC 6 and soon 7/8 hopefully. + + +Current Features +~~~~~~~~~~~~~~~~ + - environment handling with prompt and path support. + - directory utilities. + - command-line history with doskey-like features. + - batch file processing. + - input/output redirection and piping. + - alias support. + - filename completion (use TAB), both unix and windows style. + + +Credits +~~~~~~~ +FreeDOS developers: + normat@rpi.edu (Tim Norman) + mrains@apanix.apana.org.au (Matt Rains) + ejeffrey@iastate.edu (Evan Jeffrey) + Steffen.Kaiser@Informatik.TU-Chemnitz.DE (Steffen Kaiser) + Svante Frey (sfrey@kuai.se) + Oliver Mueller (ogmueller@t-online.de) + Aaron Kaufman (morgan@remarque.berkeley.edu) + Marc Desrochers (bitzero@hotmail.com) + Rob Lake (rlake@cs.mun.ca) + John P. Price + Hans B Pufal + +ReactOS developers: + Eric Kohl + Emanuele Aliberti + Paolo Pantaleo + Brandon Turner + + + +Bugs +~~~~ +There is still many bugs ;) +Please report bugs to ReactOS team or to bugzilla at www.reactos.org + diff --git a/reactos/base/shell/cmd/readme2.txt b/reactos/base/shell/cmd/readme2.txt new file mode 100644 index 00000000000..a7e7dfe9c1e --- /dev/null +++ b/reactos/base/shell/cmd/readme2.txt @@ -0,0 +1,19 @@ +General Overview of How THings Work +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +First it comes into _main in cmd.c(1811). The command line params are taking in and if it is unicode it uses CommandLineToArgvW. This can cause a problem on older machines and that is why we have our own custom _CommandLineToArgvW to help this along. We pull in the launch directory as the inital dir and set that in _tchdir. We make a handle to the default console out using CreateFile. + +Then we call Initialize(). Here we need to load ntdll.dll if it isnt loaded(windows 9x machines). We also setup some gloabl vars like default io handles and nErrorLevel and set %prompt% to $P$G. This is where all command lines switches given to cmd on startup are done. + +From here main calls ProcessInput(). This is where cmd loops for getting input and doing the commands. First it checks to see if there is a batch file(note: there is agolbal struct "bc" which is NULL when not processing a batch file) and if there is it will pull a new line from that file. If not, thne it will wait for input. Currently there is some stuff for set /a in there, which might stay there or see if we can find a better spot. + +Once there is input taken in from the command line it is sent into ParseCommandLine(). In here we fist check for aliases and convert if need be. THen we look for redirections using GetRedirection() which will remove any redirection symbols. and pass back info about where to redirect. from this info it will do some switching around with the handles for where things go and send them as need be. personally i dont like this code and i tried to chnage it before but failed. it is confusing to me and i dont understand why a lot of it is there but apparently it is needed. + +It sends the new string without any redirection info into DoCommand(). In this function we just look to see what should be done. There is one of 2 things that could happen. 1) we fnd the matching command and send it off to that commands little section. 2) we dont find it so we send it to Execute() and see if it is a file that we can do something. + +Execute will try to launch the file using createprocess and falls back on shellexecute. It calls a function called SearchForExecuteable() to find the full path name and looks in all the correct locations like PATH, curreent folder, windows folder. If it cant find it, just fails and prints out a message. + +Some useful functions that are used a lot: +split() - splits a string into an array of string on spaces that arent inside quotes. which you need to call freep() on later t clean up. +IsValidPathName(), IsExistingFile(), IsExistingDirectory() - all do what you would expect. +PagePrompt() - ask them to hit a key to continue +FilePromptYN[A]() - ask them a yes or no question diff --git a/reactos/base/shell/cmd/redir.c b/reactos/base/shell/cmd/redir.c new file mode 100644 index 00000000000..21848c320b3 --- /dev/null +++ b/reactos/base/shell/cmd/redir.c @@ -0,0 +1,279 @@ +/* + * REDIR.C - redirection handling. + * + * + * History: + * + * 12/15/95 (Tim Norman) + * started. + * + * 12 Jul 98 (Hans B Pufal) + * Rewrote to make more efficient and to conform to new command.c + * and batch.c processing. + * + * 27-Jul-1998 (John P Price ) + * Added config.h include + * + * 22-Jan-1999 (Eric Kohl ) + * Unicode safe! + * Added new error redirection "2>" and "2>>". + * + * 26-Jan-1999 (Eric Kohl ) + * Added new error AND output redirection "&>" and "&>>". + * + * 24-Jun-2005 (Brandon Turner ) + * simple check to fix > and | bug with 'rem' + */ + +#include + +#ifdef FEATURE_REDIRECTION + + +static BOOL +IsRedirection (TCHAR c) +{ + return (c == _T('<')) || (c == _T('>')) || (c == _T('|')); +} + + +/* + * Gets the redirection info from the command line and copies the + * file names into ifn, ofn and efn removing them from the command + * line. + * + * Converts remaining command line into a series of null terminated + * strings defined by the pipe char '|'. Each string corresponds + * to a single executable command. A double null terminates the + * command strings. + * + * Return number of command strings found. + * + */ + +INT GetRedirection (LPTSTR s, LPTSTR ifn, LPTSTR ofn, LPTSTR efn, LPINT lpnFlags) +{ + INT num = 1; + LPTSTR dp = s; + LPTSTR sp = s; + +#ifdef INCLUDE_CMD_REM + + TCHAR * line = s; + + + while (_istspace (*line)) + line++; + + /*first thing first. check to see if this is "rem" and hope out*/ + if(!_tcsncmp (line, _T("rem "), 4)) + { + lpnFlags = 0; + *ifn=('\0'); + *ofn=('\0'); + *efn=_T('\0'); + return 1; + } +#endif + /* find and remove all the redirections first */ + while (*sp) + { + if (*sp == _T('^')) + { + *dp++ = *sp++; + *dp++ = *sp++; + continue; + } + if ((*sp == _T('"')) || (*sp == _T('\''))) + { + /* No redirects inside quotes */ + TCHAR qc = *sp; + + do + *dp++ = *sp++; + while (*sp && *sp != qc); + + *dp++ = *sp++; + } + else if ((*sp == _T('<')) || (*sp == _T('>')) || + (*sp == _T('1')) || (*sp == _T('2')) || (*sp == _T('&'))) + { + /* MS-DOS ignores multiple redirection symbols and uses the last */ + /* redirection, so we'll emulate that and not check */ + + if (*sp == _T('<')) + { + /* input redirection */ + *lpnFlags |= INPUT_REDIRECTION; + do sp++; + while( _istspace (*sp) ); + + /* copy file name */ + while (*sp && !IsRedirection (*sp) && !_istspace (*sp)) + *ifn++ = *sp++; + *ifn = _T('\0'); + } + else if (*sp == _T('>')) + { + /* output redirection */ + *lpnFlags |= OUTPUT_REDIRECTION; + sp++; + + /* append request ? */ + if (*sp == _T('>')) + { + *lpnFlags |= OUTPUT_APPEND; + sp++; + } + + while (_istspace (*sp)) + sp++; + + /* copy file name */ + while (*sp && !IsRedirection (*sp) && !_istspace (*sp)) + *ofn++ = *sp++; + *ofn = _T('\0'); + } + + else if (*sp == _T('1')) + { + /* output redirection */ + sp++; + + if (*sp == _T('>')) + { + /* output redirection */ + *lpnFlags |= OUTPUT_REDIRECTION; + sp++; + + /* append request ? */ + if (*sp == _T('>')) + { + *lpnFlags |= OUTPUT_APPEND; + sp++; + } + } + else + { + /* no redirection!! copy the '1' character! */ + sp--; + *dp++ = *sp++; + continue; + } + + while (_istspace (*sp)) + sp++; + + /* copy file name */ + while (*sp && !IsRedirection (*sp) && !_istspace (*sp)) + *ofn++ = *sp++; + *ofn = _T('\0'); + } + + else if (*sp == _T('2')) + { + /* error redirection */ + sp++; + + if (*sp == _T('>')) + { + *lpnFlags |= ERROR_REDIRECTION; + sp++; + + /* append request ? */ + if (*sp == _T('>')) + { + *lpnFlags |= ERROR_APPEND; + sp++; + } + } + else + { + /* no redirection!! copy the '2' character! */ + sp--; + *dp++ = *sp++; + continue; + } + + while (_istspace (*sp)) + sp++; + + /* copy file name */ + while (*sp && !IsRedirection (*sp) && !_istspace (*sp)) + *efn++ = *sp++; + *efn = _T('\0'); + } + else if (*sp == _T('&')) + { + /* output AND error redirection */ + sp++; + + if (*sp == _T('>')) + { + *lpnFlags |= (ERROR_REDIRECTION | OUTPUT_REDIRECTION); + sp++; + + /* append request ? */ + if (*sp == _T('>')) + { + *lpnFlags |= (ERROR_APPEND | OUTPUT_APPEND); + sp++; + } + } + else + { + /* no redirection!! copy the '&' character! */ + sp--; + *dp++ = *sp++; + continue; + } + + while (_istspace (*sp)) + sp++; + + /* copy file name */ + while (*sp && !IsRedirection (*sp) && !_istspace (*sp)) + *ofn++ = *efn++ = *sp++; + *ofn = *efn = _T('\0'); + } + } + else + *dp++ = *sp++; + } + + *dp++ = _T('\0'); + *dp = _T('\0'); + + /* now go for the pipes */ + sp = s; + while (*sp) + { + if (*sp == _T('^')) + { + sp++; + sp++; + continue; + } + else if ((*sp == _T('"')) || (*sp == _T('\''))) + { + TCHAR qc = *sp; + + do + sp++; + while (*sp && *sp != qc); + + sp++; + } + else if (*sp == _T('|')) + { + *sp++ = _T('\0'); + num++; + } + else + sp++; + } + + return num; +} + +#endif /* FEATURE_REDIRECTION */ diff --git a/reactos/base/shell/cmd/ren.c b/reactos/base/shell/cmd/ren.c new file mode 100644 index 00000000000..b096fc8f876 --- /dev/null +++ b/reactos/base/shell/cmd/ren.c @@ -0,0 +1,268 @@ +/* + * REN.C - rename internal command. + * + * + * History: + * + * 27-Jul-1998 (John P Price ) + * added config.h include + * + * 18-Dec-1998 (Eric Kohl + * Added support for quoted long file names with spaces. + * + * 20-Jan-1999 (Eric Kohl + * Unicode and redirection safe! + * + * 17-Oct-2001 (Eric Kohl + * Implemented basic rename code. + * + * 30-Apr-2005 (Magnus Olsen) ) + * Remove all hardcode string to En.rc + */ + +#include +#include "resource.h" + +#ifdef INCLUDE_CMD_RENAME + +enum +{ + REN_ATTRIBUTES = 0x001, /* /A : not implemented */ + REN_ERROR = 0x002, /* /E */ + REN_NOTHING = 0x004, /* /N */ + REN_PROMPT = 0x008, /* /P : not implemented */ + REN_QUIET = 0x010, /* /Q */ + REN_SUBDIR = 0x020, /* /S */ + REN_TOTAL = 0x040, /* /T */ +}; + + +/* + * file rename internal command. + * + */ +INT cmd_rename (LPTSTR cmd, LPTSTR param) +{ + TCHAR szMsg[RC_STRING_MAX_SIZE]; + LPTSTR *arg = NULL; + INT args = 0; + INT nEvalArgs = 0; /* nunber of evaluated arguments */ + DWORD dwFlags = 0; + DWORD dwFiles = 0; /* number of renamedd files */ + INT i; + LPTSTR srcPattern = NULL; + LPTSTR dstPattern = NULL; + TCHAR dstFile[MAX_PATH]; + BOOL bDstWildcard = FALSE; + + LPTSTR p,q,r; + + HANDLE hFile; + WIN32_FIND_DATA f; + + if (!_tcsncmp(param, _T("/?"), 2)) + { + ConOutResPaging(TRUE,STRING_REN_HELP1); + return 0; + } + + nErrorLevel = 0; + + /* split the argument list */ + arg = split(param, &args, FALSE); + + if (args < 2) + { + if (!(dwFlags & REN_ERROR)) + error_req_param_missing(); + freep(arg); + return 1; + } + + /* read options */ + for (i = 0; i < args; i++) + { + if (*arg[i] == _T('/')) + { + if (_tcslen(arg[i]) >= 2) + { + switch (_totupper(arg[i][1])) + { + case _T('E'): + dwFlags |= REN_ERROR; + break; + + case _T('N'): + dwFlags |= REN_NOTHING; + break; + + case _T('P'): + dwFlags |= REN_PROMPT; + break; + + case _T('Q'): + dwFlags |= REN_QUIET; + break; + + case _T('S'): + dwFlags |= REN_SUBDIR; + break; + + case _T('T'): + dwFlags |= REN_TOTAL; + break; + } + } + nEvalArgs++; + } + } + + /* keep quiet within batch files */ + if (bc != NULL) + dwFlags |= REN_QUIET; + + /* there are only options on the command line --> error!!! */ + if (args < nEvalArgs + 2) + { + if (!(dwFlags & REN_ERROR)) + error_req_param_missing(); + freep(arg); + return 1; + } + + /* get destination pattern */ + for (i = 0; i < args; i++) + { + if (*arg[i] == _T('/')) + continue; + dstPattern = arg[i]; + } + + if (_tcschr(dstPattern, _T('*')) || _tcschr(dstPattern, _T('?'))) + bDstWildcard = TRUE; + + /* enumerate source patterns */ + for (i = 0; i < args; i++) + { + if (*arg[i] == _T('/') || arg[i] == dstPattern) + continue; + + srcPattern = arg[i]; + +#ifdef _DEBUG + ConErrPrintf(_T("\n\nSourcePattern: %s\n"), srcPattern); + ConErrPrintf(_T("DestinationPattern: %s\n"), dstPattern); +#endif + + hFile = FindFirstFile(srcPattern, &f); + if (hFile == INVALID_HANDLE_VALUE) + { + if (!(dwFlags & REN_ERROR)) + error_file_not_found(); + continue; + } + + do + { + /* ignore "." and ".." */ + if (!_tcscmp (f.cFileName, _T(".")) || + !_tcscmp (f.cFileName, _T(".."))) + continue; + + /* do not rename hidden or system files */ + if (f.dwFileAttributes & (FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM)) + continue; + + /* do not rename directories when the destination pattern contains + * wildcards, unless option /S is used */ + if ((f.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + && bDstWildcard + && !(dwFlags & REN_SUBDIR)) + continue; + +#ifdef _DEBUG + ConErrPrintf(_T("Found source name: %s\n"), f.cFileName); +#endif + + /* build destination file name */ + p = f.cFileName; + q = dstPattern; + r = dstFile; + while(*q != 0) + { + if (*q == '*') + { + q++; + while (*p != 0 && *p != *q) + { + *r = *p; + p++; + r++; + } + } + else if (*q == '?') + { + q++; + if (*p != 0) + { + *r = *p; + p++; + r++; + } + } + else + { + *r = *q; + if (*p != 0) + p++; + q++; + r++; + } + } + *r = 0; + +#ifdef _DEBUG + ConErrPrintf(_T("DestinationFile: %s\n"), dstFile); +#endif + + if (!(dwFlags & REN_QUIET) && !(dwFlags & REN_TOTAL)) + ConOutPrintf(_T("%s -> %s\n"), f.cFileName, dstFile); + + /* rename the file */ + if (!(dwFlags & REN_NOTHING)) + { + if (MoveFile(f.cFileName, dstFile)) + { + dwFiles++; + } + else + { + if (!(dwFlags & REN_ERROR)) + { + LoadString(CMD_ModuleHandle, STRING_REN_ERROR1, szMsg, RC_STRING_MAX_SIZE); + ConErrPrintf(szMsg, GetLastError()); + } + } + } + } + while (FindNextFile(hFile, &f)); + FindClose(hFile); + } + + if (!(dwFlags & REN_QUIET)) + { + if (dwFiles == 1) + LoadString( CMD_ModuleHandle, STRING_REN_HELP2, szMsg, RC_STRING_MAX_SIZE); + else + LoadString( CMD_ModuleHandle, STRING_REN_HELP3, szMsg, RC_STRING_MAX_SIZE); + ConOutPrintf(szMsg,dwFiles); + } + + freep(arg); + + return 0; +} + +#endif + +/* EOF */ diff --git a/reactos/base/shell/cmd/res/terminal.ico b/reactos/base/shell/cmd/res/terminal.ico new file mode 100644 index 00000000000..f3252f6cb01 Binary files /dev/null and b/reactos/base/shell/cmd/res/terminal.ico differ diff --git a/reactos/base/shell/cmd/resource.h b/reactos/base/shell/cmd/resource.h new file mode 100644 index 00000000000..776370852ea --- /dev/null +++ b/reactos/base/shell/cmd/resource.h @@ -0,0 +1,231 @@ + + +#define RC_STRING_MAX_SIZE 3072 + + +#define STRING_ERROR_PARAMETERF_ERROR 100 +#define STRING_ERROR_INVALID_SWITCH 101 +#define STRING_ERROR_TOO_MANY_PARAMETERS 102 +#define STRING_ERROR_PATH_NOT_FOUND 103 +#define STRING_ERROR_FILE_NOT_FOUND 104 +#define STRING_ERROR_REQ_PARAM_MISSING 105 +#define STRING_ERROR_INVALID_DRIVE 106 +#define STRING_ERROR_INVALID_PARAM_FORMAT 107 +#define STRING_ERROR_BADCOMMAND 108 +#define STRING_ERROR_OUT_OF_MEMORY 109 +#define STRING_ERROR_CANNOTPIPE 110 +#define STRING_ERROR_D_PAUSEMSG 111 +#define STRING_ERROR_DRIVER_NOT_READY 112 + +#define STRING_CHOICE_OPTION 200 +#define STRING_COPY_OPTION 201 + +#define STRING_ALIAS_ERROR 300 +#define STRING_BATCH_ERROR 301 +#define STRING_CHCP_ERROR1 302 +#define STRING_CHCP_ERROR4 305 +#define STRING_CHOICE_ERROR 306 +#define STRING_CHOICE_ERROR_TXT 307 +#define STRING_CHOICE_ERROR_OPTION 308 +#define STRING_CMD_ERROR1 309 +#define STRING_CMD_ERROR2 310 +#define STRING_CMD_ERROR3 311 +#define STRING_CMD_ERROR4 312 +#define STRING_CMD_ERROR5 313 +#define STRING_COLOR_ERROR1 314 +#define STRING_COLOR_ERROR2 315 +#define STRING_COLOR_ERROR3 316 +#define STRING_COLOR_ERROR4 317 +#define STRING_CONSOLE_ERROR 318 +#define STRING_COPY_ERROR1 319 +#define STRING_COPY_ERROR2 320 +#define STRING_COPY_ERROR3 321 +#define STRING_COPY_ERROR4 322 +#define STRING_DATE_ERROR 323 +#define STRING_DEL_ERROR5 328 +#define STRING_DEL_ERROR6 329 +#define STRING_DEL_ERROR7 330 +#define STRING_ERROR_ERROR1 332 +#define STRING_ERROR_ERROR2 333 +#define STRING_FOR_ERROR1 334 +#define STRING_FOR_ERROR2 335 +#define STRING_FOR_ERROR3 336 +#define STRING_FOR_ERROR4 337 +#define STRING_FREE_ERROR1 338 +#define STRING_FREE_ERROR2 339 +#define STRING_GOTO_ERROR1 340 +#define STRING_GOTO_ERROR2 341 +#define STRING_MOVE_ERROR1 342 +#define STRING_MOVE_ERROR2 343 +#define STRING_PATH_ERROR 345 +#define STRING_REN_ERROR1 346 +#define STRING_START_ERROR1 347 +#define STRING_TIME_ERROR1 348 +#define STRING_TYPE_ERROR1 349 +#define STRING_WINDOW_ERROR1 350 + + + +#define STRING_ATTRIB_HELP 600 +#define STRING_ALIAS_HELP 601 +#define STRING_BEEP_HELP 602 +#define STRING_CALL_HELP 603 +#define STRING_CD_HELP 604 +#define STRING_CHCP_HELP 605 +#define STRING_CHOICE_HELP 606 +#define STRING_CLS_HELP 607 +#define STRING_CMD_HELP1 608 +#define STRING_CMD_HELP2 609 +#define STRING_CMD_HELP3 610 +#define STRING_CMD_HELP4 611 +#define STRING_CMD_HELP5 612 +#define STRING_CMD_HELP6 613 +#define STRING_CMD_HELP7 614 +#define STRING_CMD_HELP8 615 + +#define STRING_CMD_SHELLINFO 624 + +#define STRING_COLOR_HELP1 625 +#define STRING_COPY_HELP1 626 +#define STRING_COPY_HELP2 627 + +#define STRING_DATE_HELP1 628 +#define STRING_DATE_HELP2 629 +#define STRING_DATE_HELP3 630 +#define STRING_DATE_HELP4 631 +#define STRING_DEL_HELP1 632 +#define STRING_DEL_HELP2 633 +#define STRING_DEL_HELP3 634 +#define STRING_DEL_HELP4 635 +#define STRING_DELAY_HELP 636 + +#define STRING_DIR_HELP1 637 +#define STRING_DIR_HELP2 638 +#define STRING_DIR_HELP3 639 +#define STRING_DIR_HELP4 640 +#define STRING_DIR_HELP5 641 +#define STRING_DIR_HELP6 642 +#define STRING_DIR_HELP7 643 +#define STRING_DIR_HELP8 644 + +#define STRING_DIRSTACK_HELP1 645 +#define STRING_DIRSTACK_HELP2 646 +#define STRING_DIRSTACK_HELP3 647 +#define STRING_DIRSTACK_HELP4 648 + +#define STRING_ECHO_HELP1 649 +#define STRING_ECHO_HELP2 650 +#define STRING_ECHO_HELP3 651 +#define STRING_ECHO_HELP4 652 +#define STRING_ECHO_HELP5 653 + +#define STRING_EXIT_HELP 654 + +#define STRING_FOR_HELP1 655 + +#define STRING_FREE_HELP1 656 +#define STRING_FREE_HELP2 657 + +#define STRING_IF_HELP1 658 + +#define STRING_GOTO_HELP1 659 + +#define STRING_LABEL_HELP1 660 +#define STRING_LABEL_HELP2 661 +#define STRING_LABEL_HELP3 662 +#define STRING_LABEL_HELP4 663 +#define STRING_LABEL_HELP5 664 + +#define STRING_LOCALE_HELP1 665 + +#define STRING_MKDIR_HELP 666 + +#define STRING_MEMMORY_HELP1 667 +#define STRING_MEMMORY_HELP2 668 + +#define STRING_MISC_HELP1 669 + +#define STRING_MOVE_HELP1 670 +#define STRING_MOVE_HELP2 671 + +#define STRING_MSGBOX_HELP 672 + +#define STRING_PATH_HELP1 673 + +#define STRING_PAUSE_HELP1 674 + +#define STRING_PROMPT_HELP1 675 +#define STRING_PROMPT_HELP2 676 +#define STRING_PROMPT_HELP3 677 + +#define STRING_REM_HELP 678 + +#define STRING_REN_HELP1 679 +#define STRING_REN_HELP2 680 +#define STRING_REN_HELP3 681 + +#define STRING_RMDIR_HELP 682 + +#define STRING_SCREEN_HELP 683 + +#define STRING_SHIFT_HELP 684 + +#define STRING_SET_HELP 685 + +#define STRING_START_HELP1 686 + +#define STRING_TITLE_HELP 687 + +#define STRING_TIME_HELP1 688 +#define STRING_TIME_HELP2 689 + +#define STRING_TIMER_HELP1 690 +#define STRING_TIMER_HELP2 691 +#define STRING_TIMER_HELP3 692 + +#define STRING_TYPE_HELP1 693 + +#define STRING_VERIFY_HELP1 694 +#define STRING_VERIFY_HELP2 695 +#define STRING_VERIFY_HELP3 696 + +#define STRING_VERSION_HELP1 697 +#define STRING_VERSION_HELP2 698 +#define STRING_VERSION_HELP3 699 +#define STRING_VERSION_HELP4 700 +#define STRING_VERSION_HELP5 701 +#define STRING_VERSION_HELP6 702 +#define STRING_VERSION_HELP7 703 +#define STRING_VERSION_RUNVER 705 + +#define STRING_VOL_HELP1 706 +#define STRING_VOL_HELP2 707 +#define STRING_VOL_HELP3 708 +#define STRING_VOL_HELP4 709 + +#define STRING_WINDOW_HELP1 710 +#define STRING_WINDOW_HELP2 711 + +#define STRING_COPY_FILE 712 +#define STRING_DELETE_WIPE 713 +#define STRING_FOR_ERROR 714 +#define STRING_SCREEN_COL 715 +#define STRING_SCREEN_ROW 716 +#define STRING_TIMER_TIME 717 +#define STRING_HELP1 718 +#define STRING_HELP2 719 + +#define STRING_INVALID_OPERAND 720 +#define STRING_EXPECTED_CLOSE_PAREN 721 +#define STRING_EXPECTED_NUMBER_OR_VARIABLE 722 +#define STRING_SYNTAX_COMMAND_INCORRECT 723 +#define STRING_RMDIR_HELP2 724 +#define STRING_MD_ERROR 725 +#define STRING_MD_ERROR2 726 + + +/* These strings are language independent (cmd.rc) */ +#define STRING_FREEDOS_DEV 800 +#define STRING_REACTOS_DEV 801 + +/* EOF */ diff --git a/reactos/base/shell/cmd/screen.c b/reactos/base/shell/cmd/screen.c new file mode 100644 index 00000000000..315e7c83c0f --- /dev/null +++ b/reactos/base/shell/cmd/screen.c @@ -0,0 +1,104 @@ +/* + * SCREEN.C - screen internal command. + * + * clone from 4nt msgbox command + * + * 30 Aug 1999 + * started - Paolo Pantaleo + * + * 30-Apr-2005 (Magnus Olsen) ) + * Remove all hardcode string to En.rc + * + */ + +#include +#include "resource.h" + +#ifdef INCLUDE_CMD_SCREEN + + +INT CommandScreen (LPTSTR cmd, LPTSTR param) +{ + SHORT x,y; + BOOL bSkipText = FALSE; + + if (_tcsncmp (param, _T("/?"), 2) == 0) + { + ConOutResPaging(TRUE,STRING_SCREEN_HELP); + return 0; + } + + nErrorLevel = 0; + + //get row + while(_istspace(*param)) + param++; + + if(!(*param)) + { + error_req_param_missing (); + return 1; + } + + y = _ttoi(param); + if (y<0 || y>(maxy-1)) + { + ConOutResPuts(STRING_SCREEN_ROW); + + return 1; + } + + //get col + if(!(param = _tcschr(param,_T(' ')))) + { + error_req_param_missing (); + return 1; + } + + while(_istspace(*param)) + param++; + + if(!(*param)) + { + error_req_param_missing (); + return 1; + } + + x = _ttoi(param); + if (x<0 || x>(maxx-1)) + { + ConErrResPuts(STRING_SCREEN_COL); + return 1; + } + + //get text + if(!(param = _tcschr(param,_T(' ')))) + { + bSkipText = TRUE; + } + else + { + while(_istspace(*param)) + param++; + + if(!(*param)) + { + bSkipText = TRUE; + } + } + + bIgnoreEcho = TRUE; + + if(bSkipText) + x=0; + + + SetCursorXY(x,y); + + if(!(bSkipText)) + ConOutPuts(param); + + return 0; +} + +#endif /* INCLUDE_CMD_SCREEN */ diff --git a/reactos/base/shell/cmd/set.c b/reactos/base/shell/cmd/set.c new file mode 100644 index 00000000000..e3453602e65 --- /dev/null +++ b/reactos/base/shell/cmd/set.c @@ -0,0 +1,494 @@ +/* + * SET.C - set internal command. + * + * + * History: + * + * 06/14/97 (Tim Norman) + * changed static var in set() to a malloc'd space to pass to putenv. + * need to find a better way to do this, since it seems it is wasting + * memory when variables are redefined. + * + * 07/08/1998 (John P. Price) + * removed call to show_environment in set command. + * moved test for syntax before allocating memory in set command. + * misc clean up and optimization. + * + * 27-Jul-1998 (John P Price ) + * added config.h include + * + * 28-Jul-1998 (John P Price ) + * added set_env function to set env. variable without needing set command + * + * 09-Dec-1998 (Eric Kohl ) + * Added help text ("/?"). + * + * 24-Jan-1999 (Eric Kohl ) + * Fixed Win32 environment handling. + * Unicode and redirection safe! + * + * 25-Feb-1999 (Eric Kohl ) + * Fixed little bug. + * + * 30-Apr-2005 (Magnus Olsen) ) + * Remove all hardcode string to En.rc + */ + +#include +#include +#include +#include "resource.h" + +#ifdef INCLUDE_CMD_SET + + +/* initial size of environment variable buffer */ +#define ENV_BUFFER_SIZE 1024 + +static BOOL +seta_eval ( LPCTSTR expr ); + +static LPCTSTR +skip_ws ( LPCTSTR p ) +{ + return p + _tcsspn ( p, _T(" \t") ); +} + +INT cmd_set (LPTSTR cmd, LPTSTR param) +{ + TCHAR szMsg[RC_STRING_MAX_SIZE]; + INT i; + LPTSTR p; + + if ( !_tcsncmp (param, _T("/?"), 2) ) + { + ConOutResPaging(TRUE,STRING_SET_HELP); + return 0; + } + + /* remove escapes */ + if ( param[0] ) for ( i = 0; param[i+1]; i++ ) + { + if ( param[i] == _T('^') ) + { + memmove ( ¶m[i], ¶m[i+1], _tcslen(¶m[i]) * sizeof(TCHAR) ); + } + } + + /* if no parameters, show the environment */ + if (param[0] == _T('\0')) + { + LPTSTR lpEnv; + LPTSTR lpOutput; + INT len; + + lpEnv = (LPTSTR)GetEnvironmentStrings (); + if (lpEnv) + { + lpOutput = lpEnv; + while (*lpOutput) + { + len = _tcslen(lpOutput); + if (len) + { + if (*lpOutput != _T('=')) + ConOutPuts (lpOutput); + lpOutput += (len + 1); + } + } + FreeEnvironmentStrings (lpEnv); + } + + return 0; + } + + /* the /A does *NOT* have to be followed by a whitespace */ + if ( !_tcsnicmp (param, _T("/A"), 2) ) + { + BOOL Success = seta_eval ( skip_ws(param+2) ); + if(!Success) + { + /*might seem random but this is what windows xp does */ + nErrorLevel = 9165; + } + /* TODO FIXME - what are we supposed to return? */ + return Success; + } + + p = _tcschr (param, _T('=')); + if (p) + { + /* set or remove environment variable */ + *p = _T('\0'); + p++; + if (*p == _T('\0')) + { + p = NULL; + } + SetEnvironmentVariable (param, p); + } + else + { + /* display environment variable */ + LPTSTR pszBuffer; + DWORD dwBuffer; + + pszBuffer = (LPTSTR)malloc (ENV_BUFFER_SIZE * sizeof(TCHAR)); + dwBuffer = GetEnvironmentVariable (param, pszBuffer, ENV_BUFFER_SIZE); + if (dwBuffer == 0) + { + LoadString(CMD_ModuleHandle, STRING_PATH_ERROR, szMsg, RC_STRING_MAX_SIZE); + ConErrPrintf (szMsg, param); + return 0; + } + else if (dwBuffer > ENV_BUFFER_SIZE) + { + pszBuffer = (LPTSTR)realloc (pszBuffer, dwBuffer * sizeof (TCHAR)); + GetEnvironmentVariable (param, pszBuffer, dwBuffer); + } + ConOutPrintf (_T("%s\n"), pszBuffer); + + free (pszBuffer); + + return 0; + } + + return 0; +} + +static INT +ident_len ( LPCTSTR p ) +{ + LPCTSTR p2 = p; + if ( __iscsymf(*p) ) + { + ++p2; + while ( __iscsym(*p2) ) + ++p2; + } + return p2-p; +} + +#define PARSE_IDENT(ident,identlen,p) \ + identlen = ident_len(p); \ + ident = (LPTSTR)alloca ( ( identlen + 1 ) * sizeof(TCHAR) ); \ + memmove ( ident, p, identlen * sizeof(TCHAR) ); \ + ident[identlen] = 0; \ + p += identlen; + +static BOOL +seta_identval ( LPCTSTR ident, INT* result ) +{ + LPCTSTR identVal = GetEnvVarOrSpecial ( ident ); + if ( !identVal ) + { + /* TODO FIXME - what to do upon failure? */ + *result = 0; + return FALSE; + } + *result = _ttoi ( identVal ); + return TRUE; +} + +static BOOL +calc ( INT* lval, TCHAR op, INT rval ) +{ + switch ( op ) + { + case '*': + *lval *= rval; + break; + case '/': + *lval /= rval; + break; + case '%': + *lval %= rval; + break; + case '+': + *lval += rval; + break; + case '-': + *lval -= rval; + break; + case '&': + *lval &= rval; + break; + case '^': + *lval ^= rval; + break; + case '|': + *lval |= rval; + break; + default: + ConErrResPuts ( STRING_INVALID_OPERAND ); + return FALSE; + } + return TRUE; +} + +static BOOL +seta_stmt ( LPCTSTR* p_, INT* result ); + +static BOOL +seta_unaryTerm ( LPCTSTR* p_, INT* result ) +{ + LPCTSTR p = *p_; + if ( *p == _T('(') ) + { + INT rval; + p = skip_ws ( p + 1 ); + if ( !seta_stmt ( &p, &rval ) ) + return FALSE; + if ( *p != _T(')') ) + { + ConErrResPuts ( STRING_EXPECTED_CLOSE_PAREN ); + return FALSE; + } + *result = rval; + p = skip_ws ( p + 1 ); + } + else if ( isdigit(*p) ) + { + *result = _ttoi ( p ); + p = skip_ws ( p + _tcsspn ( p, _T("1234567890") ) ); + } + else if ( __iscsymf(*p) ) + { + LPTSTR ident; + INT identlen; + PARSE_IDENT(ident,identlen,p); + if ( !seta_identval ( ident, result ) ) + return FALSE; + } + else + { + ConErrResPuts ( STRING_EXPECTED_NUMBER_OR_VARIABLE ); + return FALSE; + } + *p_ = p; + return TRUE; +} + +static BOOL +seta_mulTerm ( LPCTSTR* p_, INT* result ) +{ + LPCTSTR p = *p_; + TCHAR op = 0; + INT rval; + if ( _tcschr(_T("!~-"),*p) ) + { + op = *p; + p = skip_ws ( p + 1 ); + } + if ( !seta_unaryTerm ( &p, &rval ) ) + return FALSE; + switch ( op ) + { + case '!': + rval = !rval; + break; + case '~': + rval = ~rval; + break; + case '-': + rval = -rval; + break; + } + + *result = rval; + *p_ = p; + return TRUE; +} + +static BOOL +seta_ltorTerm ( LPCTSTR* p_, INT* result, LPCTSTR ops, BOOL (*subTerm)(LPCTSTR*,INT*) ) +{ + LPCTSTR p = *p_; + INT lval; + if ( !subTerm ( &p, &lval ) ) + return FALSE; + while ( *p && _tcschr(ops,*p) ) + { + INT rval; + TCHAR op = *p; + + p = skip_ws ( p+1 ); + + if ( !subTerm ( &p, &rval ) ) + return FALSE; + + if ( !calc ( &lval, op, rval ) ) + return FALSE; + } + + *result = lval; + *p_ = p; + return TRUE; +} + +static BOOL +seta_addTerm ( LPCTSTR* p_, INT* result ) +{ + return seta_ltorTerm ( p_, result, _T("*/%"), seta_mulTerm ); +} + +static BOOL +seta_logShiftTerm ( LPCTSTR* p_, INT* result ) +{ + return seta_ltorTerm ( p_, result, _T("+-"), seta_addTerm ); +} + +static BOOL +seta_bitAndTerm ( LPCTSTR* p_, INT* result ) +{ + LPCTSTR p = *p_; + INT lval; + if ( !seta_logShiftTerm ( &p, &lval ) ) + return FALSE; + while ( *p && _tcschr(_T("<>"),*p) && p[0] == p[1] ) + { + INT rval; + TCHAR op = *p; + + p = skip_ws ( p+2 ); + + if ( !seta_logShiftTerm ( &p, &rval ) ) + return FALSE; + + switch ( op ) + { + case '<': + lval <<= rval; + break; + case '>': + lval >>= rval; + break; + default: + ConErrResPuts ( STRING_INVALID_OPERAND ); + return FALSE; + } + } + + *result = lval; + *p_ = p; + return TRUE; +} + +static BOOL +seta_bitExclOrTerm ( LPCTSTR* p_, INT* result ) +{ + return seta_ltorTerm ( p_, result, _T("&"), seta_bitAndTerm ); +} + +static BOOL +seta_bitOrTerm ( LPCTSTR* p_, INT* result ) +{ + return seta_ltorTerm ( p_, result, _T("^"), seta_bitExclOrTerm ); +} + +static BOOL +seta_expr ( LPCTSTR* p_, INT* result ) +{ + return seta_ltorTerm ( p_, result, _T("|"), seta_bitOrTerm ); +} + +static BOOL +seta_assignment ( LPCTSTR* p_, INT* result ) +{ + LPCTSTR p = *p_; + LPTSTR ident; + TCHAR op = 0; + INT identlen, exprval; + + PARSE_IDENT(ident,identlen,p); + if ( identlen ) + { + if ( *p == _T('=') ) + op = *p, p = skip_ws(p+1); + else if ( _tcschr ( _T("*/%+-&^|"), *p ) && p[1] == _T('=') ) + op = *p, p = skip_ws(p+2); + else if ( _tcschr ( _T("<>"), *p ) && *p == p[1] && p[2] == _T('=') ) + op = *p, p = skip_ws(p+3); + } + + /* allow to chain multiple assignments, such as: a=b=1 */ + if ( ident && op ) + { + INT identval; + LPTSTR buf; + + if ( !seta_assignment ( &p, &exprval ) ) + return FALSE; + + if ( !seta_identval ( ident, &identval ) ) + identval = 0; + switch ( op ) + { + case '=': + identval = exprval; + break; + case '<': + identval <<= exprval; + break; + case '>': + identval >>= exprval; + break; + default: + if ( !calc ( &identval, op, exprval ) ) + return FALSE; + } + buf = (LPTSTR)alloca ( 32 * sizeof(TCHAR) ); + _sntprintf ( buf, 32, _T("%i"), identval ); + SetEnvironmentVariable ( ident, buf ); // TODO FIXME - check return value + exprval = identval; + } + else + { + /* restore p in case we found an ident but not an op */ + p = *p_; + if ( !seta_expr ( &p, &exprval ) ) + return FALSE; + } + + *result = exprval; + *p_ = p; + return TRUE; +} + +static BOOL +seta_stmt ( LPCTSTR* p_, INT* result ) +{ + LPCTSTR p = *p_; + INT rval; + + if ( !seta_assignment ( &p, &rval ) ) + return FALSE; + while ( *p == _T(',') ) + { + p = skip_ws ( p+1 ); + + if ( !seta_assignment ( &p, &rval ) ) + return FALSE; + } + + *result = rval; + *p_ = p; + return TRUE; +} + +static BOOL +seta_eval ( LPCTSTR p ) +{ + INT rval; + if ( !*p ) + { + ConErrResPuts ( STRING_SYNTAX_COMMAND_INCORRECT ); + return FALSE; + } + if ( !seta_stmt ( &p, &rval ) ) + return FALSE; + ConOutPrintf ( _T("%i"), rval ); + return TRUE; +} + +#endif diff --git a/reactos/base/shell/cmd/seta_test.cmd b/reactos/base/shell/cmd/seta_test.cmd new file mode 100644 index 00000000000..bb26e59f41b --- /dev/null +++ b/reactos/base/shell/cmd/seta_test.cmd @@ -0,0 +1,116 @@ +@echo off + +@rem the next line reexecutes the script without params if it was called with params, else we'll get false failures +@if not "%1"=="" seta_test.cmd + +@rem the next two lines illustrate bug in existing if code +if not "=="=="==" goto failure +if "=="=="==" goto next1 +goto failure +:next1 +if "1"=="2" goto failure +if not "1"=="1" goto failure +set /a a=1 +echo. +if not "%a%"=="1" goto failure +set /a b=a +echo. +if not "%b%"=="1" goto failure +set /a a=!5 +echo. +if not "%a%"=="0" goto failure +set /a a=!a +echo. +if not "%a%"=="1" goto failure +set /a a=~5 +echo. +if not "%a%"=="-6" goto failure +set /a a=5,a=-a +echo. +if not "%a%"=="-5" goto failure +set /a a=5*7 +echo. +if not "%a%"=="35" goto failure +set /a a=2000/10 +echo. +if not "%a%"=="200" goto failure +set /a a=42%%9 +echo. +if not "%a%"=="6" goto failure +set /a a=5%2 +echo. +if not "%a%"=="5" goto failure +set /a a=42^%13 +echo. +if not "%a%"=="423" goto failure +set /a a=7+9 +echo. +if not "%a%"=="16" goto failure +set /a a=9-7 +echo. +if not "%a%"=="2" goto failure +set /a a=9^<^<2 +echo. +if not "%a%"=="36" goto failure +set /a a=36^>^>2 +echo. +if not "%a%"=="9" goto failure +set /a a=42^&9 +echo. +if not "%a%"=="8" goto failure +set /a a=32^9 +echo. +if not "%a%"=="329" goto failure +set /a a=32^^9 +echo. +if not "%a%"=="41" goto failure +set /a a=10^|22 +echo. +if not "%a%"=="30" goto failure +set /a a=2,a*=3 +echo. +if not "%a%"=="6" goto failure +set /a a=11,a/=2 +echo. +if not "%a%"=="5" goto failure +set /a a=42,a%%=9 +echo. +if not "%a%"=="6" goto failure +set /a a=7,a+=9 +echo. +if not "%a%"=="16" goto failure +set /a a=9,a-=7 +echo. +if not "%a%"=="2" goto failure +set /a a=42,a^&=9 +echo. +if not "%a%"=="8" goto failure +set /a a=32,a^^=9 +echo. +if not "%a%"=="41" goto failure +set /a a=10,a^|=22 +echo. +if not "%a%"=="30" goto failure +set /a a=9,a^<^<=2 +echo. +if not "%a%"=="36" goto failure +set /a a=36,a^>^>=2 +echo. +if not "%a%"=="9" goto failure +set /a a=1,2 +echo. +if not "%a%"=="1" goto failure +set /a a=(a=1,a+2) +echo. +if "%a%"=="3" goto success +goto failure + +:success +echo SUCCESS! +echo. +goto done + +:failure +echo FAILURE! remove the echo off and see the last formula that executed before this line +echo. +:done diff --git a/reactos/base/shell/cmd/shift.c b/reactos/base/shell/cmd/shift.c new file mode 100644 index 00000000000..82c1f39d51b --- /dev/null +++ b/reactos/base/shell/cmd/shift.c @@ -0,0 +1,73 @@ +/* + * SHIFT.C - shift internal batch command + * + * + * History: + * + * 16 Jul 1998 (Hans B Pufal) + * started. + * + * 16 Jul 1998 (John P Price) + * Separated commands into individual files. + * + * 27-Jul-1998 (John P Price ) + * added config.h include + * + * 07-Jan-1999 (Eric Kohl ) + * Added help text ("shift /?") and cleaned up. + * + * 20-Jan-1999 (Eric Kohl ) + * Unicode and redirection safe! + * + * 30-Apr-2005 (Magnus Olsen) ) + * Remove all hardcode string to En.rc + */ + +#include +#include "resource.h" + + +/* + * Perform the SHIFT command. + * + * Only valid inside batch files. + * + * FREEDOS extension : optional parameter DOWN to allow shifting + * parameters backwards. + * + */ + +INT cmd_shift (LPTSTR cmd, LPTSTR param) +{ + +#ifdef _DEBUG + DebugPrintf (_T("cmd_shift: (\'%s\', \'%s\')\n"), cmd, param); +#endif + + if (!_tcsncmp (param, _T("/?"), 2)) + { + ConOutResPaging(TRUE,STRING_SHIFT_HELP); + return 0; + } + + nErrorLevel = 0; + + if (bc == NULL) + { + /* not in batch - error!! */ + nErrorLevel = 1; + return 1; + } + + if (!_tcsicmp (param, _T("down"))) + { + if (bc->shiftlevel) + bc->shiftlevel--; + } + else /* shift up */ + bc->shiftlevel++; + + return 0; +} + +/* EOF */ diff --git a/reactos/base/shell/cmd/start.c b/reactos/base/shell/cmd/start.c new file mode 100644 index 00000000000..4899aa94384 --- /dev/null +++ b/reactos/base/shell/cmd/start.c @@ -0,0 +1,279 @@ +/* + * START.C - start internal command. + * + * + * History: + * + * 24-Jul-1999 (Eric Kohl ) + * Started. + * + * 30-Apr-2005 (Magnus Olsen) ) + * Remove all hardcode string to En.rc + */ + +#include +#include "resource.h" + +#ifdef INCLUDE_CMD_START + + +INT cmd_start (LPTSTR First, LPTSTR Rest) +{ + TCHAR szFullName[CMDLINE_LENGTH]; + TCHAR first[CMDLINE_LENGTH]; + TCHAR *rest = NULL; + TCHAR *param = NULL; + INT size; + LPTSTR comspec; + BOOL bWait = FALSE; + BOOL bBat = FALSE; + BOOL bCreate = FALSE; + TCHAR szFullCmdLine [CMDLINE_LENGTH]; + PROCESS_INFORMATION prci; + STARTUPINFO stui; + + + + if (_tcsncmp (Rest, _T("/?"), 2) == 0) + { + ConOutResPaging(TRUE,STRING_START_HELP1); + return 0; + } + + /* get comspec */ + comspec = malloc ( MAX_PATH * sizeof(TCHAR)); + if (comspec == NULL) + { + error_out_of_memory(); + return 1; + } + SetLastError(0); + size = GetEnvironmentVariable (_T("COMSPEC"), comspec, 512); + if(GetLastError() == ERROR_ENVVAR_NOT_FOUND) + { + Rest = _T("cmd"); + } + else + { + if (size > MAX_PATH) + { + comspec = realloc(comspec,size * sizeof(TCHAR) ); + if (comspec==NULL) + { + return 1; + } + size = GetEnvironmentVariable (_T("COMSPEC"), comspec, size); + } + } + + nErrorLevel = 0; + + if( !*Rest ) + { + _tcscpy(Rest,_T("\"")); + _tcscat(Rest,comspec); + _tcscat(Rest,_T("\"")); + } + + rest = malloc ( _tcslen(Rest) + 1 * sizeof(TCHAR)); + if (rest == NULL) + { + if(comspec != NULL) + free(comspec); + error_out_of_memory(); + return 1; + } + + param =malloc ( _tcslen(Rest) + 1 * sizeof(TCHAR)); + if (rest == NULL) + { + if(comspec != NULL) + free(comspec); + free(rest); + error_out_of_memory(); + return 1; + } + + param[0] = _T('\0'); + + + _tcscpy(rest,Rest); + + /* Parsing the command that gets called by start, and it's parameters */ + if(!_tcschr(rest,_T('\"'))) + { + INT i = 0; + INT count = _tcslen(rest); + + /* find the end of the command and start of the args */ + for(i = 0; i < count; i++) + { + if(rest[i] == _T(' ')) + { + + _tcscpy(param,&rest[i]); + rest[i] = _T('\0'); + break; + } + } + } + else + { + INT i = 0; + INT count = _tcslen(rest); + BOOL bInside = FALSE; + + /* find the end of the command and put the arguments in param */ + for(i = 0; i < count; i++) + { + if(rest[i] == _T('\"')) + bInside = !bInside; + if((rest[i] == _T(' ')) && !bInside) + { + _tcscpy(param,&rest[i]); + rest[i] = _T('\0'); + break; + } + } + i = 0; + /* remove any slashes */ + while(i < count) + { + if(rest[i] == _T('\"')) + memmove(&rest[i],&rest[i + 1], _tcslen(&rest[i]) * sizeof(TCHAR)); + else + i++; + } + } + + /* check for a drive change */ + + if (!_tcscmp (first + 1, _T(":")) && _istalpha (*first)) + { + TCHAR szPath[CMDLINE_LENGTH]; + + _tcscpy (szPath, _T("A:")); + szPath[0] = _totupper (*first); + SetCurrentDirectory (szPath); + GetCurrentDirectory (CMDLINE_LENGTH, szPath); + if (szPath[0] != (TCHAR)_totupper (*first)) + ConErrResPuts (STRING_FREE_ERROR1); + + if (rest != NULL) + free(rest); + + if (param != NULL) + free(param); + if (comspec != NULL) + free(comspec); + return 0; + } + + /* get the PATH environment variable and parse it */ + /* search the PATH environment variable for the binary */ + if (!SearchForExecutable (rest, szFullName)) + { + error_bad_command (); + + if (rest != NULL) + free(rest); + + if (param != NULL) + free(param); + + if (comspec != NULL) + free(comspec); + return 1; + } + + + /* check if this is a .BAT or .CMD file */ + if (!_tcsicmp (_tcsrchr (szFullName, _T('.')), _T(".bat")) || + !_tcsicmp (_tcsrchr (szFullName, _T('.')), _T(".cmd"))) + { + bBat = TRUE; + memset(szFullCmdLine,0,CMDLINE_LENGTH * sizeof(TCHAR)); + + + _tcscpy(szFullCmdLine,comspec); + + memcpy(&szFullCmdLine[_tcslen(szFullCmdLine)],_T("\" /K \""), 6 * sizeof(TCHAR)); + memcpy(&szFullCmdLine[_tcslen(szFullCmdLine)], szFullName, _tcslen(szFullName) * sizeof(TCHAR)); + memcpy(&szFullCmdLine[1], &szFullCmdLine[0], _tcslen(szFullCmdLine) * sizeof(TCHAR)); + szFullCmdLine[0] = _T('\"'); + szFullCmdLine[_tcslen(szFullCmdLine)] = _T('\"'); + } + +#ifdef _DEBUG + DebugPrintf (_T("[BATCH: %s %s]\n"), szFullName, rest); +#endif + + +#ifdef _DEBUG + DebugPrintf (_T("[EXEC: %s %s]\n"), szFullName, rest); +#endif + /* build command line for CreateProcess() */ + if (bBat == FALSE) + { + _tcscpy (szFullCmdLine, first); + if( param != NULL ) + { + + _tcscat(szFullCmdLine, _T(" ") ); + _tcscat (szFullCmdLine, param); + } + } + + /* fill startup info */ + memset (&stui, 0, sizeof (STARTUPINFO)); + stui.cb = sizeof (STARTUPINFO); + stui.dwFlags = STARTF_USESHOWWINDOW; + stui.wShowWindow = SW_SHOWDEFAULT; + + if (bBat == TRUE) + { + bCreate = CreateProcess (NULL, szFullCmdLine, NULL, NULL, FALSE, + CREATE_NEW_CONSOLE, NULL, NULL, &stui, &prci); + } + else + { + bCreate = CreateProcess (szFullName, szFullCmdLine, NULL, NULL, FALSE, + CREATE_NEW_CONSOLE, NULL, NULL, &stui, &prci); + } + + if (bCreate) + { + if (bWait) + { + DWORD dwExitCode; + WaitForSingleObject (prci.hProcess, INFINITE); + GetExitCodeProcess (prci.hProcess, &dwExitCode); + nErrorLevel = (INT)dwExitCode; + } + CloseHandle (prci.hThread); + CloseHandle (prci.hProcess); + /* Get New code page if it has change */ + InputCodePage= GetConsoleCP(); + OutputCodePage = GetConsoleOutputCP(); + } + else + { + ErrorMessage(GetLastError (), + _T("Error executing CreateProcess()!!\n")); + } + + + if (rest != NULL) + free(rest); + + if (param != NULL) + free(param); + + if (comspec != NULL) + free(comspec); + return 0; +} + +#endif + +/* EOF */ diff --git a/reactos/base/shell/cmd/strtoclr.c b/reactos/base/shell/cmd/strtoclr.c new file mode 100644 index 00000000000..b4601a508af --- /dev/null +++ b/reactos/base/shell/cmd/strtoclr.c @@ -0,0 +1,284 @@ +/* + * STRTOCLR.C - read color (for color command and other) + * + * + * History: + * + * 07-Oct-1999 (Paolo Pantaleo) + * Started. + * + * + */ + +/*only +BOOL StringToColor(LPWORD lpColor, LPTSTR*str) +is to be called +other are internal service functions*/ + + +#include + +#define _B FOREGROUND_BLUE +#define _G FOREGROUND_GREEN +#define _R FOREGROUND_RED +#define _I FOREGROUND_INTENSITY + + +/*return values for chop_blank*/ +#define CP_OK 0 +#define CP_BLANK_NOT_FOUND 1 +#define CP_END_OF_STRING 2 + +#define SC_HEX 0x0100 +#define SC_TXT 0x0200 + + + +typedef struct _CLRTABLE +{ + LPTSTR name; + WORD val; +} CLRTABLE; + + +CLRTABLE clrtable[] = +{ + {_T("bla") ,0 }, + {_T("blu") ,_B }, + {_T("gre") ,_G }, + {_T("cya") ,_B|_G }, + {_T("red") ,_R }, + {_T("mag") ,_B|_R }, + {_T("yel") ,_R|_G }, + {_T("whi") ,_R|_G|_B }, + {_T("gra") ,_I }, + + + {_T("0") ,0 }, + {_T("2") ,_G }, + {_T("3") ,_B|_G }, + {_T("4") ,_R }, + {_T("5") ,_B|_R }, + {_T("6") ,_R|_G }, + {_T("7") ,_R|_G|_B }, + + {_T("8") ,_I }, + {_T("9") ,_I|_B }, + {_T("10") ,_I|_G }, + {_T("11") ,_I|_B|_G }, + {_T("12") ,_I|_R }, + {_T("13") ,_I|_B|_R }, + {_T("14") ,_I|_R|_G }, + {_T("15") ,_I|_R|_G|_B }, + + + /* note that 1 is at the end of list + to avoid to confuse it with 10-15*/ + {_T("1") ,_B }, + + /*cyan synonimous*/ + {_T("aqu") ,_B|_G }, + /*magenta synonimous*/ + {_T("pur") ,_B|_R }, + + + {_T("") ,0}, +}; + + + +/* +move string pointer to next word (skip all spaces) +on erro retunr nonzero value +*/ +static +INT chop_blank(LPTSTR *arg_str) +{ + + LPTSTR str; + str = _tcschr(*arg_str,_T(' ')); + if(!str) + { + str = _tcschr (*arg_str, _T('\0')); + if(str != NULL) + *arg_str=str; + return CP_BLANK_NOT_FOUND; + } + + + + while(_istspace(*str)) + str++; + + if (*str == _T('\0')) + { + *arg_str=str; + return CP_END_OF_STRING; + } + + *arg_str = str; + + return CP_OK; +} + + + +/* +read a color value in hex (like win nt's cmd syntax) +if an error occurs return -1 +*/ +static +WORD hex_clr(LPTSTR str) +{ + WORD ret= (WORD)-1; + TCHAR ch; + + ch = str[1]; + + if(_istdigit(ch)) + ret = ch-_T('0'); + else + { + ch=_totupper(ch); + + if( ch >= _T('A') && ch <= _T('F') ) + ret = ch-_T('A')+10; + else + return (WORD)-1; + } + + + ch = str[0]; + + if(_istdigit(ch)) + ret |= (ch-_T('0')) << 4; + else + { + ch=_totupper(ch); + + if( ch >= _T('A') && ch <= _T('F') ) + ret |= (ch-_T('A')+10) <<4; + else + return (WORD)-1; + } + + return ret; +} + + +/* +read a color value from a string (like 4nt's syntax) +if an error occurs return -1 +*/ +static +WORD txt_clr(LPTSTR str) +{ + INT i; + + for(i = 0; *(clrtable[i].name); i++) + if (_tcsnicmp(str, clrtable[i].name, _tcslen(clrtable[i].name)) == 0) + return clrtable[i].val; + + return (WORD)-1; +} + + + +/*search for x on y*/ +static +WORD str_to_color(LPTSTR* arg_str) +{ + LPTSTR str; + BOOL bBri; + + WORD tmp_clr,ret_clr; + + str = *arg_str; + + if (!(*str)) + return (WORD)-1; + + + /*foreground*/ + bBri = FALSE; + + if (_tcsnicmp(str,_T("bri"),3) == 0) + { + bBri = TRUE; + + if (chop_blank(&str)) + return (WORD)-1; + } + + if ((tmp_clr = txt_clr(str)) == (WORD)-1) + { + return (WORD)-1; + } + + /*skip spaces and "on"*/ + if (chop_blank(&str) || chop_blank(&str)) + return (WORD)-1; + + ret_clr = tmp_clr | (bBri << 3); + + /*background*/ + bBri = FALSE; + + if(_tcsnicmp(str,_T("bri"),3) == 0 ) + { + bBri = TRUE; + + if(chop_blank(&str)) + return (WORD)-1; + } + + + if( (tmp_clr = txt_clr(str)) == (WORD)-1 ) + return (WORD)-1; + + chop_blank(&str); + + *arg_str = str; + + return SC_HEX | ret_clr | tmp_clr << 4 | bBri << 7; +} + + + +/****main function****/ +/* +the only parameter is arg_str, a pointer to a string. +the string is modified so it will begin to first word after +color specification +(only the char* is moved, no chars in the string are modfied) + + +it returns the color in the l.o. byte, plus two flags in the +h.o. byte, they are: +SC_HEX win nt's cmd syntax (for exampl a0) +SC_TXT 4nt's syntax ( "bri gre on bla" or "10 on 0") + +if succedes also move the LPTSTR to end of +string that specify color +*/ + + +BOOL StringToColor(LPWORD lpColor, LPTSTR*str) +{ + WORD wRet; + + wRet = str_to_color (str); + if (wRet == (WORD)-1) + { + wRet=hex_clr (*str); + chop_blank (str); + if (wRet == (WORD)-1) + return FALSE; + } + + *lpColor = wRet; + + return TRUE; +} + +/* EOF */ diff --git a/reactos/base/shell/cmd/tests/cmd_test.xml b/reactos/base/shell/cmd/tests/cmd_test.xml new file mode 100644 index 00000000000..13a420111e7 --- /dev/null +++ b/reactos/base/shell/cmd/tests/cmd_test.xml @@ -0,0 +1,15 @@ + + . + include/wine + . + + + 0x0501 + rtshared + regtests + cmd_base + pseh + ntdll + setup.c + + diff --git a/reactos/base/shell/cmd/tests/setup.c b/reactos/base/shell/cmd/tests/setup.c new file mode 100644 index 00000000000..66e28a8c8c8 --- /dev/null +++ b/reactos/base/shell/cmd/tests/setup.c @@ -0,0 +1,23 @@ +/* + * Copyright (C) 2005 Casper S. Hornstrup + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ +#include +#include "regtests.h" + +_SetupOnce() +{ +} diff --git a/reactos/base/shell/cmd/tests/stubs.xml b/reactos/base/shell/cmd/tests/stubs.xml new file mode 100644 index 00000000000..1c964b3eb62 --- /dev/null +++ b/reactos/base/shell/cmd/tests/stubs.xml @@ -0,0 +1,84 @@ + + FindFirstFileA@8 + GetLastError@0 + FindNextFileA@8 + FindClose@4 + GetFileAttributesA@4 + GetCurrentDirectoryA@8 + GetFullPathNameA@16 + CloseHandle@4 + CreateFileA@28 + Beep@8 + LoadStringA@16 + SetConsoleCP@4 + SetConsoleOutputCP@4 + WaitForSingleObject@8 + ReadConsoleInputA@16 + GetTickCount@0 + GetConsoleScreenBufferInfo@8 + FillConsoleOutputAttribute@20 + FillConsoleOutputCharacterA@20 + SetConsoleCursorPosition@8 + LoadLibraryA@4 + GetProcAddress@8 + SetCurrentDirectoryA@4 + SetConsoleMode@8 + CreateProcessA@40 + GetExitCodeProcess@8 + GetConsoleOutputCP@0 + GetTempPathA@8 + GetTempFileNameA@16 + GetCurrentProcess@0 + DuplicateHandle@28 + GetFileType@4 + SetFilePointer@16 + GetTimeFormatA@24 + GetDateFormatA@24 + GetEnvironmentVariableA@12 + GenerateConsoleCtrlEvent@8 + SetConsoleCtrlHandler@8 + GetVersionExA@4 + ExitProcess@4 + GetModuleFileNameA@12 + SetEnvironmentVariableA@8 + SetConsoleTextAttribute@8 + FlushConsoleInputBuffer@4 + WriteFile@20 + FormatMessageA@28 + LocalFree@4 + GetConsoleCP@0 + GetStdHandle@4 + FreeLibrary@4 + SetLastError@4 + SetStdHandle@8 + DeleteFileA@4 + FileTimeToLocalFileTime@8 + GetVolumeInformationA@32 + RemoveDirectoryA@4 + CreateDirectoryA@8 + GetLocaleInfoA@16 + GlobalMemoryStatus@4 + GetEnvironmentStrings@0 + FreeEnvironmentStringsA@4 + LocalFree + SetLocalTime@4 + GetLocalTime@4 + SetFileAttributesA@8 + SetFileApisToOEM@0 + GetConsoleMode@8 + SetConsoleCursorInfo@8 + ReadFile@20 + SetFileTime@16 + FileTimeToSystemTime@8 + GetDiskFreeSpaceA@20 + SetVolumeLabelA@8 + SetConsoleTitleA@4 + MoveFileExA@12 + GetFileTime@16 + Sleep@4 + MoveFileA@8 + CreateSemaphoreA@16 + InterlockedIncrement@4 + InterlockedDecrement@4 + ReleaseSemaphore@12 + diff --git a/reactos/base/shell/cmd/time.c b/reactos/base/shell/cmd/time.c new file mode 100644 index 00000000000..13ef34b431d --- /dev/null +++ b/reactos/base/shell/cmd/time.c @@ -0,0 +1,215 @@ +/* + * TIME.C - time internal command. + * + * + * History: + * + * 07/08/1998 (John P. Price) + * started. + * + * 27-Jul-1998 (John P Price ) + * added config.h include + * + * 09-Jan-1999 (Eric Kohl ) + * Added locale support. + * + * 19-Jan-1999 (Eric Kohl ) + * Unicode and redirection safe! + * Added "/t" option. + * + * 04-Feb-1999 (Eric Kohl ) + * Fixed time input bug. + * + * 30-Apr-2005 (Magnus Olsen) ) + * Remove all hardcode string to En.rc. + */ + +#include +#include "resource.h" + +#ifdef INCLUDE_CMD_TIME + + +static BOOL ParseTime (LPTSTR s) +{ + SYSTEMTIME t; + LPTSTR p = s; + + if (!*s) + return TRUE; + + GetLocalTime (&t); + t.wHour = 0; + t.wMinute = 0; + t.wSecond = 0; + t.wMilliseconds = 0; + + // first get hour + if (_istdigit(*p)) + { + while (_istdigit(*p)) + { + t.wHour = t.wHour * 10 + *p - _T('0'); + p++; + } + } + else + return FALSE; + + // get time separator + if (*p != cTimeSeparator) + return FALSE; + p++; + + // now get minutes + if (_istdigit(*p)) + { + while (_istdigit(*p)) + { + t.wMinute = t.wMinute * 10 + *p - _T('0'); + p++; + } + } + else + return FALSE; + + // get time separator + if (*p != cTimeSeparator) + return FALSE; + p++; + + // now get seconds + if (_istdigit(*p)) + { + while (_istdigit(*p)) + { + t.wSecond = t.wSecond * 10 + *p - _T('0'); + p++; + } + } + else + return FALSE; + + // get decimal separator + if (*p == cDecimalSeparator) + { + p++; + + // now get hundreths + if (_istdigit(*p)) + { + while (_istdigit(*p)) + { +// t.wMilliseconds = t.wMilliseconds * 10 + *p - _T('0'); + p++; + } +// t.wMilliseconds *= 10; + } + } + + /* special case: 12 hour format */ + if (nTimeFormat == 0) + { + if (_totupper(*s) == _T('P')) + { + t.wHour += 12; + } + + if ((_totupper(*s) == _T('A')) && (t.wHour == 12)) + { + t.wHour = 0; + } + } + + if (t.wHour > 23 || t.wMinute > 60 || t.wSecond > 60 || t.wMilliseconds > 999) + return FALSE; + + SetLocalTime (&t); + + return TRUE; +} + + +INT cmd_time (LPTSTR cmd, LPTSTR param) +{ + LPTSTR *arg; + INT argc; + INT i; + BOOL bPrompt = TRUE; + INT nTimeString = -1; + + if (!_tcsncmp (param, _T("/?"), 2)) + { + ConOutResPaging(TRUE,STRING_TIME_HELP1); + return 0; + } + + nErrorLevel = 0; + + /* build parameter array */ + arg = split (param, &argc, FALSE); + + /* check for options */ + for (i = 0; i < argc; i++) + { + if (_tcsicmp (arg[i], _T("/t")) == 0) + bPrompt = FALSE; + + if ((*arg[i] != _T('/')) && (nTimeString == -1)) + nTimeString = i; + } + + if (nTimeString == -1) + PrintTime (); + + if (!bPrompt) + { + freep (arg); + return 0; + } + + while (1) + { + if (nTimeString == -1) + { + TCHAR s[40]; + + ConOutResPuts(STRING_TIME_HELP2); + + ConInString (s, 40); + +#ifdef _DEBUG + DebugPrintf (_T("\'%s\'\n"), s); +#endif + + while (*s && s[_tcslen (s) - 1] < _T(' ')) + s[_tcslen(s) - 1] = _T('\0'); + + if (ParseTime (s)) + { + freep (arg); + return 0; + } + } + else + { + if (ParseTime (arg[nTimeString])) + { + freep (arg); + return 0; + } + + /* force input the next time around. */ + nTimeString = -1; + } + + ConErrResPuts(STRING_TIME_ERROR1); + nErrorLevel = 1; + } + + freep (arg); + + return 0; +} + +#endif diff --git a/reactos/base/shell/cmd/timer.c b/reactos/base/shell/cmd/timer.c new file mode 100644 index 00000000000..34567dafa40 --- /dev/null +++ b/reactos/base/shell/cmd/timer.c @@ -0,0 +1,233 @@ +/* + * TIMER.C - timer internal command. + * + * clone from 4nt timer command + * + * 20 Aug 1999 + * started - Paolo Pantaleo + */ + +#include +#include "resource.h" + +#ifdef INCLUDE_CMD_TIMER + + +#define NCS_NOT_SPECIFIED -1 +#define NCS_ON 1 +#define NCS_OFF 0 + + + + + +//print timer value +#define PT(format) PrintElapsedTime(GetTickCount()-cT,format) + + +//current timer Time (at wich started to count) +#define cT clksT[clk_n] + +//current timer status +#define cS clksS[clk_n] + + +static VOID +PrintElapsedTime (DWORD time,INT format) +{ + TCHAR szMsg[RC_STRING_MAX_SIZE]; + DWORD h,m,s,ms; + +#ifdef _DEBUG + DebugPrintf(_T("PrintTime(%d,%d)"),time,format); +#endif + + switch (format) + { + case 0: + LoadString(CMD_ModuleHandle, STRING_TIMER_HELP1, szMsg, RC_STRING_MAX_SIZE); + ConOutPrintf(szMsg, time); + break; + + case 1: + ms = time % 1000; + time /= 1000; + s = time % 60; + time /=60; + m = time % 60; + h = time / 60; + LoadString( CMD_ModuleHandle, STRING_TIMER_HELP2, szMsg, RC_STRING_MAX_SIZE); + ConOutPrintf(szMsg, + h, cTimeSeparator, + m, cTimeSeparator, + s, cDecimalSeparator, ms/10); + break; + } +} + + +INT CommandTimer (LPTSTR cmd, LPTSTR param) +{ + TCHAR szMsg[RC_STRING_MAX_SIZE]; + + // all timers are kept + static DWORD clksT[10]; + + // timers status + // set all the clocks off by default + static BOOL clksS[10]={FALSE,FALSE,FALSE,FALSE, + FALSE,FALSE,FALSE,FALSE,FALSE,FALSE}; + + // TRUE if /S in command line + BOOL bS = FALSE; + + // avoid to set clk_n more than once + BOOL bCanNSet = TRUE; + + INT NewClkStatus = NCS_NOT_SPECIFIED; + + // the clock number specified on the command line + // 1 by default + INT clk_n=1; + + // output format + INT iFormat=1; + + + // command line parsing variables + INT argc; + LPTSTR *p; + + INT i; + + if (_tcsncmp (param, _T("/?"), 2) == 0) + { + LoadString(CMD_ModuleHandle, STRING_TIMER_HELP3, szMsg, RC_STRING_MAX_SIZE); + ConOutPrintf(szMsg, cTimeSeparator, cTimeSeparator, cDecimalSeparator); + return 0; + } + + nErrorLevel = 0; + + LoadString( CMD_ModuleHandle, STRING_TIMER_TIME, szMsg, RC_STRING_MAX_SIZE); + + p = split (param, &argc, FALSE); + + //read options + for (i = 0; i < argc; i++) + { + //set timer on + if (!(_tcsicmp(&p[i][0],_T("on"))) && NewClkStatus == NCS_NOT_SPECIFIED) + { + NewClkStatus = NCS_ON; + continue; + } + + //set timer off + if (!(_tcsicmp(&p[i][0],_T("off"))) && NewClkStatus == NCS_NOT_SPECIFIED) + { + NewClkStatus = NCS_OFF; + continue; + } + + // other options + if (p[i][0] == _T('/')) + { + // set timer number + if (_istdigit(p[i][1]) && bCanNSet) + { + clk_n = p[i][1] - _T('0'); + bCanNSet = FALSE; + continue; + } + + // set s(plit) option + if (_totupper(p[i][1]) == _T('S')) + { + bS = TRUE; + continue; + } + + // specify format + if (_totupper(p[i][1]) == _T('F')) + { + iFormat = p[i][2] - _T('0'); + continue; + } + } + } + + // do stuff (start/stop/read timer) + if(NewClkStatus == NCS_ON) + { + cT=GetTickCount(); + cS=TRUE; + + ConOutPrintf (szMsg,clk_n,cS?_T("ON"):_T("OFF")); + PrintTime(); + freep(p); + return 0; + } + + if(bS) + { + if(cS) + { + ConOutPrintf (szMsg,clk_n,cS?_T("ON"):_T("OFF")); + PrintTime(); + PrintElapsedTime(GetTickCount()-cT, iFormat); + freep(p); + return 0; + } + + cT=GetTickCount(); + cS=TRUE; + ConOutPrintf (szMsg,clk_n,cS?_T("ON"):_T("OFF")); + PrintTime(); + freep(p); + return 0; + } + + if (NewClkStatus == NCS_NOT_SPECIFIED) + { + if (cS) + { + cS=FALSE; + ConOutPrintf (szMsg,clk_n,cS?_T("ON"):_T("OFF")); + PrintTime(); + PrintElapsedTime(GetTickCount()-cT, iFormat); + freep(p); + return 0; + } + + cT=GetTickCount(); + cS=TRUE; + ConOutPrintf (szMsg,clk_n,cS?_T("ON"):_T("OFF")); + PrintTime(); + freep(p); + return 0; + } + + + if (NewClkStatus == NCS_OFF) + { + if (cS) + { + cS=FALSE; + ConOutPrintf (szMsg,clk_n,cS?_T("ON"):_T("OFF")); + PrintTime(); + PrintElapsedTime(GetTickCount()-cT, iFormat); + freep(p); + return 0; + } + ConOutPrintf (szMsg,clk_n,cS?_T("ON"):_T("OFF")); + PrintTime(); + freep(p); + return 0; + } + + freep(p); + return 0; +} + +#endif /* INCLUDE_CMD_TIMER */ diff --git a/reactos/base/shell/cmd/title.c b/reactos/base/shell/cmd/title.c new file mode 100644 index 00000000000..a82bb3c21b5 --- /dev/null +++ b/reactos/base/shell/cmd/title.c @@ -0,0 +1,37 @@ +/* + * title.c - title internal command. + * + * + * History: + * 1999-02-11 Emanuele Aliberti + * + * 30-Apr-2005 (Magnus Olsen) ) + * Remove all hardcode string to En.rc + */ + +#include +#include "resource.h" + +#ifdef INCLUDE_CMD_TITLE + + +INT cmd_title (LPTSTR cmd, LPTSTR param) +{ + + /* Do nothing if no args */ + if (*param == _T('\0')) + return 0; + + /* Asking help? */ + if (!_tcsncmp(param, _T("/?"), 2)) + { + ConOutResPaging(TRUE,STRING_TITLE_HELP); + return 0; + } + + return SetConsoleTitle (param); +} + +#endif /* def INCLUDE_CMD_TITLE */ + +/* EOF */ diff --git a/reactos/base/shell/cmd/todo.txt b/reactos/base/shell/cmd/todo.txt new file mode 100644 index 00000000000..b9895bdd6d5 --- /dev/null +++ b/reactos/base/shell/cmd/todo.txt @@ -0,0 +1,24 @@ +Things to do +~~~~~~~~~~~~ +*Implmenet Set /P +This is pretty straight forward. When doing this make sure to take into account the way MS handles "set /A /P foo=5" compared to "set /P /A foo=5". + +*Compile as unicode +Not sure what is wrong with it, put probably more then just one thing blocking this. For sure pipes break when it is compiled as unicode. + +*Move.c code clean up +It works, but it needs to be cleaned up, the code is long and overly complex for what it needs to do. Also, we can remove the hack to cover for MoveFileEx bug as it isnt a bug anymore. + +*If rewrite +It works decent but looks _awful_. Very hard to maintain and/or understand what the hell is going on. + +*Remove Hardcoded buffers +This is mostly done thanks to Greatlord(cmd.c is the hardest spot that is left). ANytime when you are handling a string that is taken from the commandline there should be no limit to the size. + +*Implment & and && +& runs two commands no matter what. +&& runs the 2nd command only if the first was a success +Not sure where to put this code even + +*Reg Testing +We need more batch files like the one Royce made for "set /a". What out for if bugs when doing this... could lead to in the wrong direction when looking for a regression. \ No newline at end of file diff --git a/reactos/base/shell/cmd/type.c b/reactos/base/shell/cmd/type.c new file mode 100644 index 00000000000..f0eca0f68ad --- /dev/null +++ b/reactos/base/shell/cmd/type.c @@ -0,0 +1,136 @@ +/* + * TYPE.C - type internal command. + * + * History: + * + * 07/08/1998 (John P. Price) + * started. + * + * 07/12/98 (Rob Lake) + * Changed error messages + * + * 27-Jul-1998 (John P Price ) + * added config.h include + * + * 07-Jan-1999 (Eric Kohl ) + * Added support for quoted arguments (type "test file.dat"). + * Cleaned up. + * + * 19-Jan-1999 (Eric Kohl ) + * Unicode and redirection ready! + * + * 19-Jan-1999 (Paolo Pantaleo ) + * Added multiple file support (copied from y.c) + * + * 30-Apr-2005 (Magnus Olsen) ) + * Remove all hardcode string to En.rc + */ + +#include +#include "resource.h" + +#ifdef INCLUDE_CMD_TYPE + + +INT cmd_type (LPTSTR cmd, LPTSTR param) +{ + TCHAR szMsg[RC_STRING_MAX_SIZE]; + TCHAR buff[256]; + HANDLE hFile, hConsoleOut; + BOOL bRet; + INT argc,i; + LPTSTR *argv; + LPTSTR errmsg; + BOOL bPaging = FALSE; + BOOL bFirstTime = TRUE; + + hConsoleOut=GetStdHandle (STD_OUTPUT_HANDLE); + + if (!_tcsncmp (param, _T("/?"), 2)) + { + ConOutResPaging(TRUE,STRING_TYPE_HELP1); + return 0; + } + + if (!*param) + { + error_req_param_missing (); + return 1; + } + + argv = split (param, &argc, TRUE); + + for(i = 0; i < argc; i++) + { + if(*argv[i] == _T('/') && _tcslen(argv[i]) >= 2 && _totupper(argv[i][1]) == _T('P')) + { + bPaging = TRUE; + } + } + + for (i = 0; i < argc; i++) + { + if (_T('/') == argv[i][0] && _totupper(argv[i][1]) != _T('P')) + { + LoadString(CMD_ModuleHandle, STRING_TYPE_ERROR1, szMsg, RC_STRING_MAX_SIZE); + ConErrPrintf(szMsg, argv[i] + 1); + continue; + } + + nErrorLevel = 0; + + hFile = CreateFile(argv[i], + GENERIC_READ, + FILE_SHARE_READ,NULL, + OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL,NULL); + + if(hFile == INVALID_HANDLE_VALUE) + { + FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER | + FORMAT_MESSAGE_IGNORE_INSERTS | + FORMAT_MESSAGE_FROM_SYSTEM, + NULL, + GetLastError(), + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + (LPTSTR) &errmsg, + 0, + NULL); + ConErrPrintf (_T("%s - %s"), argv[i], errmsg); + LocalFree (errmsg); + nErrorLevel = 1; + continue; + } + + do + { + bRet = FileGetString (hFile, buff, sizeof(buff) / sizeof(TCHAR)); + if(bPaging) + { + if(bRet) + { + if (ConOutPrintfPaging(bFirstTime, buff) == 1) + { + bCtrlBreak = FALSE; + return 0; + } + } + } + else + { + if(bRet) + ConOutPrintf(buff); + } + bFirstTime = FALSE; + + } while(bRet); + + CloseHandle(hFile); + } + + freep (argv); + + return 0; +} + +#endif diff --git a/reactos/base/shell/cmd/ver.c b/reactos/base/shell/cmd/ver.c new file mode 100644 index 00000000000..3216f7a94e4 --- /dev/null +++ b/reactos/base/shell/cmd/ver.c @@ -0,0 +1,135 @@ +/* + * VER.C - ver internal command. + * + * + * History: + * + * 06/30/98 (Rob Lake) + * rewrote ver command to accept switches, now ver alone prints + * copyright notice only. + * + * 27-Jul-1998 (John P Price ) + * added config.h include + * + * 30-Jul-1998 (John P Price ) + * added text about where to send bug reports and get updates. + * + * 20-Jan-1999 (Eric Kohl ) + * Unicode and redirection safe! + * + * 26-Feb-1999 (Eric Kohl ) + * New version info and some output changes. + */ + +#include +#include "resource.h" +#include + + +VOID ShortVersion (VOID) +{ + OSVERSIONINFO VersionInfo; + unsigned RosVersionLen; + LPTSTR RosVersion; + TCHAR szMsg[RC_STRING_MAX_SIZE]; + + ConOutResPuts (STRING_CMD_SHELLINFO ); + VersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + + ConOutPrintf(_T("Version %s %s"), _T(KERNEL_RELEASE_STR), _T(KERNEL_VERSION_BUILD_STR)); + + memset(VersionInfo.szCSDVersion, 0, sizeof(VersionInfo.szCSDVersion)); + if (GetVersionEx(&VersionInfo)) + { + RosVersion = VersionInfo.szCSDVersion + _tcslen(VersionInfo.szCSDVersion) + 1; + RosVersionLen = sizeof(VersionInfo.szCSDVersion) / sizeof(VersionInfo.szCSDVersion[0]) - + (RosVersion - VersionInfo.szCSDVersion); + if (7 <= RosVersionLen && 0 == _tcsnicmp(RosVersion, _T("ReactOS"), 7)) + { + LoadString( CMD_ModuleHandle, STRING_VERSION_RUNVER, (LPTSTR) szMsg, RC_STRING_MAX_SIZE); + ConOutPrintf (szMsg, RosVersion); + } + } + ConOutPuts (_T("\n")); +} + + +#ifdef INCLUDE_CMD_VER + +/* + * display shell version info internal command. + * + * + */ +INT cmd_ver (LPTSTR cmd, LPTSTR param) +{ + INT i; + + nErrorLevel = 0; + + if (_tcsstr (param, _T("/?")) != NULL) + { + ConOutResPaging(TRUE,STRING_VERSION_HELP1); + return 0; + } + + ShortVersion(); + ConOutPuts (_T("Copyright (C) 1994-1998 Tim Norman and others.")); + ConOutPuts (_T(RES_STR_LEGAL_COPYRIGHT)); + + /* Basic copyright notice */ + if (param[0] == _T('\0')) + { + ConOutResPuts (STRING_CMD_SHELLINFO ); + ConOutResPuts(STRING_VERSION_HELP2); + } + else + { + for (i = 0; param[i]; i++) + { + /* skip spaces */ + if (param[i] == _T(' ')) + continue; + + if (param[i] == _T('/')) + { + /* is this a lone '/' ? */ + if (param[i + 1] == 0) + { + error_invalid_switch (_T(' ')); + return 1; + } + continue; + } + + if (_totupper (param[i]) == _T('W')) + { + /* Warranty notice */ + ConOutResPuts(STRING_VERSION_HELP3); + } + else if (_totupper (param[i]) == _T('R')) + { + /* Redistribution notice */ + ConOutResPuts(STRING_VERSION_HELP4); + } + else if (_totupper (param[i]) == _T('C')) + { + /* Developer listing */ + ConOutResPuts(STRING_VERSION_HELP6); + ConOutResPuts(STRING_FREEDOS_DEV); + ConOutResPuts(STRING_VERSION_HELP7); + ConOutResPuts(STRING_REACTOS_DEV); + } + else + { + error_invalid_switch ((TCHAR)_totupper (param[i])); + return 1; + } + } + } + + ConOutResPuts(STRING_VERSION_HELP5); + return 0; +} + +#endif diff --git a/reactos/base/shell/cmd/verify.c b/reactos/base/shell/cmd/verify.c new file mode 100644 index 00000000000..371993d2612 --- /dev/null +++ b/reactos/base/shell/cmd/verify.c @@ -0,0 +1,60 @@ +/* + * VERIFY.C - verify internal command. + * + * + * History: + * + * 31 Jul 1998 (John P Price) + * started. + * + * 18-Jan-1999 (Eric Kohl ) + * VERIFY is just a dummy under Win32; it only exists + * for compatibility!!! + * + * 20-Jan-1999 (Eric Kohl ) + * Unicode and redirection ready! + * + * 30-Apr-2005 (Magnus Olsen) ) + * Remove all hardcode string to En.rc + */ + +#include +#include "resource.h" + +#ifdef INCLUDE_CMD_VERIFY + + +/* global verify flag */ +static BOOL bVerify = FALSE; + + +INT cmd_verify (LPTSTR cmd, LPTSTR param) +{ + TCHAR szMsg[RC_STRING_MAX_SIZE]; + + if (!_tcsncmp (param, _T("/?"), 2)) + { + ConOutResPaging(TRUE,STRING_VERIFY_HELP1); + return 0; + } + + nErrorLevel = 0; + + if (!*param) + { + LoadString(CMD_ModuleHandle, STRING_VERIFY_HELP2, szMsg, RC_STRING_MAX_SIZE); + ConOutPrintf(szMsg, bVerify ? D_ON : D_OFF); + } + else if (_tcsicmp (param, D_OFF) == 0) + bVerify = FALSE; + else if (_tcsicmp (param, D_ON) == 0) + bVerify = TRUE; + else + { + ConOutResPuts(STRING_VERIFY_HELP3); + } + + return 0; +} + +#endif diff --git a/reactos/base/shell/cmd/vol.c b/reactos/base/shell/cmd/vol.c new file mode 100644 index 00000000000..ac8a11af466 --- /dev/null +++ b/reactos/base/shell/cmd/vol.c @@ -0,0 +1,117 @@ +/* + * VOL.C - vol internal command. + * + * + * History: + * + * 03-Dec-1998 (Eric Kohl ) + * Replaced DOS calls by Win32 calls. + * + * 08-Dec-1998 (Eric Kohl ) + * Added help text ("/?"). + * + * 07-Jan-1999 (Eric Kohl ) + * Cleanup. + * + * 18-Jan-1999 (Eric Kohl ) + * Unicode ready! + * + * 20-Jan-1999 (Eric Kohl ) + * Redirection ready! + */ + +#include +#include "resource.h" + +#ifdef INCLUDE_CMD_VOL + + +static INT +PrintVolumeHeader (LPTSTR pszRootPath) +{ + TCHAR szMsg[RC_STRING_MAX_SIZE]; + TCHAR szVolName[80]; + DWORD dwSerialNr; + + /* get the volume information of the drive */ + if(!GetVolumeInformation (pszRootPath, + szVolName, + 80, + &dwSerialNr, + NULL, + NULL, + NULL, + 0)) + { + ErrorMessage (GetLastError (), _T("")); + return 1; + } + + /* print drive info */ + if (szVolName[0] != '\0') + { + LoadString(CMD_ModuleHandle, STRING_VOL_HELP1, szMsg, RC_STRING_MAX_SIZE); + ConOutPrintf(szMsg, pszRootPath[0],szVolName); + } + else + { + LoadString(CMD_ModuleHandle, STRING_VOL_HELP2, szMsg, RC_STRING_MAX_SIZE); + ConOutPrintf(szMsg, pszRootPath[0]); + } + + /* print the volume serial number */ + LoadString(CMD_ModuleHandle, STRING_VOL_HELP3, szMsg, RC_STRING_MAX_SIZE); + ConOutPrintf(szMsg, HIWORD(dwSerialNr), LOWORD(dwSerialNr)); + return 0; +} + + +INT cmd_vol (LPTSTR cmd, LPTSTR param) +{ + TCHAR szRootPath[] = _T("A:\\"); + TCHAR szPath[MAX_PATH]; + + if (!_tcsncmp (param, _T("/?"), 2)) + { + ConOutResPaging(TRUE,STRING_VOL_HELP4); + return 0; + } + + nErrorLevel = 0; + + if (param[0] == _T('\0')) + { + GetCurrentDirectory (MAX_PATH, szPath); + szRootPath[0] = szPath[0]; + } + else + { + _tcsupr (param); + if (param[1] == _T(':')) + szRootPath[0] = param[0]; + else + { + error_invalid_drive (); + nErrorLevel = 1; + return 1; + } + } + + if (!IsValidPathName (szRootPath)) + { + error_invalid_drive (); + nErrorLevel = 1; + return 1; + } + + /* print the header */ + if (!PrintVolumeHeader (szRootPath)) + { + nErrorLevel = 1; + return 1; + } + + return 0; +} + +#endif diff --git a/reactos/base/shell/cmd/where.c b/reactos/base/shell/cmd/where.c new file mode 100644 index 00000000000..3136f46e842 --- /dev/null +++ b/reactos/base/shell/cmd/where.c @@ -0,0 +1,273 @@ +/* + * WHERE.C - file search functions. + * + * + * History: + * + * 07/15/95 (Tim Norman) + * started. + * + * 08/08/95 (Matt Rains) + * i have cleaned up the source code. changes now bring this source + * into guidelines for recommended programming practice. + * + * 12/12/95 (Steffan Kaiser & Tim Norman) + * added some patches to fix some things and make more efficient + * + * 1/6/96 (Tim Norman) + * fixed a stupid pointer mistake... + * Thanks to everyone who noticed it! + * + * 8/1/96 (Tim Norman) + * fixed a bug when getenv returns NULL + * + * 8/7/96 (Steffan Kaiser and Tim Norman) + * speed improvements and bug fixes + * + * 8/27/96 (Tim Norman) + * changed code to use pointers directly into PATH environment + * variable rather than making our own copy. This saves some memory, + * but requires we write our own function to copy pathnames out of + * the variable. + * + * 12/23/96 (Aaron Kaufman) + * Fixed a bug in get_paths() that did not point to the first PATH + * in the environment variable. + * + * 7/12/97 (Tim Norman) + * Apparently, Aaron's bugfix got lost, so I fixed it again. + * + * 16 July 1998 (John P. Price) + * Added stand alone code. + * + * 17 July 1998 (John P. Price) + * Rewrote find_which to use searchpath function + * + * 24-Jul-1998 (John P Price ) + * fixed bug where didn't check all extensions when path was specified + * + * 27-Jul-1998 (John P Price ) + * added config.h include + * + * 30-Jul-1998 (John P Price ) + * fixed so that it find_which returns NULL if filename is not + * executable (does not have .bat, .com, or .exe extention). + * Before command would to execute any file with any extension (opps!) + * + * 03-Dec-1998 (Eric Kohl ) + * Changed find_which(). + * + * 07-Dec-1998 (Eric Kohl ) + * Added ".CMD" extension. + * Replaced numeric constant by _NR_OF_EXTENSIONS. + * + * 26-Feb-1999 (Eric Kohl ) + * Replaced find_which() by SearchForExecutable(). + * Now files are searched using the right extension order. + * + * 20-Apr-1999 (Eric Kohl ) + * Some minor changes and improvements. + * + + * 10-Jul-2004 (Jens Collin ) + * Fixed searxhing for files with specific extensions in PATHEXT order.. + * + */ + +#include + + +/* initial size of environment variable buffer */ +#define ENV_BUFFER_SIZE 1024 + + +/* searches for file using path info. */ + +BOOL +SearchForExecutableSingle (LPCTSTR pFileName, LPTSTR pFullName, LPTSTR pExtension) +{ + TCHAR szPathBuffer[CMDLINE_LENGTH]; + LPTSTR pszBuffer = NULL; + DWORD dwBuffer, len; + LPTSTR s,f; + /* initialize full name buffer */ + *pFullName = _T('\0'); + +#ifdef _DEBUG + DebugPrintf (_T("SearchForExecutableSingle: \'%s\' with ext: \'%s\'\n"), pFileName, pExtension); +#endif + + /* Check if valid directly on specified path */ + if (_tcschr (pFileName, _T('\\')) != NULL) + { + LPTSTR pFilePart; +#ifdef _DEBUG + DebugPrintf (_T("Absolute or relative path is given.\n")); +#endif + + if (GetFullPathName (pFileName, + CMDLINE_LENGTH, + szPathBuffer, + &pFilePart) ==0) + return FALSE; + + if(pFilePart == 0) + return FALSE; + /* Add extension and test file: */ + if (pExtension) + _tcscat(szPathBuffer, pExtension); + + if (IsExistingFile (szPathBuffer)) + { +#ifdef _DEBUG + DebugPrintf (_T("Found: \'%s\'\n"), szPathBuffer); +#endif + _tcscpy (pFullName, szPathBuffer); + return TRUE; + } + return FALSE; + } + + /* search in current directory */ + len = GetCurrentDirectory (CMDLINE_LENGTH, szPathBuffer); + if (szPathBuffer[len - 1] != _T('\\')) + { + szPathBuffer[len] = _T('\\'); + szPathBuffer[len + 1] = _T('\0'); + } + _tcscat (szPathBuffer, pFileName); + + if (pExtension) + _tcscat (szPathBuffer, pExtension); + + if (IsExistingFile (szPathBuffer)) + { +#ifdef _DEBUG + DebugPrintf (_T("Found: \'%s\'\n"), szPathBuffer); +#endif + _tcscpy (pFullName, szPathBuffer); + return TRUE; + } + + + + /* load environment varable PATH into buffer */ + pszBuffer = (LPTSTR)malloc (ENV_BUFFER_SIZE * sizeof(TCHAR)); + dwBuffer = GetEnvironmentVariable (_T("PATH"), pszBuffer, ENV_BUFFER_SIZE); + if (dwBuffer > ENV_BUFFER_SIZE) + { + pszBuffer = (LPTSTR)realloc (pszBuffer, dwBuffer * sizeof (TCHAR)); + GetEnvironmentVariable (_T("PATH"), pszBuffer, dwBuffer); + } + + + /* search in PATH */ + s = pszBuffer; + while (s && *s) + { + f = _tcschr (s, _T(';')); + + if (f) + { + _tcsncpy (szPathBuffer, s, (size_t)(f-s)); + szPathBuffer[f-s] = _T('\0'); + s = f + 1; + } + else + { + _tcscpy (szPathBuffer, s); + s = NULL; + } + + len = _tcslen(szPathBuffer); + if (szPathBuffer[len - 1] != _T('\\')) + { + szPathBuffer[len] = _T('\\'); + szPathBuffer[len + 1] = _T('\0'); + } + _tcscat (szPathBuffer, pFileName); + + if (pExtension) + _tcscat (szPathBuffer, pExtension); + + if (IsExistingFile (szPathBuffer)) + { +#ifdef _DEBUG + DebugPrintf (_T("Found: \'%s\'\n"), szPathBuffer); +#endif + free (pszBuffer); + _tcscpy (pFullName, szPathBuffer); + return TRUE; + } + } + free (pszBuffer); + return FALSE; +} + + +BOOL +SearchForExecutable (LPCTSTR pFileName, LPTSTR pFullName) +{ + static TCHAR pszDefaultPathExt[] = _T(".COM;.EXE;.BAT;.CMD"); + LPTSTR pszBuffer = NULL; + LPTSTR pCh; + LPTSTR pExt; + DWORD dwBuffer; +#ifdef _DEBUG + DebugPrintf (_T("SearchForExecutable: \'%s\'\n"), pFileName); +#endif + /* load environment varable PATHEXT */ + pszBuffer = (LPTSTR)malloc (ENV_BUFFER_SIZE * sizeof(TCHAR)); + dwBuffer = GetEnvironmentVariable (_T("PATHEXT"), pszBuffer, ENV_BUFFER_SIZE); + if (dwBuffer > ENV_BUFFER_SIZE) + { + pszBuffer = (LPTSTR)realloc (pszBuffer, dwBuffer * sizeof (TCHAR)); + GetEnvironmentVariable (_T("PATHEXT"), pszBuffer, dwBuffer); + } + else if (0 == dwBuffer) + { + _tcscpy(pszBuffer, pszDefaultPathExt); + } + +#ifdef _DEBUG + DebugPrintf (_T("SearchForExecutable(): Loaded PATHEXT: %s\n"), pszBuffer); +#endif + + pExt = _tcsrchr(pFileName, _T('.')); + if (pExt != NULL) + { + LPTSTR pszBuffer2; + pszBuffer2 = _tcsdup(pszBuffer); + if (pszBuffer2) + { + pCh = _tcstok(pszBuffer2, _T(";")); + while (pCh) + { + if (0 == _tcsicmp(pCh, pExt)) + { + free(pszBuffer); + free(pszBuffer2); + return SearchForExecutableSingle(pFileName, pFullName, NULL); + } + pCh = _tcstok(NULL, _T(";")); + } + free(pszBuffer2); + } + } + + pCh = _tcstok(pszBuffer, _T(";")); + while (pCh) + { + if (SearchForExecutableSingle(pFileName, pFullName, pCh)) + { + free(pszBuffer); + return TRUE; + } + pCh = _tcstok(NULL, _T(";")); + } + + free(pszBuffer); + return FALSE; +} + +/* EOF */ diff --git a/reactos/base/shell/cmd/window.c b/reactos/base/shell/cmd/window.c new file mode 100644 index 00000000000..10ac14c1bf3 --- /dev/null +++ b/reactos/base/shell/cmd/window.c @@ -0,0 +1,231 @@ +/* $Id$ + * + * WINDOW.C - activate & window internal commands. + * + * clone from 4nt activate command + * + * 10 Sep 1999 (Paolo Pantaleo) + * started (window command in WINDOW.c) + * + * 29 Sep 1999 (Paolo Pantaleo) + * activate and window in a single file using mainly the same code + * (nice size optimization :) + * + * 30-Apr-2005 (Magnus Olsen) ) + * Remove all hardcode string to En.rc + */ + + +#include +#include "resource.h" + +#if ( defined(INCLUDE_CMD_WINDOW) || defined(INCLUDE_CMD_ACTIVATE) ) + + +#define A_MIN 0x01 +#define A_MAX 0x02 +#define A_RESTORE 0x04 +#define A_POS 0x08 +#define A_SIZE 0x10 +#define A_CLOSE 0x20 + + +/*service funciton to perform actions on windows + + param is a string to parse for options/actions + hWnd is the handle of window on wich perform actions + +*/ + +static INT ServiceActivate (LPTSTR param, HWND hWnd) +{ + LPTSTR *p = 0, p_tmp; + INT argc = 0, i; + INT iAction = 0; + LPTSTR title = 0; + WINDOWPLACEMENT wp; + RECT pos; + LPTSTR tmp; + + + if (*param) + p = split(param, &argc, FALSE); + + for (i = 0; i < argc; i++) + { + p_tmp = p[i]; + if (*p_tmp == _T('/')) + p_tmp++; + + if (_tcsicmp(p_tmp, _T("min")) == 0) + { + iAction |= A_MIN; + continue; + } + + if (_tcsicmp(p_tmp, _T("max")) == 0) + { + iAction |= A_MAX; + continue; + } + + if (_tcsicmp(p_tmp, _T("restore")) == 0) + { + iAction |= A_RESTORE; + continue; + } + + if (_tcsicmp(p_tmp, _T("close")) == 0) + { + iAction |= A_CLOSE; + continue; + } + + if (_tcsnicmp(p_tmp, _T("pos"), 3) == 0) + { + iAction |= A_POS; + tmp = p_tmp+3; + if (*tmp == _T('=')) + tmp++; + + pos.left= _ttoi(tmp); + if(!(tmp=_tcschr(tmp, _T(',')))) + { + error_invalid_parameter_format(p[i]); + freep(p); + return 1; + } + + pos.top = _ttoi (++tmp); + if(!(tmp=_tcschr(tmp, _T(',')))) + { + error_invalid_parameter_format(p[i]); + freep(p); + return 1; + } + + pos.right = _ttoi(++tmp) + pos.left; + if (!(tmp = _tcschr(tmp, _T(',')))) + { + error_invalid_parameter_format(p[i]); + freep(p); + return 1; + } + pos.bottom = _ttoi(++tmp) + pos.top; + continue; + } + + if (_tcsnicmp(p_tmp, _T("size"), 4)==0) + { + iAction |=A_SIZE; + continue; + } + + /* none of them=window title */ + if (title) + { + error_invalid_parameter_format(p[i]); + freep(p); + return 1; + } + + if (p_tmp[0] == _T('"')) + { + title = (p_tmp + 1); + *_tcschr(p_tmp + 1, _T('"')) = 0; + continue; + } + title = p_tmp; + } + + if (title) + SetWindowText(hWnd, title); + + wp.length = sizeof(WINDOWPLACEMENT); + GetWindowPlacement(hWnd, &wp); + + if (iAction & A_POS) + wp.rcNormalPosition = pos; + + if (iAction & A_MIN) + wp.showCmd = SW_MINIMIZE; + + if (iAction & A_MAX) + wp.showCmd = SW_SHOWMAXIMIZED; + + /*if no actions are specified default is SW_RESTORE*/ + if ((iAction & A_RESTORE) || (!iAction)) + wp.showCmd = SW_RESTORE; + + if (iAction & A_CLOSE) + { +#ifdef _DEBUG + ConErrPrintf(_T("!!!FIXME: CLOSE Not implemented!!!\n")); +#endif + } + + wp.length = sizeof(WINDOWPLACEMENT); + SetWindowPlacement(hWnd, &wp); + + if (p) + freep(p); + + return 0; +} + + + + +INT CommandWindow (LPTSTR cmd, LPTSTR param) +{ + HWND hwnd; + + if (_tcsncmp (param, _T("/?"), 2) == 0) + { + ConOutResPaging(TRUE,STRING_WINDOW_HELP1); + return 0; + } + + hwnd = GetConsoleWindow(); + Sleep(0); + return ServiceActivate(param, hwnd); +} + + +INT CommandActivate (LPTSTR cmd, LPTSTR param) +{ + HWND hwnd; + LPTSTR *arg; + INT argc; + + if (_tcsncmp (param, _T("/?"), 2) == 0) + { + ConOutResPaging(TRUE,STRING_WINDOW_HELP2); + return 0; + } + + if(!(*param)) + return 1; + + /*Split the user input into array*/ + arg = split (param, &argc, FALSE); + if(argc < 2) + { + if(arg != NULL) + freep(arg); + } + hwnd = FindWindow(NULL, arg[0]); + if (hwnd == NULL) + { + if(arg != NULL) + freep(arg); + ConErrResPuts(STRING_WINDOW_ERROR1); + return 1; + } + if(arg != NULL) + freep(arg); + + return ServiceActivate(param, hwnd); +} + +#endif /* ( defined(INCLUDE_CMD_WINDOW) || defined(INCLUDE_CMD_ACTIVATE) ) */ diff --git a/reactos/base/shell/explorer/Doxyfile b/reactos/base/shell/explorer/Doxyfile new file mode 100644 index 00000000000..1ffba219694 --- /dev/null +++ b/reactos/base/shell/explorer/Doxyfile @@ -0,0 +1,1169 @@ +# Doxyfile 1.3.9.1 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project +# +# All text after a hash (#) is considered a comment and will be ignored +# The format is: +# TAG = value [value, ...] +# For lists items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (" ") + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded +# by quotes) that should identify the project. + +PROJECT_NAME = "ROS Explorer" + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. +# This could be handy for archiving the generated documentation or +# if some version control system is used. + +PROJECT_NUMBER = + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = doxy-doc + +# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create +# 4096 sub-directories (in 2 levels) under the output directory of each output +# format and will distribute the generated files over these directories. +# Enabling this option can be useful when feeding doxygen a huge amount of source +# files, where putting all generated files in the same directory would otherwise +# cause performance problems for the file system. + +CREATE_SUBDIRS = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# The default language is English, other supported languages are: +# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, +# Dutch, Finnish, French, German, Greek, Hungarian, Italian, Japanese, +# Japanese-en (Japanese with English messages), Korean, Korean-en, Norwegian, +# Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, +# Swedish, and Ukrainian. + +OUTPUT_LANGUAGE = English + +# This tag can be used to specify the encoding used in the generated output. +# The encoding is not always determined by the language that is chosen, +# but also whether or not the output is meant for Windows or non-Windows users. +# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES +# forces the Windows encoding (this is the default for the Windows binary), +# whereas setting the tag to NO uses a Unix-style encoding (the default for +# all platforms other than Windows). + +USE_WINDOWS_ENCODING = YES + +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will +# include brief member descriptions after the members that are listed in +# the file and class documentation (similar to JavaDoc). +# Set to NO to disable this. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend +# the brief description of a member or function before the detailed description. +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is used +# as the annotated text. Otherwise, the brief description is used as-is. If left +# blank, the following values are used ("$name" is automatically replaced with the +# name of the entity): "The $name class" "The $name widget" "The $name file" +# "is" "provides" "specifies" "contains" "represents" "a" "an" "the" + +ABBREVIATE_BRIEF = + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief +# description. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all inherited +# members of a class in the documentation of that class as if those members were +# ordinary class members. Constructors, destructors and assignment operators of +# the base classes will not be shown. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full +# path before files name in the file list and in the header files. If set +# to NO the shortest path that makes the file name unique will be used. + +FULL_PATH_NAMES = NO + +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag +# can be used to strip a user-defined part of the path. Stripping is +# only done if one of the specified strings matches the left-hand part of +# the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the +# path to strip. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of +# the path mentioned in the documentation of a class, which tells +# the reader which header file to include in order to use a class. +# If left blank only the name of the header file containing the class +# definition is used. Otherwise one should specify the include paths that +# are normally passed to the compiler using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter +# (but less readable) file names. This can be useful is your file systems +# doesn't support long names like on DOS, Mac, or CD-ROM. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the JavaDoc +# comments will behave just like the Qt-style comments (thus requiring an +# explicit @brief command for a brief description. + +JAVADOC_AUTOBRIEF = YES + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen +# treat a multi-line C++ special comment block (i.e. a block of //! or /// +# comments) as a brief description. This used to be the default behaviour. +# The new default is to treat a multi-line C++ comment block as a detailed +# description. Set this tag to YES if you prefer the old behaviour instead. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the DETAILS_AT_TOP tag is set to YES then Doxygen +# will output the detailed description near the top, like JavaDoc. +# If set to NO, the detailed description appears after the member +# documentation. + +DETAILS_AT_TOP = NO + +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it +# re-implements. + +INHERIT_DOCS = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. + +DISTRIBUTE_GROUP_DOC = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# Doxygen uses this value to replace tabs by spaces in code fragments. + +TAB_SIZE = 8 + +# This tag can be used to specify a number of aliases that acts +# as commands in the documentation. An alias has the form "name=value". +# For example adding "sideeffect=\par Side Effects:\n" will allow you to +# put the command \sideeffect (or @sideeffect) in the documentation, which +# will result in a user-defined paragraph with heading "Side Effects:". +# You can put \n's in the value part of an alias to insert newlines. + +ALIASES = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources +# only. Doxygen will then generate output that is more tailored for C. +# For instance, some of the names that are used will be different. The list +# of all members will be omitted, etc. + +OPTIMIZE_OUTPUT_FOR_C = NO + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources +# only. Doxygen will then generate output that is more tailored for Java. +# For instance, namespaces will be presented as packages, qualified scopes +# will look different, etc. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of +# the same type (for instance a group of public functions) to be put as a +# subgroup of that type (e.g. under the Public Functions section). Set it to +# NO to prevent subgrouping. Alternatively, this can be done per class using +# the \nosubgrouping command. + +SUBGROUPING = YES + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES + +EXTRACT_ALL = NO + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = NO + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) +# defined locally in source files will be included in the documentation. +# If set to NO only classes defined in header files are included. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. When set to YES local +# methods, which are defined in the implementation section but not in +# the interface are included in the documentation. +# If set to NO (the default) only methods in the interface are included. + +EXTRACT_LOCAL_METHODS = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. +# This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these classes will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all +# friend (class|struct|union) declarations. +# If set to NO (the default) these declarations will be included in the +# documentation. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. +# If set to NO (the default) these blocks will be appended to the +# function's detailed documentation block. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. +# Set it to YES to include the internal documentation. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate +# file names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. + +CASE_SENSE_NAMES = YES + +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the +# documentation. If set to YES the scope will be hidden. + +HIDE_SCOPE_NAMES = NO + +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = YES + +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# is inserted in the documentation for inline members. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen +# will sort the (detailed) documentation of file and class members +# alphabetically by member name. If set to NO the members will appear in +# declaration order. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in +# declaration order. + +SORT_BRIEF_DOCS = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be +# sorted by fully-qualified names, including namespaces. If set to +# NO (the default), the class list will be sorted only by class name, +# not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the +# alphabetical list. + +SORT_BY_SCOPE_NAME = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or +# disable (NO) the todo list. This list is created by putting \todo +# commands in the documentation. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or +# disable (NO) the test list. This list is created by putting \test +# commands in the documentation. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or +# disable (NO) the bug list. This list is created by putting \bug +# commands in the documentation. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or +# disable (NO) the deprecated list. This list is created by putting +# \deprecated commands in the documentation. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional +# documentation sections, marked by \if sectionname ... \endif. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines +# the initial value of a variable or define consists of for it to appear in +# the documentation. If the initializer consists of more lines than specified +# here it will be hidden. Use a value of 0 to hide initializers completely. +# The appearance of the initializer of individual variables and defines in the +# documentation can be controlled using \showinitializer or \hideinitializer +# command in the documentation regardless of this setting. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated +# at the bottom of the documentation of classes and structs. If set to YES the +# list will mention the files that were used to generate the documentation. + +SHOW_USED_FILES = YES + +# If the sources in your project are distributed over multiple directories +# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy +# in the documentation. + +SHOW_DIRECTORIES = YES + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated +# by doxygen. Possible values are YES and NO. If left blank NO is used. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank +# NO is used. + +WARNINGS = NO + +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# automatically be disabled. + +WARN_IF_UNDOCUMENTED = NO + +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some +# parameters in a documented function, or documenting parameters that +# don't exist or using markup commands wrongly. + +WARN_IF_DOC_ERROR = YES + +# The WARN_FORMAT tag determines the format of the warning messages that +# doxygen can produce. The string should contain the $file, $line, and $text +# tags, which will be replaced by the file and line number from which the +# warning originated and the warning text. + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning +# and error messages should be written. If left blank the output is written +# to stderr. + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT = . \ + desktop \ + dialogs \ + shell \ + taskbar \ + utility + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank the following patterns are tested: +# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp +# *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm + +FILE_PATTERNS = *.cpp \ + *.c \ + *.hpp \ + *.h + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = NO + +# The EXCLUDE tag can be used to specify files and/or directories that should +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used select whether or not files or directories +# that are symbolic links (a Unix filesystem feature) are excluded from the input. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. + +EXCLUDE_PATTERNS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. +# Possible values are YES and NO. If left blank NO is used. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command , where +# is the value of the INPUT_FILTER tag, and is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. If FILTER_PATTERNS is specified, this tag will be +# ignored. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: +# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further +# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER +# is applied to all files. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will be used to filter the input files when producing source +# files to browse (i.e. when SOURCE_BROWSER is set to YES). + +FILTER_SOURCE_FILES = NO + +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will +# be generated. Documented entities will be cross-referenced with these sources. +# Note: To get rid of all source code in the generated output, make sure also +# VERBATIM_HEADERS is set to NO. + +SOURCE_BROWSER = YES + +# Setting the INLINE_SOURCES tag to YES will include the body +# of functions and classes directly in the documentation. + +INLINE_SOURCES = YES + +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code +# fragments. Normal C and C++ comments will always remain visible. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES (the default) +# then for each documented function all documented +# functions referencing it will be listed. + +REFERENCED_BY_RELATION = YES + +# If the REFERENCES_RELATION tag is set to YES (the default) +# then for each documented function all documented entities +# called/used by that function will be listed. + +REFERENCES_RELATION = YES + +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen +# will generate a verbatim copy of the header file for each class for +# which an include is specified. Set to NO to disable this. + +VERBATIM_HEADERS = YES + +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index +# of all compounds will be generated. Enable this if the project +# contains a lot of classes, structs, unions or interfaces. + +ALPHABETICAL_INDEX = YES + +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# in which this list will be split (can be a number in the range [1..20]) + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all +# classes will be put under the same header in the alphabetical index. +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that +# should be ignored while generating the index headers. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# generate HTML output. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `html' will be used as the default path. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for +# each generated HTML page (for example: .htm,.php,.asp). If it is left blank +# doxygen will generate files with .html extension. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a +# standard footer. + +HTML_FOOTER = doxy-footer.html + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading +# style sheet that is used by each HTML page. It can be used to +# fine-tune the look of the HTML output. If the tag is left blank doxygen +# will generate a default style sheet. Note that doxygen will try to copy +# the style sheet file to the HTML output directory, so don't put your own +# stylesheet in the HTML output directory as well, or it will be erased! + +HTML_STYLESHEET = + +# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, +# files or namespaces will be aligned in HTML using tables. If set to +# NO a bullet list will be used. + +HTML_ALIGN_MEMBERS = YES + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compressed HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = YES + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can +# be used to specify the file name of the resulting .chm file. You +# can add a path in front of the file if the result should not be +# written to the html output directory. + +CHM_FILE = + +# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can +# be used to specify the location (absolute path including file name) of +# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run +# the HTML help compiler on the generated index.hhp. + +HHC_LOCATION = + +# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag +# controls if a separate .chi index file is generated (YES) or that +# it should be included in the master .chm file (NO). + +GENERATE_CHI = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag +# controls whether a binary table of contents is generated (YES) or a +# normal table of contents (NO) in the .chm file. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members +# to the contents of the HTML help documentation and to the tree view. + +TOC_EXPAND = NO + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index at +# top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. + +DISABLE_INDEX = NO + +# This tag can be used to set the number of enum values (range [1..20]) +# that doxygen will group on one line in the generated HTML documentation. + +ENUM_VALUES_PER_LINE = 4 + +# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be +# generated containing a tree-like index structure (just like the one that +# is generated for HTML Help). For this to work a browser that supports +# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, +# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are +# probably better off using the HTML help feature. + +GENERATE_TREEVIEW = YES + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be +# used to set the initial width (in pixels) of the frame in which the tree +# is shown. + +TREEVIEW_WIDTH = 240 + +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# generate Latex output. + +GENERATE_LATEX = NO + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `latex' will be used as the default path. + +LATEX_OUTPUT = latex + +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# invoked. If left blank `latex' will be used as the default command name. + +LATEX_CMD_NAME = latex + +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to +# generate index for LaTeX. If left blank `makeindex' will be used as the +# default command name. + +MAKEINDEX_CMD_NAME = makeindex + +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_LATEX = NO + +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, a4wide, letter, legal and +# executive. If left blank a4wide will be used. + +PAPER_TYPE = a4wide + +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# packages that should be included in the LaTeX output. + +EXTRA_PACKAGES = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a +# standard header. Notice: only use this tag if you know what you are doing! + +LATEX_HEADER = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references +# This makes the output suitable for online browsing using a pdf viewer. + +PDF_HYPERLINKS = NO + +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a +# higher quality PDF documentation. + +USE_PDFLATEX = NO + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. +# This option is also used when generating formulas in HTML. + +LATEX_BATCHMODE = NO + +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) +# in the output. + +LATEX_HIDE_INDICES = NO + +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimized for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `rtf' will be used as the default path. + +RTF_OUTPUT = rtf + +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_RTF = YES + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using WORD or other +# programs which support those fields. +# Note: wordpad (write) and others do not support links. + +RTF_HYPERLINKS = YES + +# Load stylesheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assignments. You only have to provide +# replacements, missing definitions are set to their default value. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an rtf document. +# Syntax is similar to doxygen's config file. + +RTF_EXTENSIONS_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# generate man pages + +GENERATE_MAN = NO + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `man' will be used as the default path. + +MAN_OUTPUT = man + +# The MAN_EXTENSION tag determines the extension that is added to +# the generated man pages (default is the subroutine's section .3) + +MAN_EXTENSION = .3 + +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, +# then it will generate one additional man file for each entity +# documented in the real man page(s). These additional files +# only source the real man page, but without them the man command +# would be unable to find the correct page. The default is NO. + +MAN_LINKS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of +# the code including all documentation. + +GENERATE_XML = NO + +# The XML_OUTPUT tag is used to specify where the XML pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `xml' will be used as the default path. + +XML_OUTPUT = xml + +# The XML_SCHEMA tag can be used to specify an XML schema, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_SCHEMA = + +# The XML_DTD tag can be used to specify an XML DTD, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_DTD = + +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that +# enabling this will significantly increase the size of the XML output. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- + +# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will +# generate an AutoGen Definitions (see autogen.sf.net) file +# that captures the structure of the code including all +# documentation. Note that this feature is still experimental +# and incomplete at the moment. + +GENERATE_AUTOGEN_DEF = NO + +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# to generate PDF and DVI output from the Perl module output. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. This is useful +# if you want to understand what is going on. On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller +# and Perl will parse it just the same. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same +# Makefile don't overwrite each other's variables. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include +# files. + +ENABLE_PREPROCESSING = YES + +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled +# way by setting EXPAND_ONLY_PREDEF to YES. + +MACRO_EXPANSION = NO + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the +# PREDEFINED and EXPAND_AS_PREDEFINED tags. + +EXPAND_ONLY_PREDEF = NO + +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# in the INCLUDE_PATH (see below) will be search if a #include is found. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by +# the preprocessor. + +INCLUDE_PATH = + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will +# be used. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. To prevent a macro definition from being +# undefined via #undef or recursively expanded use the := operator +# instead of the = operator. + +PREDEFINED = __cplusplus + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then +# this tag can be used to specify a list of macro names that should be expanded. +# The macro definition that is found in the sources will be used. +# Use the PREDEFINED tag if you want to use a different macro definition. + +EXPAND_AS_DEFINED = + +# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then +# doxygen's preprocessor will remove all function-like macros that are alone +# on a line, have an all uppercase name, and do not end with a semicolon. Such +# function macros are typically used for boiler-plate code, and will confuse the +# parser if not removed. + +SKIP_FUNCTION_MACROS = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES option can be used to specify one or more tagfiles. +# Optionally an initial location of the external documentation +# can be added for each tagfile. The format of a tag file without +# this location is as follows: +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths or +# URLs. If a location is present for each tag, the installdox tool +# does not have to be run to correct the links. +# Note that each tag file must have a unique name +# (where the name does NOT include the path) +# If a tag file is not located in the directory in which doxygen +# is run, you must also specify the path to the tagfile here. + +TAGFILES = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# a tag file that is based on the input files it reads. + +GENERATE_TAGFILE = + +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes +# will be listed. + +ALLEXTERNALS = NO + +# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will +# be listed. + +EXTERNAL_GROUPS = YES + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of `which perl'). + +PERL_PATH = /usr/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base or +# super classes. Setting the tag to NO turns the diagrams off. Note that this +# option is superseded by the HAVE_DOT option below. This is only a fallback. It is +# recommended to install and use dot, since it yields more powerful graphs. + +CLASS_DIAGRAMS = YES + +# If set to YES, the inheritance and collaboration graphs will hide +# inheritance and usage relations if the target is undocumented +# or is not a class. + +HIDE_UNDOC_RELATIONS = NO + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# have no effect if this option is set to NO (the default) + +HAVE_DOT = YES + +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the +# the CLASS_DIAGRAMS tag to NO. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and +# class references variables) of the class with other documented classes. + +COLLABORATION_GRAPH = YES + +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. + +UML_LOOK = NO + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = NO + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT +# tags are set to YES then doxygen will generate a graph for each documented +# file showing the direct and indirect include dependencies of the file with +# other documented files. + +INCLUDE_GRAPH = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each +# documented header file showing the documented files that directly or +# indirectly include this file. + +INCLUDED_BY_GRAPH = YES + +# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will +# generate a call dependency graph for every global function or class method. +# Note that enabling this option will significantly increase the time of a run. +# So in most cases it will be better to enable call graphs for selected +# functions only using the \callgraph command. + +CALL_GRAPH = YES + +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# will graphical hierarchy of all classes instead of a textual one. + +GRAPHICAL_HIERARCHY = YES + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. Possible values are png, jpg, or gif +# If left blank png will be used. + +DOT_IMAGE_FORMAT = png + +# The tag DOT_PATH can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found on the path. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the +# \dotfile command). + +DOTFILE_DIRS = + +# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width +# (in pixels) of the graphs generated by dot. If a graph becomes larger than +# this value, doxygen will try to truncate the graph, so that it fits within +# the specified constraint. Beware that most browsers cannot cope with very +# large images. + +MAX_DOT_GRAPH_WIDTH = 1024 + +# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height +# (in pixels) of the graphs generated by dot. If a graph becomes larger than +# this value, doxygen will try to truncate the graph, so that it fits within +# the specified constraint. Beware that most browsers cannot cope with very +# large images. + +MAX_DOT_GRAPH_HEIGHT = 1024 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the +# graphs generated by dot. A depth value of 3 means that only nodes reachable +# from the root by following a path via at most 3 edges will be shown. Nodes that +# lay further from the root node will be omitted. Note that setting this option to +# 1 or 2 may greatly reduce the computation time needed for large code bases. Also +# note that a graph may be further truncated if the graph's image dimensions are +# not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH and MAX_DOT_GRAPH_HEIGHT). +# If 0 is used for the depth value (the default), the graph is not depth-constrained. + +MAX_DOT_GRAPH_DEPTH = 0 + +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will +# generate a legend page explaining the meaning of the various boxes and +# arrows in the dot generated graphs. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will +# remove the intermediate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to the search engine +#--------------------------------------------------------------------------- + +# The SEARCHENGINE tag specifies whether or not a search engine should be +# used. If set to NO the values of all tags below this one will be ignored. + +SEARCHENGINE = YES diff --git a/reactos/base/shell/explorer/Doxyfile-all b/reactos/base/shell/explorer/Doxyfile-all new file mode 100644 index 00000000000..42b61db9f85 --- /dev/null +++ b/reactos/base/shell/explorer/Doxyfile-all @@ -0,0 +1,1169 @@ +# Doxyfile 1.3.9.1 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project +# +# All text after a hash (#) is considered a comment and will be ignored +# The format is: +# TAG = value [value, ...] +# For lists items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (" ") + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded +# by quotes) that should identify the project. + +PROJECT_NAME = "ROS Explorer" + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. +# This could be handy for archiving the generated documentation or +# if some version control system is used. + +PROJECT_NUMBER = + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = doxy-doc + +# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create +# 4096 sub-directories (in 2 levels) under the output directory of each output +# format and will distribute the generated files over these directories. +# Enabling this option can be useful when feeding doxygen a huge amount of source +# files, where putting all generated files in the same directory would otherwise +# cause performance problems for the file system. + +CREATE_SUBDIRS = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# The default language is English, other supported languages are: +# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, +# Dutch, Finnish, French, German, Greek, Hungarian, Italian, Japanese, +# Japanese-en (Japanese with English messages), Korean, Korean-en, Norwegian, +# Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, +# Swedish, and Ukrainian. + +OUTPUT_LANGUAGE = English + +# This tag can be used to specify the encoding used in the generated output. +# The encoding is not always determined by the language that is chosen, +# but also whether or not the output is meant for Windows or non-Windows users. +# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES +# forces the Windows encoding (this is the default for the Windows binary), +# whereas setting the tag to NO uses a Unix-style encoding (the default for +# all platforms other than Windows). + +USE_WINDOWS_ENCODING = YES + +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will +# include brief member descriptions after the members that are listed in +# the file and class documentation (similar to JavaDoc). +# Set to NO to disable this. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend +# the brief description of a member or function before the detailed description. +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is used +# as the annotated text. Otherwise, the brief description is used as-is. If left +# blank, the following values are used ("$name" is automatically replaced with the +# name of the entity): "The $name class" "The $name widget" "The $name file" +# "is" "provides" "specifies" "contains" "represents" "a" "an" "the" + +ABBREVIATE_BRIEF = + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief +# description. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all inherited +# members of a class in the documentation of that class as if those members were +# ordinary class members. Constructors, destructors and assignment operators of +# the base classes will not be shown. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full +# path before files name in the file list and in the header files. If set +# to NO the shortest path that makes the file name unique will be used. + +FULL_PATH_NAMES = NO + +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag +# can be used to strip a user-defined part of the path. Stripping is +# only done if one of the specified strings matches the left-hand part of +# the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the +# path to strip. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of +# the path mentioned in the documentation of a class, which tells +# the reader which header file to include in order to use a class. +# If left blank only the name of the header file containing the class +# definition is used. Otherwise one should specify the include paths that +# are normally passed to the compiler using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter +# (but less readable) file names. This can be useful is your file systems +# doesn't support long names like on DOS, Mac, or CD-ROM. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the JavaDoc +# comments will behave just like the Qt-style comments (thus requiring an +# explicit @brief command for a brief description. + +JAVADOC_AUTOBRIEF = YES + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen +# treat a multi-line C++ special comment block (i.e. a block of //! or /// +# comments) as a brief description. This used to be the default behaviour. +# The new default is to treat a multi-line C++ comment block as a detailed +# description. Set this tag to YES if you prefer the old behaviour instead. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the DETAILS_AT_TOP tag is set to YES then Doxygen +# will output the detailed description near the top, like JavaDoc. +# If set to NO, the detailed description appears after the member +# documentation. + +DETAILS_AT_TOP = NO + +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it +# re-implements. + +INHERIT_DOCS = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. + +DISTRIBUTE_GROUP_DOC = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# Doxygen uses this value to replace tabs by spaces in code fragments. + +TAB_SIZE = 8 + +# This tag can be used to specify a number of aliases that acts +# as commands in the documentation. An alias has the form "name=value". +# For example adding "sideeffect=\par Side Effects:\n" will allow you to +# put the command \sideeffect (or @sideeffect) in the documentation, which +# will result in a user-defined paragraph with heading "Side Effects:". +# You can put \n's in the value part of an alias to insert newlines. + +ALIASES = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources +# only. Doxygen will then generate output that is more tailored for C. +# For instance, some of the names that are used will be different. The list +# of all members will be omitted, etc. + +OPTIMIZE_OUTPUT_FOR_C = NO + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources +# only. Doxygen will then generate output that is more tailored for Java. +# For instance, namespaces will be presented as packages, qualified scopes +# will look different, etc. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of +# the same type (for instance a group of public functions) to be put as a +# subgroup of that type (e.g. under the Public Functions section). Set it to +# NO to prevent subgrouping. Alternatively, this can be done per class using +# the \nosubgrouping command. + +SUBGROUPING = YES + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES + +EXTRACT_ALL = YES + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = NO + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) +# defined locally in source files will be included in the documentation. +# If set to NO only classes defined in header files are included. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. When set to YES local +# methods, which are defined in the implementation section but not in +# the interface are included in the documentation. +# If set to NO (the default) only methods in the interface are included. + +EXTRACT_LOCAL_METHODS = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. +# This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these classes will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all +# friend (class|struct|union) declarations. +# If set to NO (the default) these declarations will be included in the +# documentation. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. +# If set to NO (the default) these blocks will be appended to the +# function's detailed documentation block. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. +# Set it to YES to include the internal documentation. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate +# file names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. + +CASE_SENSE_NAMES = YES + +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the +# documentation. If set to YES the scope will be hidden. + +HIDE_SCOPE_NAMES = NO + +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = YES + +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# is inserted in the documentation for inline members. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen +# will sort the (detailed) documentation of file and class members +# alphabetically by member name. If set to NO the members will appear in +# declaration order. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in +# declaration order. + +SORT_BRIEF_DOCS = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be +# sorted by fully-qualified names, including namespaces. If set to +# NO (the default), the class list will be sorted only by class name, +# not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the +# alphabetical list. + +SORT_BY_SCOPE_NAME = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or +# disable (NO) the todo list. This list is created by putting \todo +# commands in the documentation. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or +# disable (NO) the test list. This list is created by putting \test +# commands in the documentation. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or +# disable (NO) the bug list. This list is created by putting \bug +# commands in the documentation. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or +# disable (NO) the deprecated list. This list is created by putting +# \deprecated commands in the documentation. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional +# documentation sections, marked by \if sectionname ... \endif. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines +# the initial value of a variable or define consists of for it to appear in +# the documentation. If the initializer consists of more lines than specified +# here it will be hidden. Use a value of 0 to hide initializers completely. +# The appearance of the initializer of individual variables and defines in the +# documentation can be controlled using \showinitializer or \hideinitializer +# command in the documentation regardless of this setting. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated +# at the bottom of the documentation of classes and structs. If set to YES the +# list will mention the files that were used to generate the documentation. + +SHOW_USED_FILES = YES + +# If the sources in your project are distributed over multiple directories +# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy +# in the documentation. + +SHOW_DIRECTORIES = YES + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated +# by doxygen. Possible values are YES and NO. If left blank NO is used. + +QUIET = YES + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank +# NO is used. + +WARNINGS = NO + +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# automatically be disabled. + +WARN_IF_UNDOCUMENTED = NO + +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some +# parameters in a documented function, or documenting parameters that +# don't exist or using markup commands wrongly. + +WARN_IF_DOC_ERROR = YES + +# The WARN_FORMAT tag determines the format of the warning messages that +# doxygen can produce. The string should contain the $file, $line, and $text +# tags, which will be replaced by the file and line number from which the +# warning originated and the warning text. + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning +# and error messages should be written. If left blank the output is written +# to stderr. + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT = . \ + desktop \ + dialogs \ + shell \ + taskbar \ + utility + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank the following patterns are tested: +# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp +# *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm + +FILE_PATTERNS = *.cpp \ + *.c \ + *.hpp \ + *.h + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = NO + +# The EXCLUDE tag can be used to specify files and/or directories that should +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used select whether or not files or directories +# that are symbolic links (a Unix filesystem feature) are excluded from the input. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. + +EXCLUDE_PATTERNS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. +# Possible values are YES and NO. If left blank NO is used. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command , where +# is the value of the INPUT_FILTER tag, and is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. If FILTER_PATTERNS is specified, this tag will be +# ignored. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: +# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further +# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER +# is applied to all files. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will be used to filter the input files when producing source +# files to browse (i.e. when SOURCE_BROWSER is set to YES). + +FILTER_SOURCE_FILES = NO + +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will +# be generated. Documented entities will be cross-referenced with these sources. +# Note: To get rid of all source code in the generated output, make sure also +# VERBATIM_HEADERS is set to NO. + +SOURCE_BROWSER = YES + +# Setting the INLINE_SOURCES tag to YES will include the body +# of functions and classes directly in the documentation. + +INLINE_SOURCES = YES + +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code +# fragments. Normal C and C++ comments will always remain visible. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES (the default) +# then for each documented function all documented +# functions referencing it will be listed. + +REFERENCED_BY_RELATION = YES + +# If the REFERENCES_RELATION tag is set to YES (the default) +# then for each documented function all documented entities +# called/used by that function will be listed. + +REFERENCES_RELATION = YES + +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen +# will generate a verbatim copy of the header file for each class for +# which an include is specified. Set to NO to disable this. + +VERBATIM_HEADERS = YES + +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index +# of all compounds will be generated. Enable this if the project +# contains a lot of classes, structs, unions or interfaces. + +ALPHABETICAL_INDEX = YES + +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# in which this list will be split (can be a number in the range [1..20]) + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all +# classes will be put under the same header in the alphabetical index. +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that +# should be ignored while generating the index headers. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# generate HTML output. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `html' will be used as the default path. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for +# each generated HTML page (for example: .htm,.php,.asp). If it is left blank +# doxygen will generate files with .html extension. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a +# standard footer. + +HTML_FOOTER = doxy-footer.html + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading +# style sheet that is used by each HTML page. It can be used to +# fine-tune the look of the HTML output. If the tag is left blank doxygen +# will generate a default style sheet. Note that doxygen will try to copy +# the style sheet file to the HTML output directory, so don't put your own +# stylesheet in the HTML output directory as well, or it will be erased! + +HTML_STYLESHEET = + +# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, +# files or namespaces will be aligned in HTML using tables. If set to +# NO a bullet list will be used. + +HTML_ALIGN_MEMBERS = YES + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compressed HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = YES + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can +# be used to specify the file name of the resulting .chm file. You +# can add a path in front of the file if the result should not be +# written to the html output directory. + +CHM_FILE = + +# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can +# be used to specify the location (absolute path including file name) of +# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run +# the HTML help compiler on the generated index.hhp. + +HHC_LOCATION = + +# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag +# controls if a separate .chi index file is generated (YES) or that +# it should be included in the master .chm file (NO). + +GENERATE_CHI = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag +# controls whether a binary table of contents is generated (YES) or a +# normal table of contents (NO) in the .chm file. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members +# to the contents of the HTML help documentation and to the tree view. + +TOC_EXPAND = NO + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index at +# top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. + +DISABLE_INDEX = NO + +# This tag can be used to set the number of enum values (range [1..20]) +# that doxygen will group on one line in the generated HTML documentation. + +ENUM_VALUES_PER_LINE = 4 + +# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be +# generated containing a tree-like index structure (just like the one that +# is generated for HTML Help). For this to work a browser that supports +# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, +# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are +# probably better off using the HTML help feature. + +GENERATE_TREEVIEW = YES + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be +# used to set the initial width (in pixels) of the frame in which the tree +# is shown. + +TREEVIEW_WIDTH = 240 + +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# generate Latex output. + +GENERATE_LATEX = NO + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `latex' will be used as the default path. + +LATEX_OUTPUT = latex + +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# invoked. If left blank `latex' will be used as the default command name. + +LATEX_CMD_NAME = latex + +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to +# generate index for LaTeX. If left blank `makeindex' will be used as the +# default command name. + +MAKEINDEX_CMD_NAME = makeindex + +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_LATEX = NO + +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, a4wide, letter, legal and +# executive. If left blank a4wide will be used. + +PAPER_TYPE = a4wide + +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# packages that should be included in the LaTeX output. + +EXTRA_PACKAGES = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a +# standard header. Notice: only use this tag if you know what you are doing! + +LATEX_HEADER = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references +# This makes the output suitable for online browsing using a pdf viewer. + +PDF_HYPERLINKS = NO + +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a +# higher quality PDF documentation. + +USE_PDFLATEX = NO + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. +# This option is also used when generating formulas in HTML. + +LATEX_BATCHMODE = NO + +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) +# in the output. + +LATEX_HIDE_INDICES = NO + +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimized for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `rtf' will be used as the default path. + +RTF_OUTPUT = rtf + +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_RTF = YES + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using WORD or other +# programs which support those fields. +# Note: wordpad (write) and others do not support links. + +RTF_HYPERLINKS = YES + +# Load stylesheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assignments. You only have to provide +# replacements, missing definitions are set to their default value. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an rtf document. +# Syntax is similar to doxygen's config file. + +RTF_EXTENSIONS_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# generate man pages + +GENERATE_MAN = NO + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `man' will be used as the default path. + +MAN_OUTPUT = man + +# The MAN_EXTENSION tag determines the extension that is added to +# the generated man pages (default is the subroutine's section .3) + +MAN_EXTENSION = .3 + +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, +# then it will generate one additional man file for each entity +# documented in the real man page(s). These additional files +# only source the real man page, but without them the man command +# would be unable to find the correct page. The default is NO. + +MAN_LINKS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of +# the code including all documentation. + +GENERATE_XML = NO + +# The XML_OUTPUT tag is used to specify where the XML pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `xml' will be used as the default path. + +XML_OUTPUT = xml + +# The XML_SCHEMA tag can be used to specify an XML schema, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_SCHEMA = + +# The XML_DTD tag can be used to specify an XML DTD, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_DTD = + +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that +# enabling this will significantly increase the size of the XML output. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- + +# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will +# generate an AutoGen Definitions (see autogen.sf.net) file +# that captures the structure of the code including all +# documentation. Note that this feature is still experimental +# and incomplete at the moment. + +GENERATE_AUTOGEN_DEF = NO + +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# to generate PDF and DVI output from the Perl module output. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. This is useful +# if you want to understand what is going on. On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller +# and Perl will parse it just the same. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same +# Makefile don't overwrite each other's variables. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include +# files. + +ENABLE_PREPROCESSING = YES + +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled +# way by setting EXPAND_ONLY_PREDEF to YES. + +MACRO_EXPANSION = NO + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the +# PREDEFINED and EXPAND_AS_PREDEFINED tags. + +EXPAND_ONLY_PREDEF = NO + +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# in the INCLUDE_PATH (see below) will be search if a #include is found. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by +# the preprocessor. + +INCLUDE_PATH = + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will +# be used. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. To prevent a macro definition from being +# undefined via #undef or recursively expanded use the := operator +# instead of the = operator. + +PREDEFINED = __cplusplus + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then +# this tag can be used to specify a list of macro names that should be expanded. +# The macro definition that is found in the sources will be used. +# Use the PREDEFINED tag if you want to use a different macro definition. + +EXPAND_AS_DEFINED = + +# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then +# doxygen's preprocessor will remove all function-like macros that are alone +# on a line, have an all uppercase name, and do not end with a semicolon. Such +# function macros are typically used for boiler-plate code, and will confuse the +# parser if not removed. + +SKIP_FUNCTION_MACROS = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES option can be used to specify one or more tagfiles. +# Optionally an initial location of the external documentation +# can be added for each tagfile. The format of a tag file without +# this location is as follows: +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths or +# URLs. If a location is present for each tag, the installdox tool +# does not have to be run to correct the links. +# Note that each tag file must have a unique name +# (where the name does NOT include the path) +# If a tag file is not located in the directory in which doxygen +# is run, you must also specify the path to the tagfile here. + +TAGFILES = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# a tag file that is based on the input files it reads. + +GENERATE_TAGFILE = + +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes +# will be listed. + +ALLEXTERNALS = NO + +# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will +# be listed. + +EXTERNAL_GROUPS = YES + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of `which perl'). + +PERL_PATH = /usr/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base or +# super classes. Setting the tag to NO turns the diagrams off. Note that this +# option is superseded by the HAVE_DOT option below. This is only a fallback. It is +# recommended to install and use dot, since it yields more powerful graphs. + +CLASS_DIAGRAMS = YES + +# If set to YES, the inheritance and collaboration graphs will hide +# inheritance and usage relations if the target is undocumented +# or is not a class. + +HIDE_UNDOC_RELATIONS = NO + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# have no effect if this option is set to NO (the default) + +HAVE_DOT = YES + +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the +# the CLASS_DIAGRAMS tag to NO. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and +# class references variables) of the class with other documented classes. + +COLLABORATION_GRAPH = YES + +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. + +UML_LOOK = NO + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = NO + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT +# tags are set to YES then doxygen will generate a graph for each documented +# file showing the direct and indirect include dependencies of the file with +# other documented files. + +INCLUDE_GRAPH = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each +# documented header file showing the documented files that directly or +# indirectly include this file. + +INCLUDED_BY_GRAPH = YES + +# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will +# generate a call dependency graph for every global function or class method. +# Note that enabling this option will significantly increase the time of a run. +# So in most cases it will be better to enable call graphs for selected +# functions only using the \callgraph command. + +CALL_GRAPH = YES + +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# will graphical hierarchy of all classes instead of a textual one. + +GRAPHICAL_HIERARCHY = YES + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. Possible values are png, jpg, or gif +# If left blank png will be used. + +DOT_IMAGE_FORMAT = png + +# The tag DOT_PATH can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found on the path. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the +# \dotfile command). + +DOTFILE_DIRS = + +# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width +# (in pixels) of the graphs generated by dot. If a graph becomes larger than +# this value, doxygen will try to truncate the graph, so that it fits within +# the specified constraint. Beware that most browsers cannot cope with very +# large images. + +MAX_DOT_GRAPH_WIDTH = 1024 + +# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height +# (in pixels) of the graphs generated by dot. If a graph becomes larger than +# this value, doxygen will try to truncate the graph, so that it fits within +# the specified constraint. Beware that most browsers cannot cope with very +# large images. + +MAX_DOT_GRAPH_HEIGHT = 1024 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the +# graphs generated by dot. A depth value of 3 means that only nodes reachable +# from the root by following a path via at most 3 edges will be shown. Nodes that +# lay further from the root node will be omitted. Note that setting this option to +# 1 or 2 may greatly reduce the computation time needed for large code bases. Also +# note that a graph may be further truncated if the graph's image dimensions are +# not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH and MAX_DOT_GRAPH_HEIGHT). +# If 0 is used for the depth value (the default), the graph is not depth-constrained. + +MAX_DOT_GRAPH_DEPTH = 0 + +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will +# generate a legend page explaining the meaning of the various boxes and +# arrows in the dot generated graphs. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will +# remove the intermediate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to the search engine +#--------------------------------------------------------------------------- + +# The SEARCHENGINE tag specifies whether or not a search engine should be +# used. If set to NO the values of all tags below this one will be ignored. + +SEARCHENGINE = YES diff --git a/reactos/base/shell/explorer/Jamfile b/reactos/base/shell/explorer/Jamfile new file mode 100644 index 00000000000..0938167f781 --- /dev/null +++ b/reactos/base/shell/explorer/Jamfile @@ -0,0 +1,60 @@ +# +# Jamfile for Explorer to be used with Boost Build V2 +# + + +# import rc ; +import rc-mingw ; + + +EXPAT_INC = [ modules.peek : EXPAT_INC ] ; + +exe explorer : + explorer.cpp + explorer_intres.rc + shell/entries.cpp + shell/filechild.cpp + shell/mainframe.cpp + shell/pane.cpp + shell/shellbrowser.cpp + shell/shellfs.cpp + shell/unixfs.cpp + shell/winfs.cpp + shell/ntobjfs.cpp + shell/regfs.cpp + shell/fatfs.cpp + shell/webchild.cpp + services/startup.c + services/shellservices.cpp + taskbar/desktopbar.cpp + taskbar/quicklaunch.cpp + taskbar/startmenu.cpp + taskbar/taskbar.cpp + taskbar/traynotify.cpp + taskbar/favorites.cpp + desktop/desktop.cpp +# utility/splitpath.c + utility/dragdropimpl.cpp + utility/shellbrowserimpl.cpp + utility/shellclasses.cpp + utility/utility.cpp + utility/window.cpp + utility/xmlstorage.cpp + dialogs/searchprogram.cpp + dialogs/settings.cpp + i386-stub-win32.c + : WIN32 _WIN32_IE=0x0600 _WIN32_WINNT=0x0501 WINVER=0x0500 + . $(EXPAT_INC) +# only for GCC: -fexceptions -Wall -Wno-unused-value + gdi32 + ole32 + comctl32 + uuid + wsock32 + oleaut32 + msimg32 +# expat + notifyhook.dll + libexpat.dll + ; + diff --git a/reactos/base/shell/explorer/Make-rosshell.MinGW b/reactos/base/shell/explorer/Make-rosshell.MinGW new file mode 100644 index 00000000000..6d20a9c2678 --- /dev/null +++ b/reactos/base/shell/explorer/Make-rosshell.MinGW @@ -0,0 +1,92 @@ +# +# ReactOS shell +# +# Makefile.PCH +# +# MinGW Makefile with precompiled header support +# + +CC = gcc +CXX = g++ +LINK = g++ + +CFLAGS = -DWIN32 -DROSSHELL -D_WIN32_IE=0x0600 -D_WIN32_WINNT=0x0501 -DWINVER=0x0500 -fexceptions -Wall -I. -I$(EXPAT_INC) +RCFLAGS = -DWIN32 -DROSSHELL -D__WINDRES__ +LFLAGS = -Wl,--subsystem,windows + +ifdef DEBUG +CFLAGS += -D_DEBUG -g +RCFLAGS += -D_DEBUG +LFLAGS += -g +else +CFLAGS += -DNDEBUG -Os #-march=pentium4 +RCFLAGS += -DNDEBUG +LFLAGS += -s +endif + +ifndef UNICODE +UNICODE = 1 +endif + +ifeq ($(UNICODE),1) +CFLAGS += -DUNICODE +# LFLAGS+= -Wl,--entry,_wWinMain@16 +RCFLAGS += -DUNICODE +endif + +CXXFLAGS = $(CFLAGS) + +EXEC_SUFFIX = .exe +RES_SUFFIX = .coff + +VPATH = shell utility taskbar desktop dialogs services + +PROGRAM = rosshell + +TARGET = $(PROGRAM)$(EXEC_SUFFIX) + +OBJECTS = \ + startup.o \ + shellclasses.o \ + utility.o \ + window.o \ + dragdropimpl.o \ + shellbrowserimpl.o \ + explorer.o \ + entries.o \ + winfs.o \ + shellfs.o \ + pane.o \ + desktop.o \ + desktopbar.o \ + taskbar.o \ + startmenu.o \ + shellservices.o \ + traynotify.o \ + quicklaunch.o \ + favorites.o \ + searchprogram.o \ + settings.o \ + i386-stub-win32.o \ + xmlstorage.o + +LIBS = gdi32 comctl32 msimg32 ole32 uuid +DELAYIMPORTS = oleaut32 wsock32 + +all: precomp.h.gch $(TARGET) + +precomp.h.gch: *.h utility/*.h shell/*.h desktop/*.h + $(CXX) $(CFLAGS) precomp.h + +$(TARGET): $(OBJECTS) $(PROGRAM)$(RES_SUFFIX) notifyhook.dll libexpat.dll + $(LINK) $(LFLAGS) -o $@ $^ $(addprefix -l,$(LIBS)) $(addprefix -l,$(DELAYIMPORTS)) + +$(PROGRAM)$(RES_SUFFIX): explorer_intres.rc res/*.bmp res/*.ico + windres $(RCFLAGS) -o $@ explorer_intres.rc + +notifyhook.dll: notifyhook/notifyhook.c notifyhook/notifyhook.h + $(CC) -D_WIN32_IE=0x0600 -Wall -D_NOTIFYHOOK_IMPL -Os -s notifyhook/notifyhook.c -shared -o $@ + +clean: + rm -f $(TARGET) $(OBJECTS) $(PROGRAM)$(RES_SUFFIX) precomp.h.gch \ + desktop/*.o dialogs/*.o shell/*.o taskbar/*.o utility/*.o diff --git a/reactos/base/shell/explorer/Make-rosshell.mak b/reactos/base/shell/explorer/Make-rosshell.mak new file mode 100644 index 00000000000..fa428b1acc1 --- /dev/null +++ b/reactos/base/shell/explorer/Make-rosshell.mak @@ -0,0 +1,68 @@ +# +# ReactOS shell +# +# Makefile +# + +PATH_TO_TOP := ../../.. + +TARGET_TYPE := program + +TARGET_APPTYPE := windows + +TARGET_NAME := rosshell + +TARGET_INSTALLDIR := . + +TARGET_CFLAGS := \ + -D__USE_W32API -DWIN32 -D_ROS_ \ + -D_WIN32_IE=0x0600 -D_WIN32_WINNT=0x0501 -DWINVER=0x0500 \ + -DUNICODE -fexceptions -Wall -g \ + -I../../../include/expat + +TARGET_CPPFLAGS := $(TARGET_CFLAGS) + +TARGET_RCFLAGS := -D__USE_W32API -DWIN32 -D_ROS_ -D__WINDRES__ + +TARGET_SDKLIBS := \ + gdi32.a user32.a comctl32.a ole32.a oleaut32.a shell32.a expat.a \ + notifyhook.a ws2_32.a msimg32.a + +TARGET_GCCLIBS := stdc++ uuid + +TARGET_OBJECTS := \ + explorer.o \ + i386-stub-win32.o \ + desktop/desktop.o \ + dialogs/searchprogram.o \ + dialogs/settings.o \ + shell/entries.o \ + shell/shellfs.o \ + shell/pane.o \ + shell/winfs.o \ + services/startup.o \ + services/shellservices.o \ + taskbar/desktopbar.o \ + taskbar/taskbar.o \ + taskbar/startmenu.o \ + taskbar/traynotify.o \ + taskbar/quicklaunch.o \ + taskbar/favorites.o \ + utility/shellclasses.o \ + utility/utility.o \ + utility/window.o \ + utility/dragdropimpl.o \ + utility/shellbrowserimpl.o \ + utility/xmlstorage.o + +TARGET_CPPAPP := yes + +TARGET_PCH := precomp.h + +SUBDIRS := notifyhook + +DEP_OBJECTS := $(TARGET_OBJECTS) + +include $(PATH_TO_TOP)/rules.mak +include $(TOOLS_PATH)/helper.mk +include $(TOOLS_PATH)/depend.mk diff --git a/reactos/base/shell/explorer/Makefile.MinGW b/reactos/base/shell/explorer/Makefile.MinGW new file mode 100644 index 00000000000..678fe28ae8d --- /dev/null +++ b/reactos/base/shell/explorer/Makefile.MinGW @@ -0,0 +1,96 @@ +# +# ReactOS explorer +# +# Makefile.MinGW +# + +CC = gcc +CXX = g++ +LINK = g++ + +# -D_NO_ALPHABLEND for builds without msimg32.dll dependency +CFLAGS = -DWIN32 -D_WIN32_IE=0x0600 -D_WIN32_WINNT=0x0501 -DWINVER=0x0500 -fexceptions -Wall -I. -I$(EXPAT_INC) +RCFLAGS = -DWIN32 -D__WINDRES__ +LFLAGS = -Wl,--subsystem,windows + +ifdef DEBUG +CFLAGS += -D_DEBUG -g +RCFLAGS += -D_DEBUG +LFLAGS += -g +else +CFLAGS += -DNDEBUG -Os +RCFLAGS += -DNDEBUG +LFLAGS += -s +endif + +ifndef UNICODE +UNICODE = 1 +endif + +ifeq ($(UNICODE),1) +CFLAGS += -DUNICODE +# LFLAGS+= -Wl,--entry,_wWinMain@16 +RCFLAGS += -DUNICODE +endif + +CXXFLAGS = $(CFLAGS) + +EXEC_SUFFIX = .exe +RES_SUFFIX = .coff + +VPATH = shell utility taskbar desktop dialogs services + +PROGRAM = explorer + +TARGET = $(PROGRAM)$(EXEC_SUFFIX) + +OBJECTS = \ + startup.o \ + shellclasses.o \ + utility.o \ + window.o \ + dragdropimpl.o \ + shellbrowserimpl.o \ + shellservices.o \ + explorer.o \ + entries.o \ + winfs.o \ + unixfs.o \ + shellfs.o \ + ntobjfs.o \ + regfs.o \ + fatfs.o \ + webchild.o \ + mainframe.o \ + filechild.o \ + pane.o \ + shellbrowser.o \ + desktop.o \ + desktopbar.o \ + taskbar.o \ + startmenu.o \ + traynotify.o \ + quicklaunch.o \ + favorites.o \ + searchprogram.o \ + settings.o \ + i386-stub-win32.o \ + xmlstorage.o + +LIBS = gdi32 comctl32 msimg32 ole32 uuid +DELAYIMPORTS = oleaut32 wsock32 + +all: $(TARGET) + +$(TARGET): $(OBJECTS) $(PROGRAM)$(RES_SUFFIX) notifyhook.dll libexpat.dll + $(LINK) $(LFLAGS) -o $@ $^ $(addprefix -l,$(LIBS)) $(addprefix -l,$(DELAYIMPORTS)) + +$(PROGRAM)$(RES_SUFFIX): $(PROGRAM)_intres.rc res/*.bmp res/*.ico + windres $(RCFLAGS) -o $@ $(PROGRAM)_intres.rc + +notifyhook.dll: notifyhook/notifyhook.c notifyhook/notifyhook.h + $(CC) -D_WIN32_IE=0x0600 -Wall -D_NOTIFYHOOK_IMPL -Os -s notifyhook/notifyhook.c -shared -o $@ + +clean: + rm -f $(TARGET) $(OBJECTS) $(PROGRAM)$(RES_SUFFIX) \ + desktop/*.o dialogs/*.o shell/*.o taskbar/*.o utility/*.o diff --git a/reactos/base/shell/explorer/Makefile.PCH b/reactos/base/shell/explorer/Makefile.PCH new file mode 100644 index 00000000000..a301d6ae7ee --- /dev/null +++ b/reactos/base/shell/explorer/Makefile.PCH @@ -0,0 +1,100 @@ +# +# ReactOS explorer +# +# Makefile.PCH +# +# MinGW Makefile with precompiled header support +# + +CC = gcc +CXX = g++ +LINK = g++ + +CFLAGS = -DWIN32 -D_WIN32_IE=0x0600 -D_WIN32_WINNT=0x0501 -DWINVER=0x0500 -fexceptions -Wall -I. -I$(EXPAT_INC) +RCFLAGS = -DWIN32 -D__WINDRES__ +LFLAGS = -Wl,--subsystem,windows + +ifdef DEBUG +CFLAGS += -D_DEBUG -g +RCFLAGS += -D_DEBUG +LFLAGS += -g +else +CFLAGS += -DNDEBUG -Os #-march=pentium4 +RCFLAGS += -DNDEBUG +LFLAGS += -s +endif + +ifndef UNICODE +UNICODE = 1 +endif + +ifeq ($(UNICODE),1) +CFLAGS += -DUNICODE +# LFLAGS+= -Wl,--entry,_wWinMain@16 +RCFLAGS += -DUNICODE +endif + +CXXFLAGS = $(CFLAGS) + +EXEC_SUFFIX = .exe +RES_SUFFIX = .coff + +VPATH = shell utility taskbar desktop dialogs services + +PROGRAM = explorer + +TARGET = $(PROGRAM)$(EXEC_SUFFIX) + +OBJECTS = \ + startup.o \ + shellclasses.o \ + utility.o \ + window.o \ + dragdropimpl.o \ + shellbrowserimpl.o \ + shellservices.o \ + explorer.o \ + entries.o \ + winfs.o \ + unixfs.o \ + shellfs.o \ + ntobjfs.o \ + regfs.o \ + fatfs.o \ + webchild.o \ + mainframe.o \ + filechild.o \ + pane.o \ + shellbrowser.o \ + desktop.o \ + desktopbar.o \ + taskbar.o \ + startmenu.o \ + traynotify.o \ + quicklaunch.o \ + favorites.o \ + searchprogram.o \ + settings.o \ + i386-stub-win32.o \ + xmlstorage.o + +LIBS = gdi32 comctl32 msimg32 ole32 uuid +DELAYIMPORTS = oleaut32 wsock32 + +all: precomp.h.gch $(TARGET) + +precomp.h.gch: *.h utility/*.h shell/*.h desktop/*.h + $(CXX) $(CFLAGS) precomp.h + +$(TARGET): $(OBJECTS) $(PROGRAM)$(RES_SUFFIX) notifyhook.dll libexpat.dll + $(LINK) $(LFLAGS) -o $@ $^ $(addprefix -l,$(LIBS)) $(addprefix -l,$(DELAYIMPORTS)) + +$(PROGRAM)$(RES_SUFFIX): explorer_intres.rc res/*.bmp res/*.ico + windres $(RCFLAGS) -o $@ explorer_intres.rc + +notifyhook.dll: notifyhook/notifyhook.c notifyhook/notifyhook.h + $(CC) -D_WIN32_IE=0x0600 -Wall -D_NOTIFYHOOK_IMPL -Os -s notifyhook/notifyhook.c -shared -o $@ + +clean: + rm -f $(TARGET) $(OBJECTS) $(PROGRAM)$(RES_SUFFIX) precomp.h.gch \ + desktop/*.o dialogs/*.o shell/*.o taskbar/*.o utility/*.o diff --git a/reactos/base/shell/explorer/Makefile.Wine b/reactos/base/shell/explorer/Makefile.Wine new file mode 100644 index 00000000000..c4d51b3f6e0 --- /dev/null +++ b/reactos/base/shell/explorer/Makefile.Wine @@ -0,0 +1,400 @@ +TOPSRCDIR = ../.. +TOPOBJDIR = ../.. +SRCDIR = . + +MODULE = explorer.exe +APPMODE = gui +IMPORTS = shell32 comctl32 msimg32 ole32 user32 gdi32 kernel32 advapi32 oleaut32 +EXTRADEFS = -D__WINE__ -D_WIN32_IE=0x0600 -D_WIN32_WINNT=0x0501 -DWINVER=0x0500 -D__MINGW32__ -DCINTERFACE +EXTRA_OBJS = notifyhook.dll libexpat.dll +EXTRALIBS = $(LIBUUID) + +C_SRCS = \ + services/startup.c \ + utility/splitpath.c + +CPP_SRCS = \ + explorer.cpp \ + desktop/desktop.cpp \ + utility/shellclasses.cpp \ + utility/utility.cpp \ + utility/window.cpp \ + utility/dragdropimpl.cpp \ + utility/shellbrowserimpl.cpp \ + utility/xmlstorage.cpp \ + shell/entries.cpp \ + shell/winfs.cpp \ + shell/unixfs.cpp \ + shell/shellfs.cpp \ + shell/mainframe.cpp \ + shell/filechild.cpp \ + shell/pane.cpp \ + shell/shellbrowser.cpp \ + shell/ntobjfs.cpp \ + shell/regfs.cpp \ + shell/fatfs.cpp \ + shell/webchild.cpp \ + services/shellservices.cpp \ + taskbar/desktopbar.cpp \ + taskbar/taskbar.cpp \ + taskbar/startmenu.cpp \ + taskbar/traynotify.cpp \ + taskbar/quicklaunch.cpp \ + taskbar/favorites.cpp \ + dialogs/searchprogram.cpp \ + dialogs/settings.cpp + +RC_SRCS = explorer_intres.rc +EXTRARCFLAGS = -D__WRC__ -D_WIN32 + + +# Global rules for building a Winelib program -*-Makefile-*- +# +# Each individual makefile should define the following variables: +# MODULE : name of the main module being built +# APPMODE : program mode (cui,gui,cuiw,guiw) +# EXTRALIBS : extra libraries to link in (optional) +# EXTRADEFS : extra symbol definitions, like -DWINELIB (optional) +# +# plus all variables required by the global Make.rules.in +# + +DEFS = -D_REENTRANT -fPIC $(EXTRADEFS) +LDDLLFLAGS = -Wl,-Bsymbolic,-z,defs +ALL_OBJS = $(OBJS) $(MODULE).dbg.o +ALL_LIBS = $(LIBWINE) $(EXTRALIBS) $(LIBPORT) $(LDFLAGS) $(LIBS) +BASEMODULE = $(MODULE:.exe=) +TESTIMPORTS = $(DELAYIMPORTS) $(IMPORTS) +RUNTESTFLAGS= -q -P wine -T $(TOPOBJDIR) $(PLTESTPROGRAM:%=-p %) + + +# Global rules shared by all makefiles -*-Makefile-*- +# +# Each individual makefile must define the following variables: +# TOPSRCDIR : top-level source directory +# TOPOBJDIR : top-level object directory +# SRCDIR : source directory for this module +# MODULE : name of the module being built +# +# Each individual makefile may define the following additional variables: +# C_SRCS : C sources for the module +# CPP_SRCS : C++ sources for the module +# C_SRCS16 : 16-bit C sources for the module +# RC_SRCS : resource source files +# EXTRA_SRCS : extra source files for make depend +# EXTRA_OBJS : extra object files +# IMPORTS : dlls to import +# DELAYIMPORTS : dlls to import in delayed mode +# SUBDIRS : subdirectories that contain a Makefile +# EXTRASUBDIRS : subdirectories that do not contain a Makefile +# INSTALLSUBDIRS : subdirectories to run make install/uninstall into + +# First some useful definitions + +SHELL = /bin/sh +CC = gcc +CXX = g++ +CPP = gcc -E +#CFLAGS = -g -O2 +CFLAGS = -g +CPPFLAGS = +LIBS = -lm -lstdc++ +YACC = bison -y +LEX = flex +LEXLIB = -lfl +EXEEXT = +OBJEXT = o +LIBEXT = so +DLLEXT = .so +IMPLIBEXT = def +LDSHARED = $(CC) -shared $(SONAME:%=-Wl,-soname,%) +DLLTOOL = false +DLLWRAP = +AR = ar rc +RANLIB = ranlib +STRIP = strip +WINDRES = mingw32-windres +LN = ln +LN_S = ln -s +TOOLSDIR = $(TOPOBJDIR) +AS = as +LD = ld +LDFLAGS = +LDCOMBINE = $(LD) -r +RM = rm -f +MV = mv +LINT = +LINTFLAGS = +INCLUDES = -I$(SRCDIR) -I. -I$(TOPSRCDIR)/include -I$(TOPOBJDIR)/include $(EXTRAINCL) +EXTRACFLAGS = -mpreferred-stack-boundary=2 -fno-strict-aliasing -gstabs+ -Wpointer-arith +ALLCFLAGS = $(INCLUDES) $(DEFS) $(EXTRACFLAGS) $(CPPFLAGS) $(CFLAGS) +ALLLINTFLAGS = $(INCLUDES) $(DEFS) $(LINTFLAGS) +MKINSTALLDIRS= $(TOPSRCDIR)/tools/mkinstalldirs -m 755 +WINAPI_CHECK = $(TOPSRCDIR)/tools/winapi_check/winapi_check +WINEWRAPPER = $(TOPSRCDIR)/tools/winewrapper +C2MAN = $(TOPSRCDIR)/tools/c2man.pl +RUNTEST = $(TOPSRCDIR)/tools/runtest +WINEBUILD = $(TOOLSDIR)/tools/winebuild/winebuild +MAKEDEP = $(TOOLSDIR)/tools/makedep +WRC = $(TOOLSDIR)/tools/wrc/wrc +WMC = $(TOOLSDIR)/tools/wmc/wmc +WIDL = $(TOOLSDIR)/tools/widl/widl +RC = $(WRC) +RC16 = $(WRC) +RCFLAGS = --nostdinc $(INCLUDES) $(EXTRARCFLAGS) +RC16FLAGS = -O res16 $(RCFLAGS) +LDPATH = LD_LIBRARY_PATH="$(TOOLSDIR)/libs/unicode:$$LD_LIBRARY_PATH" +DLLDIR = $(TOPOBJDIR)/dlls +LIBDIR = $(TOPOBJDIR)/libs +LIBPORT = -L$(TOPOBJDIR)/libs/port -lwine_port +LIBUNICODE = -L$(TOPOBJDIR)/libs/unicode -lwine_unicode +LIBUUID = -L$(TOPOBJDIR)/libs/uuid -lwine_uuid +LIBWINE = -L$(TOPOBJDIR)/libs/wine -lwine + + + +# Installation infos + +INSTALL = /usr/bin/install -c $(INSTALL_FLAGS) +INSTALL_PROGRAM = ${INSTALL} $(INSTALL_PROGRAM_FLAGS) +INSTALL_SCRIPT = ${INSTALL} $(INSTALL_SCRIPT_FLAGS) +INSTALL_DATA = ${INSTALL} -m 644 $(INSTALL_DATA_FLAGS) +prefix = /usr/local +exec_prefix = ${prefix} +bindir = ${exec_prefix}/bin +libdir = ${exec_prefix}/lib +datadir = ${prefix}/share +infodir = ${prefix}/info +mandir = ${prefix}/man +sysconfdir = ${prefix}/etc +includedir = ${prefix}/include/wine +dlldir = ${exec_prefix}/lib/wine +prog_manext = 1 +api_manext = 3w +conf_manext = 5 +CLEAN_FILES = *.o *.a *.so *.ln *.$(LIBEXT) \\\#*\\\# *~ *% .\\\#* *.bak *.orig *.rej \ + *.flc *.spec.c *.spec.def *.dbg.c y.tab.c y.tab.h lex.yy.c core */*.o + +OBJS = $(C_SRCS:.c=.o) $(CPP_SRCS:.cpp=.o) $(EXTRA_OBJS) + +RCOBJS = $(RC_SRCS:.rc=.res.o) +LINTS = $(C_SRCS:.c=.ln) $(CPP_SRCS:.cpp=.ln) + +# Implicit rules + +.SUFFIXES: .mc .rc .mc.rc .res .res.o .coff .spec .spec.c .spec.def .ok + +.c.o: + $(CC) -c $(ALLCFLAGS) -o $@ $< + +.cpp.o: + $(CXX) -c $(ALLCFLAGS) -o $@ $< + +.s.o: + $(AS) -o $@ $< + +.mc.mc.rc: + $(LDPATH) $(WMC) -i -U -H /dev/null -o $@ $< + +.rc.res: + $(LDPATH) $(RC) $(RCFLAGS) -fo$@ $< + +.res.res.o: + $(WINDRES) -i $< -o $@ + +.rc.coff: + $(WINDRES) -i $< -o $@ + +.spec.spec.c: + $(WINEBUILD) $(DEFS) -o $@ --main-module $(MODULE) --spec $< + +.spec.spec.def: + $(WINEBUILD) $(DEFS) -o $@ --def $< + +.c.ln: + $(LINT) -c $(ALLLINTFLAGS) $< || ( $(RM) $@ && exit 1 ) + +.c.ok: + $(RUNTEST) $(RUNTESTFLAGS) $< && touch $@ + +# 'all' target first in case the enclosing Makefile didn't define any target + +all: Makefile + +filter: + @$(TOPSRCDIR)/tools/winapi/make_filter --make $(MAKE) all + +.PHONY: all filter + +# Rule for main module debug channels + +$(MODULE).dbg.c: $(C_SRCS) $(CPP_SRCS) $(C_SRCS16) $(WINEBUILD) + $(WINEBUILD) $(DEFS) -o $@ --debug -C$(SRCDIR) $(C_SRCS) $(CPP_SRCS) $(C_SRCS16) + +# Rule to rebuild the tools + +$(MAKEDEP): + cd $(TOOLSDIR)/tools && $(MAKE) `basename $@` + +# Rules for makefile + +Makefile: Makefile.in $(TOPSRCDIR)/configure + @echo Makefile is older than $?, please rerun $(TOPSRCDIR)/configure + @exit 1 + +# Rule for linting + +$(MODULE).ln : $(LINTS) + if test "$(LINTS)" ; \ + then \ + $(LINT) $(ALLLINTFLAGS) -o$(MODULE) $(LINTS) ; \ + $(MV) llib-l$(MODULE).ln $(MODULE).ln ; \ + else \ + $(LINT) $(ALLLINTFLAGS) -C$(MODULE) /dev/null ; \ + fi + +lint:: $(MODULE).ln + +# Rules for Windows API checking + +winapi_check:: dummy + $(WINAPI_CHECK) $(WINAPI_CHECK_FLAGS) $(WINAPI_CHECK_EXTRA_FLAGS) . + +.PHONY: winapi_check + +# Rules for dependencies + +$(SUBDIRS:%=%/__depend__): $(MAKEDEP) dummy + cd `dirname $@` && $(MAKE) depend + +depend: $(MAKEDEP) $(SUBDIRS:%=%/__depend__) + $(MAKEDEP) $(INCLUDES) -C$(SRCDIR) $(C_SRCS) $(CPP_SRCS) $(C_SRCS16) $(RC_SRCS) $(RC_SRCS16) $(MC_SRCS) $(IDL_SRCS) $(EXTRA_SRCS) + +.PHONY: depend $(SUBDIRS:%=%/__depend__) + +# Rules for cleaning + +$(SUBDIRS:%=%/__clean__): dummy + cd `dirname $@` && $(MAKE) clean + +$(SUBDIRS:%=%/__testclean__): dummy + cd `dirname $@` && $(MAKE) testclean + +$(EXTRASUBDIRS:%=%/__clean__): dummy + -cd `dirname $@` && $(RM) $(CLEAN_FILES) + +testclean:: $(SUBDIRS:%=%/__testclean__) + +clean:: $(SUBDIRS:%=%/__clean__) $(EXTRASUBDIRS:%=%/__clean__) + $(RM) $(CLEAN_FILES) $(RC_SRCS:.rc=.res) $(RC_SRCS16:.rc=.res) $(MC_SRCS:.mc=.mc.rc) $(PROGRAMS) + +.PHONY: clean testclean $(SUBDIRS:%=%/__clean__) $(SUBDIRS:%=%/__testclean__) $(EXTRASUBDIRS:%=%/__clean__) + +# Rules for installing + +$(SUBDIRS:%=%/__install__): dummy + cd `dirname $@` && $(MAKE) install + +$(SUBDIRS:%=%/__install-lib__): dummy + cd `dirname $@` && $(MAKE) install-lib + +$(SUBDIRS:%=%/__install-dev__): dummy + cd `dirname $@` && $(MAKE) install-dev + +$(SUBDIRS:%=%/__uninstall__): dummy + cd `dirname $@` && $(MAKE) uninstall + +install:: $(INSTALLSUBDIRS:%=%/__install__) + +uninstall:: $(INSTALLSUBDIRS:%=%/__uninstall__) + +.PHONY: install install-lib install-dev uninstall \ + $(SUBDIRS:%=%/__install__) $(SUBDIRS:%=%/__uninstall__) \ + $(SUBDIRS:%=%/__install-lib__) $(SUBDIRS:%=%/__install-dev__) + +# Rules for checking that no imports are missing + +$(SUBDIRS:%=%/__checklink__): dummy + @cd `dirname $@` && $(MAKE) checklink + +.PHONY: checklink $(SUBDIRS:%=%/__checklink__) + +# Rules for testing + +$(SUBDIRS:%=%/__test__): dummy + @cd `dirname $@` && $(MAKE) test + +$(SUBDIRS:%=%/__crosstest__): dummy + @cd `dirname $@` && $(MAKE) crosstest + +.PHONY: check test crosstest $(SUBDIRS:%=%/__test__) $(SUBDIRS:%=%/__crosstest__) + +# Misc. rules + +$(RC_SRCS:.rc=.res) $(RC_SRCS16:.rc=.res): $(WRC) + +$(MC_SRCS:.mc=.mc.rc): $(WMC) + +$(IDL_SRCS:.idl=.h): $(WIDL) + +$(SUBDIRS): dummy + @cd $@ && $(MAKE) + +dummy: + +.PHONY: dummy $(SUBDIRS) + +# End of global rules + +all: $(MODULE)$(DLLEXT) $(BASEMODULE)$(EXEEXT) + +# Rule for main module spec file + +$(MODULE).spec.c: $(RC_SRCS:.rc=.res) $(ALL_OBJS) $(WINEBUILD) + $(WINEBUILD) $(DEFS) -o $@ --exe $(MODULE) $(APPMODE:%=--exe-mode %) $(RC_SRCS:.rc=.res) $(ALL_OBJS) -L$(DLLDIR) $(DELAYIMPORTS:%=-d%) $(IMPORTS:%=-l%) + +# Rules for .so main module + +$(MODULE).so: $(MODULE).spec.o $(ALL_OBJS) Makefile.in + $(LDSHARED) $(LDDLLFLAGS) $(MODULE).spec.o $(ALL_OBJS) -o $@ $(ALL_LIBS) -lc + +$(BASEMODULE): $(WINEWRAPPER) + $(RM) $@ && $(LN_S) $(WINEWRAPPER) $@ + +# Rules for .exe main module + +$(MODULE): $(ALL_OBJS) $(RCOBJS) Makefile.in + $(CC) $(ALL_OBJS) $(RCOBJS) -o $@ $(DELAYIMPORTS:%=-l%) $(IMPORTS:%=-l%) $(ALL_LIBS) + +# Rules for testing + +check test:: $(SUBDIRS:%=%/__test__) + +$(TESTRESULTS): $(MODULE)$(DLLEXT) + +# Rules for installation + +.PHONY: install_prog install_prog.so uninstall_prog uninstall_prog.so + +install_prog.so: $(MODULE).so dummy + $(MKINSTALLDIRS) $(dlldir) + $(INSTALL_PROGRAM) $(MODULE).so $(dlldir)/$(MODULE).so + +install_prog: $(MODULE) dummy + $(MKINSTALLDIRS) $(bindir) + $(INSTALL_PROGRAM) $(MODULE) $(bindir)/$(MODULE) + +uninstall_prog.so: dummy + $(RM) $(dlldir)/$(MODULE).so + +uninstall_prog: dummy + $(RM) $(bindir)/$(MODULE) + +install:: install_prog$(DLLEXT) + +uninstall:: uninstall_prog$(DLLEXT) + +clean:: + $(RM) $(BASEMODULE) $(MODULE) + +### Dependencies: diff --git a/reactos/base/shell/explorer/desktop/desktop.cpp b/reactos/base/shell/explorer/desktop/desktop.cpp new file mode 100644 index 00000000000..a3d0215e522 --- /dev/null +++ b/reactos/base/shell/explorer/desktop/desktop.cpp @@ -0,0 +1,840 @@ +/* + * Copyright 2003, 2004, 2005 Martin Fuchs + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + + // + // Explorer clone + // + // desktop.cpp + // + // Martin Fuchs, 09.08.2003 + // + + +#include + +#include "../resource.h" + +#include "../taskbar/desktopbar.h" +#include "../taskbar/taskbar.h" // for PM_GET_LAST_ACTIVE + + +static BOOL (WINAPI*SetShellWindow)(HWND); +static BOOL (WINAPI*SetShellWindowEx)(HWND, HWND); + + +#ifdef _USE_HDESK + +Desktop::Desktop(HDESK hdesktop/*, HWINSTA hwinsta*/) + : _hdesktop(hdesktop) +// _hwinsta(hwinsta) +{ +} + +Desktop::~Desktop() +{ + if (_hdesktop) + CloseDesktop(_hdesktop); + +// if (_hwinsta) +// CloseWindowStation(_hwinsta); + + if (_pThread.get()) { + _pThread->Stop(); + _pThread.release(); + } +} + +#endif + + +Desktops::Desktops() + : _current_desktop(0) +{ +} + +Desktops::~Desktops() +{ + // show all hidden windows + for(iterator it_dsk=begin(); it_dsk!=end(); ++it_dsk) + for(WindowSet::iterator it=it_dsk->_windows.begin(); it!=it_dsk->_windows.end(); ++it) + ShowWindowAsync(*it, SW_SHOW); +} + +void Desktops::init() +{ + resize(DESKTOP_COUNT); + +#ifdef _USE_HDESK + DesktopPtr& desktop = (*this)[0]; + + desktop = DesktopPtr(new Desktop(OpenInputDesktop(0, FALSE, DESKTOP_SWITCHDESKTOP))); +#endif +} + +#ifdef _USE_HDESK + +void Desktops::SwitchToDesktop(int idx) +{ + if (_current_desktop == idx) + return; + + DesktopPtr& desktop = (*this)[idx]; + + DesktopThread* pThread = NULL; + + if (desktop.get()) { + if (desktop->_hdesktop) + if (!SwitchDesktop(desktop->_hdesktop)) + return; + } else { + FmtString desktop_name(TEXT("Desktop %d"), idx); + + SECURITY_ATTRIBUTES saAttr = {sizeof(SECURITY_ATTRIBUTES), 0, TRUE}; +/* + HWINSTA hwinsta = CreateWindowStation(TEXT("ExplorerWinStation"), 0, GENERIC_ALL, &saAttr); + + if (!SetProcessWindowStation(hwinsta)) + return; +*/ + HDESK hdesktop = CreateDesktop(desktop_name, NULL, NULL, 0, GENERIC_ALL, &saAttr); + if (!hdesktop) + return; + + desktop = DesktopPtr(new Desktop(hdesktop/*, hwinsta*/)); + + pThread = new DesktopThread(*desktop); + } + + _current_desktop = idx; + + if (pThread) { + desktop->_pThread = DesktopThreadPtr(pThread); + pThread->Start(); + } +} + +int DesktopThread::Run() +{ + if (!SetThreadDesktop(_desktop._hdesktop)) + return -1; + + HDESK hDesk_old = OpenInputDesktop(0, FALSE, DESKTOP_SWITCHDESKTOP); + + if (!SwitchDesktop(_desktop._hdesktop)) + return -1; + + if (!_desktop._hwndDesktop) + _desktop._hwndDesktop = DesktopWindow::Create(); + + int ret = Window::MessageLoop(); + + SwitchDesktop(hDesk_old); + + return ret; +} + +#else // _USE_HDESK + +static BOOL CALLBACK SwitchDesktopEnumFct(HWND hwnd, LPARAM lparam) +{ + WindowSet& windows = *(WindowSet*)lparam; + + if (hwnd!=g_Globals._hwndDesktopBar && hwnd!=g_Globals._hwndDesktop) + if (IsWindowVisible(hwnd)) + windows.insert(hwnd); + + return TRUE; +} + +void Desktops::SwitchToDesktop(int idx) +{ + if (_current_desktop == idx) + return; + + Desktop& old_desktop = (*this)[_current_desktop]; + WindowSet& windows = old_desktop._windows; + Desktop& desktop = (*this)[idx]; + + windows.clear(); + + // collect window handles of all other desktops + WindowSet other_wnds; + for(const_iterator it1=begin(); it1!=end(); ++it1) + for(WindowSet::const_iterator it2=it1->_windows.begin(); it2!=it1->_windows.end(); ++it2) + other_wnds.insert(*it2); + + // save currently visible application windows + EnumWindows(SwitchDesktopEnumFct, (LPARAM)&windows); + + old_desktop._hwndForeground = (HWND)SendMessage(g_Globals._hwndDesktopBar, PM_GET_LAST_ACTIVE, 0, 0); + + // hide all windows of the previous desktop + for(WindowSet::iterator it=windows.begin(); it!=windows.end(); ++it) + ShowWindowAsync(*it, SW_HIDE); + + // show all windows of the new desktop + for(WindowSet::iterator it=desktop._windows.begin(); it!=desktop._windows.end(); ++it) + ShowWindowAsync(*it, SW_SHOW); + + if (desktop._hwndForeground) + SetForegroundWindow(desktop._hwndForeground); + + // remove the window handles of the other desktops from what we found on the previous desktop + for(WindowSet::const_iterator it=other_wnds.begin(); it!=other_wnds.end(); ++it) + windows.erase(*it); + + // We don't need to store the window handles of what's now visible the now current desktop. + desktop._windows.clear(); + + _current_desktop = idx; +} + +#endif // _USE_HDESK + + +static BOOL CALLBACK MinimizeDesktopEnumFct(HWND hwnd, LPARAM lparam) +{ + list& minimized = *(list*)lparam; + + if (hwnd!=g_Globals._hwndDesktopBar && hwnd!=g_Globals._hwndDesktop) + if (IsWindowVisible(hwnd) && !IsIconic(hwnd)) { + RECT rect; + + if (GetWindowRect(hwnd,&rect)) + if (rect.right>0 && rect.bottom>0 && + rect.right>rect.left && rect.bottom>rect.top) { + minimized.push_back(MinimizeStruct(hwnd, GetWindowStyle(hwnd))); + ShowWindowAsync(hwnd, SW_MINIMIZE); + } + } + + return TRUE; +} + + /// minimize/restore all windows on the desktop +void Desktops::ToggleMinimize() +{ + list& minimized = (*this)[_current_desktop]._minimized; + + if (minimized.empty()) { + EnumWindows(MinimizeDesktopEnumFct, (LPARAM)&minimized); + } else { + for(list::const_iterator it=minimized.begin(); it!=minimized.end(); ++it) + ShowWindowAsync(it->first, it->second&WS_MAXIMIZE? SW_MAXIMIZE: SW_RESTORE); + + minimized.clear(); + } +} + + +BOOL IsAnyDesktopRunning() +{ + HINSTANCE hUser32 = GetModuleHandle(TEXT("user32")); + + SetShellWindow = (BOOL(WINAPI*)(HWND)) GetProcAddress(hUser32, "SetShellWindow"); + SetShellWindowEx = (BOOL(WINAPI*)(HWND,HWND)) GetProcAddress(hUser32, "SetShellWindowEx"); + + return GetShellWindow() != 0; +} + + +BackgroundWindow::BackgroundWindow(HWND hwnd) + : super(hwnd) +{ + // set background brush for the short moment of displaying the + // background color while moving foreground windows + SetClassLong(hwnd, GCL_HBRBACKGROUND, COLOR_BACKGROUND+1); + + _display_version = RegGetDWORDValue(HKEY_CURRENT_USER, TEXT("Control Panel\\Desktop"), TEXT("PaintDesktopVersion"), 1); +} + +LRESULT BackgroundWindow::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) +{ + switch(nmsg) { + case WM_ERASEBKGND: + DrawDesktopBkgnd((HDC)wparam); + return TRUE; + + case WM_MBUTTONDBLCLK: + /* Imagelist icons are missing if MainFrame::Create() is called directly from here! + explorer_show_frame(SW_SHOWNORMAL); */ + PostMessage(g_Globals._hwndDesktop, nmsg, wparam, lparam); + break; + + case PM_DISPLAY_VERSION: + if (lparam || wparam) { + DWORD or_mask = wparam; + DWORD reset_mask = LOWORD(lparam); + DWORD xor_mask = HIWORD(lparam); + _display_version = ((_display_version&~reset_mask) | or_mask) ^ xor_mask; + RegSetDWORDValue(HKEY_CURRENT_USER, TEXT("Control Panel\\Desktop"), TEXT("PaintDesktopVersion"), _display_version); + ///@todo Changing the PaintDesktopVersion-Flag needs a restart of the shell -> display a message box + InvalidateRect(_hwnd, NULL, TRUE); + } + return _display_version; + + default: + return super::WndProc(nmsg, wparam, lparam); + } + + return 0; +} + +void BackgroundWindow::DrawDesktopBkgnd(HDC hdc) +{ + PaintDesktop(hdc); + +/* special solid background + HBRUSH bkgndBrush = CreateSolidBrush(RGB(0,32,160)); // dark blue + FillRect(hdc, &rect, bkgndBrush); + DeleteBrush(bkgndBrush); +*/ +} + + +DesktopWindow::DesktopWindow(HWND hwnd) + : super(hwnd) +{ + _pShellView = NULL; +} + +DesktopWindow::~DesktopWindow() +{ + if (_pShellView) + _pShellView->Release(); +} + + +HWND DesktopWindow::Create() +{ + static IconWindowClass wcDesktop(TEXT("Progman"), IDI_REACTOS, CS_DBLCLKS); + /* (disabled because of small ugly temporary artefacts when hiding start menu) + wcDesktop.hbrBackground = (HBRUSH)(COLOR_BACKGROUND+1); */ + + int width = GetSystemMetrics(SM_CXSCREEN); + int height = GetSystemMetrics(SM_CYSCREEN); + + HWND hwndDesktop = Window::Create(WINDOW_CREATOR(DesktopWindow), + WS_EX_TOOLWINDOW, wcDesktop, TEXT("Program Manager"), WS_POPUP|WS_VISIBLE, //|WS_CLIPCHILDREN for SDI frames + 0, 0, width, height, 0); + + // work around to display desktop bar in Wine + ShowWindow(GET_WINDOW(DesktopWindow, hwndDesktop)->_desktopBar, SW_SHOW); + + // work around for Windows NT, Win 98, ... + // Without this the desktop has mysteriously only a size of 800x600 pixels. + MoveWindow(hwndDesktop, 0, 0, width, height, TRUE); + + return hwndDesktop; +} + + +LRESULT DesktopWindow::Init(LPCREATESTRUCT pcs) +{ + if (super::Init(pcs)) + return 1; + + HRESULT hr = GetDesktopFolder()->CreateViewObject(_hwnd, IID_IShellView, (void**)&_pShellView); +/* also possible: + SFV_CREATE sfv_create; + + sfv_create.cbSize = sizeof(SFV_CREATE); + sfv_create.pshf = GetDesktopFolder(); + sfv_create.psvOuter = NULL; + sfv_create.psfvcb = NULL; + + HRESULT hr = SHCreateShellFolderView(&sfv_create, &_pShellView); +*/ + HWND hWndView = 0; + + if (SUCCEEDED(hr)) { + FOLDERSETTINGS fs; + + fs.ViewMode = FVM_ICON; + fs.fFlags = FWF_DESKTOP|FWF_NOCLIENTEDGE|FWF_NOSCROLL|FWF_BESTFITWINDOW|FWF_SNAPTOGRID; //|FWF_AUTOARRANGE; + + ClientRect rect(_hwnd); + + hr = _pShellView->CreateViewWindow(NULL, &fs, this, &rect, &hWndView); + + ///@todo use IShellBrowser::GetViewStateStream() to restore previous view state -> see SHOpenRegStream() + + if (SUCCEEDED(hr)) { + g_Globals._hwndShellView = hWndView; + + // subclass shellview window + new DesktopShellView(hWndView, _pShellView); + + _pShellView->UIActivate(SVUIA_ACTIVATE_FOCUS); + + /* + IShellView2* pShellView2; + + hr = _pShellView->QueryInterface(IID_IShellView2, (void**)&pShellView2); + + SV2CVW2_PARAMS params; + params.cbSize = sizeof(SV2CVW2_PARAMS); + params.psvPrev = _pShellView; + params.pfs = &fs; + params.psbOwner = this; + params.prcView = ▭ + params.pvid = params.pvid;//@@ + + hr = pShellView2->CreateViewWindow2(¶ms); + params.pvid; + */ + + /* + IFolderView* pFolderView; + + hr = _pShellView->QueryInterface(IID_IFolderView, (void**)&pFolderView); + + if (SUCCEEDED(hr)) { + hr = pFolderView->GetAutoArrange(); + hr = pFolderView->SetCurrentViewMode(FVM_DETAILS); + } + */ + } + } + + if (hWndView && SetShellWindowEx) + SetShellWindowEx(_hwnd, hWndView); + else if (SetShellWindow) + SetShellWindow(_hwnd); + + // create the explorer bar + _desktopBar = DesktopBar::Create(); + g_Globals._hwndDesktopBar = _desktopBar; + + return 0; +} + + +LRESULT DesktopWindow::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) +{ + switch(nmsg) { + case WM_LBUTTONDBLCLK: + case WM_RBUTTONDBLCLK: + case WM_MBUTTONDBLCLK: + explorer_show_frame(SW_SHOWNORMAL); + break; + + case WM_GETISHELLBROWSER: + return (LRESULT)static_cast(this); + + case WM_DESTROY: + + ///@todo use IShellBrowser::GetViewStateStream() and _pShellView->SaveViewState() to store view state + + if (SetShellWindow) + SetShellWindow(0); + break; + + case WM_CLOSE: + ShowExitWindowsDialog(_hwnd); + break; + + case WM_SYSCOMMAND: + if (wparam == SC_TASKLIST) { + if (_desktopBar) + SendMessage(_desktopBar, nmsg, wparam, lparam); + } + goto def; + + default: def: + return super::WndProc(nmsg, wparam, lparam); + } + + return 0; +} + + +HRESULT DesktopWindow::OnDefaultCommand(LPIDA pida) +{ +#ifndef ROSSHELL // in shell-only-mode fall through and let shell32 handle the command + if (MainFrameBase::OpenShellFolders(pida, 0)) + return S_OK; +#endif + + return E_NOTIMPL; +} + + +DesktopShellView::DesktopShellView(HWND hwnd, IShellView* pShellView) + : super(hwnd), + _pShellView(pShellView) +{ + _hwndListView = ::GetNextWindow(hwnd, GW_CHILD); + + SetWindowStyle(_hwndListView, GetWindowStyle(_hwndListView)&~LVS_ALIGNMASK);//|LVS_ALIGNTOP|LVS_AUTOARRANGE); + + // work around for Windows NT, Win 98, ... + // Without this the desktop has mysteriously only a size of 800x600 pixels. + ClientRect rect(hwnd); + MoveWindow(_hwndListView, 0, 0, rect.right, rect.bottom, TRUE); + + // subclass background window + new BackgroundWindow(_hwndListView); + + _icon_algo = 1; // default icon arrangement + + PositionIcons(); + InitDragDrop(); +} + +bool DesktopShellView::InitDragDrop() +{ + CONTEXT("DesktopShellView::InitDragDrop()"); + + _pDropTarget = new DesktopDropTarget(_hwnd); + + if (!_pDropTarget) + return false; + + _pDropTarget->AddRef(); + + if (FAILED(RegisterDragDrop(_hwnd, _pDropTarget))) { + _pDropTarget->Release(); + _pDropTarget = NULL; + return false; + } + else + _pDropTarget->Release(); + + FORMATETC ftetc; + + ftetc.dwAspect = DVASPECT_CONTENT; + ftetc.lindex = -1; + ftetc.tymed = TYMED_HGLOBAL; + ftetc.cfFormat = CF_HDROP; + + _pDropTarget->AddSuportedFormat(ftetc); + + return true; +} + +LRESULT DesktopShellView::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) +{ + switch(nmsg) { + case WM_CONTEXTMENU: + if (!DoContextMenu(GET_X_LPARAM(lparam), GET_Y_LPARAM(lparam))) + DoDesktopContextMenu(GET_X_LPARAM(lparam), GET_Y_LPARAM(lparam)); + break; + + case PM_SET_ICON_ALGORITHM: + _icon_algo = wparam; + PositionIcons(); + break; + + case PM_GET_ICON_ALGORITHM: + return _icon_algo; + + case PM_DISPLAY_VERSION: + return SendMessage(_hwndListView, nmsg, wparam, lparam); + + default: + return super::WndProc(nmsg, wparam, lparam); + } + + return 0; +} + +int DesktopShellView::Command(int id, int code) +{ + return super::Command(id, code); +} + +int DesktopShellView::Notify(int id, NMHDR* pnmh) +{ + return super::Notify(id, pnmh); +} + +bool DesktopShellView::DoContextMenu(int x, int y) +{ + IDataObject* selection; + + HRESULT hr = _pShellView->GetItemObject(SVGIO_SELECTION, IID_IDataObject, (void**)&selection); + if (FAILED(hr)) + return false; + + PIDList pidList; + + hr = pidList.GetData(selection); + if (FAILED(hr)) { + selection->Release(); + //CHECKERROR(hr); + return false; + } + + LPIDA pida = pidList; + if (!pida->cidl) { + selection->Release(); + return false; + } + + LPCITEMIDLIST parent_pidl = (LPCITEMIDLIST) ((LPBYTE)pida+pida->aoffset[0]); + + LPCITEMIDLIST* apidl = (LPCITEMIDLIST*) alloca(pida->cidl*sizeof(LPCITEMIDLIST)); + + for(int i=pida->cidl; i>0; --i) + apidl[i-1] = (LPCITEMIDLIST) ((LPBYTE)pida+pida->aoffset[i]); + + hr = ShellFolderContextMenu(ShellFolder(parent_pidl), _hwnd, pida->cidl, apidl, x, y, _cm_ifs); + + selection->Release(); + + CHECKERROR(hr); + + return true; +} + +HRESULT DesktopShellView::DoDesktopContextMenu(int x, int y) +{ + IContextMenu* pcm; + + HRESULT hr = DesktopFolder()->GetUIObjectOf(_hwnd, 0, NULL, IID_IContextMenu, NULL, (LPVOID*)&pcm); + + if (SUCCEEDED(hr)) { + pcm = _cm_ifs.query_interfaces(pcm); + + HMENU hmenu = CreatePopupMenu(); + + if (hmenu) { + hr = pcm->QueryContextMenu(hmenu, 0, FCIDM_SHVIEWFIRST, FCIDM_SHVIEWLAST-1, CMF_NORMAL|CMF_EXPLORE); + + if (SUCCEEDED(hr)) { + AppendMenu(hmenu, MF_SEPARATOR, 0, NULL); + AppendMenu(hmenu, 0, FCIDM_SHVIEWLAST-1, ResString(IDS_ABOUT_EXPLORER)); + + UINT idCmd = TrackPopupMenu(hmenu, TPM_LEFTALIGN|TPM_RETURNCMD|TPM_RIGHTBUTTON, x, y, 0, _hwnd, NULL); + + _cm_ifs.reset(); + + if (idCmd == FCIDM_SHVIEWLAST-1) { + explorer_about(_hwnd); + } else if (idCmd) { + CMINVOKECOMMANDINFO cmi; + + cmi.cbSize = sizeof(CMINVOKECOMMANDINFO); + cmi.fMask = 0; + cmi.hwnd = _hwnd; + cmi.lpVerb = (LPCSTR)(INT_PTR)(idCmd - FCIDM_SHVIEWFIRST); + cmi.lpParameters = NULL; + cmi.lpDirectory = NULL; + cmi.nShow = SW_SHOWNORMAL; + cmi.dwHotKey = 0; + cmi.hIcon = 0; + + hr = pcm->InvokeCommand(&cmi); + } + } else + _cm_ifs.reset(); + } + + pcm->Release(); + } + + return hr; +} + + +#define ARRANGE_BORDER_DOWN 8 +#define ARRANGE_BORDER_HV 9 +#define ARRANGE_ROUNDABOUT 10 + +static const POINTS s_align_start[] = { + {0, 0}, // left/top + {0, 0}, + {1, 0}, // right/top + {1, 0}, + {0, 1}, // left/bottom + {0, 1}, + {1, 1}, // right/bottom + {1, 1}, + + {0, 0}, // left/top + {0, 0}, + {0, 0} +}; + +static const POINTS s_align_dir1[] = { + { 0, +1}, // down + {+1, 0}, // right + {-1, 0}, // left + { 0, +1}, // down + { 0, -1}, // up + {+1, 0}, // right + {-1, 0}, // left + { 0, -1}, // up + + { 0, +1}, // down + {+1, 0}, // right + {+1, 0} // right +}; + +static const POINTS s_align_dir2[] = { + {+1, 0}, // right + { 0, +1}, // down + { 0, +1}, // down + {-1, 0}, // left + {+1, 0}, // right + { 0, -1}, // up + { 0, -1}, // up + {-1, 0}, // left + + {+1, 0}, // right + { 0, +1}, // down + { 0, +1} // down +}; + +typedef pair IconPos; +typedef map IconMap; + +void DesktopShellView::PositionIcons(int dir) +{ + DWORD spacing = ListView_GetItemSpacing(_hwndListView, FALSE); + + RECT work_area; + SystemParametersInfo(SPI_GETWORKAREA, 0, &work_area, 0); + + const POINTS& dir1 = s_align_dir1[_icon_algo]; + const POINTS& dir2 = s_align_dir2[_icon_algo]; + const POINTS& start_pos = s_align_start[_icon_algo]; + + int dir_x1 = dir1.x; + int dir_y1 = dir1.y; + int dir_x2 = dir2.x; + int dir_y2 = dir2.y; + + int cx = LOWORD(spacing); + int cy = HIWORD(spacing); + + int dx1 = dir_x1 * cx; + int dy1 = dir_y1 * cy; + int dx2 = dir_x2 * cx; + int dy2 = dir_y2 * cy; + + int xoffset = (cx-32)/2; + int yoffset = 4/*(cy-32)/2*/; + + int start_x = start_pos.x * (work_area.right - cx) + xoffset; + int start_y = start_pos.y * (work_area.bottom - cy) + yoffset; + + int x = start_x; + int y = start_y; + + int all = ListView_GetItemCount(_hwndListView); + int i1, i2; + + if (dir > 0) { + i1 = 0; + i2 = all; + } else { + i1 = all-1; + i2 = -1; + } + + IconMap pos_idx; + int cnt = 0; + int xhv = start_x; + int yhv = start_y; + + for(int idx=i1; idx!=i2; idx+=dir) { + pos_idx[IconPos(y, x)] = idx; + + if (_icon_algo == ARRANGE_BORDER_DOWN) { + if (++cnt & 1) + x = work_area.right - x - cx + 2*xoffset; + else { + y += dy1; + + if (y + cy - 2 * yoffset > work_area.bottom) { + y = start_y; + start_x += dx2; + x = start_x; + } + } + + continue; + } + else if (_icon_algo == ARRANGE_BORDER_HV) { + if (++cnt & 1) + x = work_area.right - x - cx + 2*xoffset; + else if (cnt & 2) { + yhv += cy; + y = yhv; + x = start_x; + + if (y + cy - 2 * yoffset > work_area.bottom) { + start_x += cx; + xhv = start_x; + x = xhv; + start_y += cy; + yhv = start_y; + y = yhv; + } + } else { + xhv += cx; + x = xhv; + y = start_y; + + if (x + cx - 2 * xoffset > work_area.right) { + start_x += cx; + xhv = start_x; + x = xhv; + start_y += cy; + yhv = start_y; + y = yhv; + } + } + + continue; + } + else if (_icon_algo == ARRANGE_ROUNDABOUT) { + + ///@todo + + } + + x += dx1; + y += dy1; + + if (x<0 || x+cx-2*xoffset>work_area.right) { + x = start_x; + y += dy2; + } else if (y<0 || y+cy-2*yoffset>work_area.bottom) { + y = start_y; + x += dx2; + } + } + + // use a little trick to get the icons where we want them to be... + + for(IconMap::const_iterator it=pos_idx.end(); --it!=pos_idx.begin(); ) { + const IconPos& pos = it->first; + + ListView_SetItemPosition32(_hwndListView, it->second, pos.second, pos.first); + } + + for(IconMap::const_iterator it=pos_idx.begin(); it!=pos_idx.end(); ++it) { + const IconPos& pos = it->first; + + ListView_SetItemPosition32(_hwndListView, it->second, pos.second, pos.first); + } +} diff --git a/reactos/base/shell/explorer/desktop/desktop.h b/reactos/base/shell/explorer/desktop/desktop.h new file mode 100644 index 00000000000..00e9dca75cb --- /dev/null +++ b/reactos/base/shell/explorer/desktop/desktop.h @@ -0,0 +1,190 @@ +/* + * Copyright 2003, 2004 Martin Fuchs + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + + // + // Explorer clone + // + // desktop.h + // + // Martin Fuchs, 09.08.2003 + // + + +#define PM_SET_ICON_ALGORITHM (WM_APP+0x19) +#define PM_GET_ICON_ALGORITHM (WM_APP+0x1A) +#define PM_DISPLAY_VERSION (WM_APP+0x24) + + + /// subclassed Background window behind the visible desktop window +struct BackgroundWindow : public SubclassedWindow +{ + typedef SubclassedWindow super; + + BackgroundWindow(HWND hwnd); + +protected: + LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam); + + void DrawDesktopBkgnd(HDC hdc); + + int _display_version; +}; + + + /// Implementation of the Explorer desktop window +struct DesktopWindow : public Window, public IShellBrowserImpl +{ + typedef Window super; + + DesktopWindow(HWND hwnd); + ~DesktopWindow(); + + static HWND Create(); + + virtual HRESULT STDMETHODCALLTYPE GetWindow(HWND* lphwnd) + { + *lphwnd = _hwnd; + return S_OK; + } + + virtual HRESULT STDMETHODCALLTYPE QueryActiveShellView(IShellView** ppshv) + { + _pShellView->AddRef(); + *ppshv = _pShellView; + return S_OK; + } + + virtual HRESULT STDMETHODCALLTYPE GetControlWindow(UINT id, HWND* lphwnd) + { + return E_NOTIMPL; + } + + virtual HRESULT STDMETHODCALLTYPE SendControlMsg(UINT id, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT* pret) + { + return E_NOTIMPL; + } + +protected: + LRESULT Init(LPCREATESTRUCT pcs); + LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam); + + IShellView* _pShellView; + WindowHandle _desktopBar; + + virtual HRESULT OnDefaultCommand(LPIDA pida); +}; + + + /// OLE drop target for the desktop window +class DesktopDropTarget : public IDropTargetImpl +{ + typedef IDropTargetImpl super; + +public: + DesktopDropTarget(HWND hTargetWnd) : super(hTargetWnd) {} + + virtual bool OnDrop(FORMATETC* pFmtEtc, STGMEDIUM& medium, DWORD *pdwEffect) + { + if (pFmtEtc->cfFormat==CF_HDROP && medium.tymed==TYMED_HGLOBAL) { + HDROP hDrop = (HDROP)GlobalLock(medium.hGlobal); + + if (hDrop) { + TCHAR szFileName[MAX_PATH]; + + UINT cFiles = DragQueryFile(hDrop, 0xFFFFFFFF, NULL, 0); + + for(UINT i=0; i +{ + typedef ExtContextMenuHandlerT super; + + DesktopShellView(HWND hwnd, IShellView* pShellView); + + bool InitDragDrop(); + +protected: + IShellView* _pShellView; + + LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam); + int Command(int id, int code); + int Notify(int id, NMHDR* pnmh); + + bool DoContextMenu(int x, int y); + HRESULT DoDesktopContextMenu(int x, int y); + void PositionIcons(int dir=1); + + DesktopDropTarget* _pDropTarget; + HWND _hwndListView; + int _icon_algo; +}; diff --git a/reactos/base/shell/explorer/dialogs/searchprogram.cpp b/reactos/base/shell/explorer/dialogs/searchprogram.cpp new file mode 100644 index 00000000000..55c8c03cc9d --- /dev/null +++ b/reactos/base/shell/explorer/dialogs/searchprogram.cpp @@ -0,0 +1,418 @@ +/* + * Copyright 2003, 2004, 2005 Martin Fuchs + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + + // + // Explorer clone + // + // dialogs/searchprogram.cpp + // + // Explorer dialogs + // + // Martin Fuchs, 02.10.2003 + // + + +#include + +#include "../resource.h" + +#include "searchprogram.h" + + +int CollectProgramsThread::Run() +{ + try { + collect_programs(SpecialFolderPath(CSIDL_COMMON_PROGRAMS, _hwnd)); + } catch(COMException&) { + } + + if (_alive) + try { + collect_programs(SpecialFolderPath(CSIDL_PROGRAMS, _hwnd)); + } catch(COMException&) { + } + + if (_alive) + _cache_valid = true; + + return 0; +} + +void CollectProgramsThread::collect_programs(const ShellPath& path) +{ + ShellDirectory* dir = new ShellDirectory(GetDesktopFolder(), path, 0); + _dirs.push(dir); + + dir->smart_scan(SORT_NONE); + + for(Entry*entry=dir->_down; _alive && entry; entry=entry->_next) { + if (entry->_shell_attribs & SFGAO_HIDDEN) + continue; + + if (entry->_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + collect_programs(entry->create_absolute_pidl()); + else if (entry->_shell_attribs & SFGAO_LINK) + if (_alive) + _callback(entry, _para); + } +} + +void CollectProgramsThread::free_dirs() +{ + while(!_dirs.empty()) { + ShellDirectory* dir = _dirs.top(); + dir->free_subentries(); + _dirs.pop(); + } +} + + +#ifdef _MSC_VER +#pragma warning(disable: 4355) +#endif + +FindProgramDlg::FindProgramDlg(HWND hwnd) + : super(hwnd), + _list_ctrl(GetDlgItem(hwnd, IDC_PROGRAMS_FOUND)), + _thread(collect_programs_callback, hwnd, this), + _sort(_list_ctrl, CompareFunc/*, (LPARAM)this*/) +{ + SetWindowIcon(hwnd, IDI_SEARCH); + + _resize_mgr.Add(IDC_FILTER, RESIZE_X); + _resize_mgr.Add(IDC_CHECK_ENTRIES, MOVE_X); + _resize_mgr.Add(IDC_PROGRAMS_FOUND, RESIZE); + + _resize_mgr.Resize(+520, +300); + + _haccel = LoadAccelerators(g_Globals._hInstance, MAKEINTRESOURCE(IDA_SEARCH_PROGRAM)); + + (void)ListView_SetImageList(_list_ctrl, g_Globals._icon_cache.get_sys_imagelist(), LVSIL_SMALL); + + LV_COLUMN column = {LVCF_FMT|LVCF_WIDTH|LVCF_TEXT, LVCFMT_LEFT, 250}; + + column.pszText = _T("Name"); + ListView_InsertColumn(_list_ctrl, 0, &column); + + column.cx = 300; + column.pszText = _T("Path"); + ListView_InsertColumn(_list_ctrl, 1, &column); + + column.cx = 400; + column.pszText = _T("Menu Path"); + ListView_InsertColumn(_list_ctrl, 2, &column); + + ListView_SetExtendedListViewStyleEx(_list_ctrl, LVS_EX_FULLROWSELECT, LVS_EX_FULLROWSELECT); + + _common_programs = SpecialFolderFSPath(CSIDL_COMMON_PROGRAMS, hwnd); + if (!_common_programs.empty()) + _common_programs.append(_T("\\")); + + _user_programs = SpecialFolderFSPath(CSIDL_PROGRAMS, hwnd); + if (!_user_programs.empty()) + _user_programs.append(_T("\\")); + + CenterWindow(hwnd); + + Refresh(); + + register_pretranslate(hwnd); +} + +FindProgramDlg::~FindProgramDlg() +{ + _thread.Stop(); + + unregister_pretranslate(_hwnd); +} + + +void FindProgramDlg::Refresh(bool delete_cache) +{ + WaitCursor wait; + + _thread.Stop(); + + TCHAR buffer[1024]; + GetWindowText(GetDlgItem(_hwnd, IDC_FILTER), buffer, COUNTOF(buffer)); + CharLower(buffer); + _lwr_filter = buffer; + + HiddenWindow hide_listctrl(_list_ctrl); + + ListView_DeleteAllItems(_list_ctrl); + + if (delete_cache || !_thread._cache_valid) { + _thread.free_dirs(); + _thread.Start(); + } else { + for(FPDCache::const_iterator it=_cache.begin(); it!=_cache.end(); ++it) + add_entry(*it); + } +} + +void FindProgramDlg::collect_programs_callback(Entry* entry, void* param) +{ + FindProgramDlg* pThis = (FindProgramDlg*) param; + + IShellLink* pShellLink; + HRESULT hr = entry->GetUIObjectOf(pThis->_hwnd, IID_IShellLink, (LPVOID*)&pShellLink); + + if (SUCCEEDED(hr)) { + ShellLinkPtr shell_link(pShellLink); + + shell_link->Release(); + + /*hr = pShellLink->Resolve(pThis->_hwnd, SLR_NO_UI); + if (SUCCEEDED(hr))*/ { + WIN32_FIND_DATA wfd; + TCHAR path[MAX_PATH]; + + hr = pShellLink->GetPath(path, COUNTOF(path)-1, &wfd, SLGP_UNCPRIORITY); + + if (SUCCEEDED(hr)) { + TCHAR entry_path[MAX_PATH]; + + entry->get_path(entry_path, COUNTOF(entry_path)); + + String menu_path; + + int len = pThis->_common_programs.size(); + + if (len && !_tcsnicmp(entry_path, pThis->_common_programs, len)) + menu_path = ResString(IDS_ALL_USERS) + (String(entry_path)+len); + else if ((len=pThis->_user_programs.size()) && !_tcsnicmp(entry_path, pThis->_user_programs, len)) + menu_path = String(entry_path)+len; + + // store info in cache + FPDEntry new_entry; + + new_entry._entry = entry; + new_entry._menu_path = menu_path; + new_entry._path = path; + new_entry._idxIcon = I_IMAGECALLBACK; + + pThis->_cache.push_front(new_entry); + FPDEntry& cache_entry = pThis->_cache.front(); + + Lock lock(pThis->_thread._crit_sect); + + // resolve deadlocks while executing Thread::Stop() + if (!pThis->_thread.is_alive()) + return; + + pThis->add_entry(cache_entry); + } + } + } +} + +void FindProgramDlg::add_entry(const FPDEntry& cache_entry) +{ + String lwr_path = cache_entry._path; + String lwr_name = cache_entry._entry->_display_name; + + lwr_path.toLower(); + lwr_name.toLower(); + + if (_lwr_filter.empty()) + if (_tcsstr(lwr_name, _T("uninstal")) || _tcsstr(lwr_name, _T("deinstal"))) // filter out deinstallation links + return; + + if (!_tcsstr(lwr_path, _lwr_filter) && !_tcsstr(lwr_name, _lwr_filter)) + return; + + LV_ITEM item = {LVIF_TEXT|LVIF_IMAGE|LVIF_PARAM, INT_MAX}; + + item.pszText = cache_entry._entry->_display_name; + item.iImage = cache_entry._idxIcon; + item.lParam = (LPARAM) &cache_entry; + item.iItem = ListView_InsertItem(_list_ctrl, &item); // We could use the information in _sort to enable manual sorting while populating the list. + + item.mask = LVIF_TEXT; + + item.iSubItem = 1; + item.pszText = (LPTSTR)(LPCTSTR)cache_entry._path; + ListView_SetItem(_list_ctrl, &item); + + item.iSubItem = 2; + item.pszText = (LPTSTR)(LPCTSTR)cache_entry._menu_path; + ListView_SetItem(_list_ctrl, &item); +} + +LRESULT FindProgramDlg::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) +{ + switch(nmsg) { + case WM_CLOSE: + (void)ListView_SetImageList(_list_ctrl, 0, LVSIL_SMALL); // detach system image list + goto def; + + case PM_TRANSLATE_MSG: { + MSG* pmsg = (MSG*) lparam; + + if (TranslateAccelerator(_hwnd, _haccel, pmsg)) + return TRUE; + + return FALSE;} + + default: def: + return super::WndProc(nmsg, wparam, lparam); + } + + return 0; +} + +int FindProgramDlg::Command(int id, int code) +{ + if (code == BN_CLICKED) { + switch(id) { + case ID_REFRESH: + Refresh(true); + break; + + case IDOK: + LaunchSelected(); + break; + + case IDC_CHECK_ENTRIES: + CheckEntries(); + break; + + default: + return super::Command(id, code); + } + + return 0; + } + else if (code == EN_CHANGE) { + switch(id) { + case IDC_FILTER: + Refresh(); + break; + } + + return 0; + } + + return 1; +} + +void FindProgramDlg::LaunchSelected() +{ + Lock lock(_thread._crit_sect); + + int count = ListView_GetSelectedCount(_list_ctrl); + + if (count > 1) + if (MessageBox(_hwnd, ResString(IDS_LAUNCH_MANY_PROGRAMS), ResString(IDS_TITLE), MB_OKCANCEL) != IDOK) + return; + + for(int idx=-1; (idx=ListView_GetNextItem(_list_ctrl, idx, LVNI_SELECTED))!=-1; ) { + LPARAM lparam = ListView_GetItemData(_list_ctrl, idx); + + if (lparam) { + FPDEntry& cache_entry = *(FPDEntry*)lparam; + cache_entry._entry->launch_entry(_hwnd); + } + } +} + +int FindProgramDlg::Notify(int id, NMHDR* pnmh) +{ + switch(pnmh->code) { + case LVN_GETDISPINFO: { + LV_DISPINFO* pDispInfo = (LV_DISPINFO*) pnmh; + + if (pnmh->hwndFrom == _list_ctrl) { + if (pDispInfo->item.mask & LVIF_IMAGE) { + FPDEntry& cache_entry = *(FPDEntry*)pDispInfo->item.lParam; + Entry* entry = cache_entry._entry; + + if (entry->_icon_id == ICID_UNKNOWN) + entry->_icon_id = entry->extract_icon(ICF_SYSCACHE); + + pDispInfo->item.iImage = g_Globals._icon_cache.get_icon(entry->_icon_id).get_sysiml_idx(); + pDispInfo->item.mask |= LVIF_DI_SETITEM; + + return 1; + } + }} + break; + + case NM_DBLCLK: + if (pnmh->hwndFrom == _list_ctrl) + LaunchSelected(); + /*{ + Lock lock(_thread._crit_sect); + + LPNMLISTVIEW pnmv = (LPNMLISTVIEW) pnmh; + LPARAM lparam = ListView_GetItemData(pnmh->hwndFrom, pnmv->iItem); + + if (lparam) { + FPDEntry& cache_entry = *(FPDEntry*)lparam; + cache_entry._entry->launch_entry(_hwnd); + } + }*/ + break; + + case HDN_ITEMCLICK: { + WaitCursor wait; + NMHEADER* phdr = (NMHEADER*)pnmh; + + if (GetParent(pnmh->hwndFrom) == _list_ctrl) { + if (_thread._cache_valid) { // disable manual sorting while populating the list + _sort.toggle_sort(phdr->iItem); + _sort.sort(); + } + } + break;} + } + + return 0; +} + +int CALLBACK FindProgramDlg::CompareFunc(LPARAM lparam1, LPARAM lparam2, LPARAM lparamSort) +{ + ListSort* sort = (ListSort*)lparamSort; + + FPDEntry& a = *(FPDEntry*)lparam1; + FPDEntry& b = *(FPDEntry*)lparam2; + + int cmp = 0; + + switch(sort->_sort_crit) { + case 0: + cmp = _tcsicoll(a._entry->_display_name, b._entry->_display_name); + break; + + case 1: + cmp = _tcsicoll(a._path, b._path); + break; + + case 2: + cmp = _tcsicoll(a._menu_path, b._menu_path); + } + + return sort->_direction? -cmp: cmp; +} + +void FindProgramDlg::CheckEntries() +{ + ///@todo check all entries for existing targets, display a list of not working entries and ask the user for permission to delete them +} diff --git a/reactos/base/shell/explorer/dialogs/searchprogram.h b/reactos/base/shell/explorer/dialogs/searchprogram.h new file mode 100644 index 00000000000..bc39b3b2f03 --- /dev/null +++ b/reactos/base/shell/explorer/dialogs/searchprogram.h @@ -0,0 +1,108 @@ +/* + * Copyright 2003, 2004 Martin Fuchs + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + + // + // Explorer clone + // + // dialogs/searchprogram.h + // + // Explorer dialogs + // + // Martin Fuchs, 02.10.2003 + // + + +typedef void (*COLLECT_CALLBACK)(Entry* entry, void* param); +typedef stack ShellDirectoryStack; + + /// Thread for collecting start menu entries +struct CollectProgramsThread : public Thread +{ + CollectProgramsThread(COLLECT_CALLBACK callback, HWND hwnd, void* para) + : _cache_valid(false), + _callback(callback), + _hwnd(hwnd), + _para(para) + { + } + + ~CollectProgramsThread() + { + free_dirs(); + } + + int Run(); + void free_dirs(); + + bool _cache_valid; + +protected: + COLLECT_CALLBACK _callback; + HWND _hwnd; + void* _para; + ShellDirectoryStack _dirs; + + void collect_programs(const ShellPath& path); +}; + + + /// entry for the list in "find program" dialogs +struct FPDEntry +{ + Entry* _entry; + int _idxIcon; + String _menu_path; + String _path; +}; + +typedef list FPDCache; + + + /// Dialog to work with the complete list of start menu entries +struct FindProgramDlg : public ResizeController +{ + typedef ResizeController super; + + FindProgramDlg(HWND hwnd); + ~FindProgramDlg(); + +protected: + HWND _list_ctrl; + HACCEL _haccel; + String _lwr_filter; + + CollectProgramsThread _thread; + FPDCache _cache; + + String _common_programs, _user_programs; + + ListSort _sort; + + virtual LRESULT WndProc(UINT, WPARAM, LPARAM); + virtual int Command(int id, int code); + virtual int Notify(int id, NMHDR* pnmh); + + void Refresh(bool delete_cache=false); + void add_entry(const FPDEntry& cache_entry); + void LaunchSelected(); + void CheckEntries(); + + static void collect_programs_callback(Entry* entry, void* param); + static int CALLBACK CompareFunc(LPARAM lparam1, LPARAM lparam2, LPARAM lparamSort); +}; diff --git a/reactos/base/shell/explorer/dialogs/settings.cpp b/reactos/base/shell/explorer/dialogs/settings.cpp new file mode 100644 index 00000000000..0b80458c5ba --- /dev/null +++ b/reactos/base/shell/explorer/dialogs/settings.cpp @@ -0,0 +1,273 @@ +/* + * Copyright 2004 Martin Fuchs + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + + // + // Explorer clone + // + // dialogs/settings.cpp + // + // Explorer dialogs + // + // Martin Fuchs, 18.01.2004 + // + + +#include + +#include "../resource.h" + +#include "../taskbar/traynotify.h" +#include "settings.h" + + +void ExplorerPropertySheet(HWND hparent) +{ + PropertySheetDialog ps(hparent); + + ps.dwFlags |= PSH_USEICONID | PSH_PROPTITLE; + ps.pszIcon = MAKEINTRESOURCE(IDI_REACTOS); + ps.pszCaption = TEXT("Explorer"); + + PropSheetPage psp1(IDD_DESKBAR_DESKTOP, WINDOW_CREATOR(DesktopSettingsDlg)); + psp1.dwFlags |= PSP_USETITLE; + psp1.pszTitle = MAKEINTRESOURCE(IDS_DESKTOP); + ps.add(psp1); + + PropSheetPage psp2(IDD_DESKBAR_TASKBAR, WINDOW_CREATOR(TaskbarSettingsDlg)); + psp2.dwFlags |= PSP_USETITLE; + psp2.pszTitle = MAKEINTRESOURCE(IDS_TASKBAR); + ps.add(psp2); + + PropSheetPage psp3(IDD_DESKBAR_STARTMENU, WINDOW_CREATOR(StartmenuSettingsDlg)); + psp3.dwFlags |= PSP_USETITLE; + psp3.pszTitle = MAKEINTRESOURCE(IDS_STARTMENU); + ps.add(psp3); + + ps.DoModal(); +} + + +DesktopSettingsDlg::DesktopSettingsDlg(HWND hwnd) + : super(hwnd), + _bmp0(IDB_ICON_ALIGN_0), + _bmp1(IDB_ICON_ALIGN_1), + _bmp2(IDB_ICON_ALIGN_2), + _bmp3(IDB_ICON_ALIGN_3), + _bmp4(IDB_ICON_ALIGN_4), + _bmp5(IDB_ICON_ALIGN_5), + _bmp6(IDB_ICON_ALIGN_6), + _bmp7(IDB_ICON_ALIGN_7), + _bmp8(IDB_ICON_ALIGN_8), + _bmp9(IDB_ICON_ALIGN_9), + _bmp10(IDB_ICON_ALIGN_10) +{ + new PictureButton(_hwnd, IDC_ICON_ALIGN_0, _bmp0); + new PictureButton(_hwnd, IDC_ICON_ALIGN_1, _bmp1); + new PictureButton(_hwnd, IDC_ICON_ALIGN_2, _bmp2); + new PictureButton(_hwnd, IDC_ICON_ALIGN_3, _bmp3); + new PictureButton(_hwnd, IDC_ICON_ALIGN_4, _bmp4); + new PictureButton(_hwnd, IDC_ICON_ALIGN_5, _bmp5); + new PictureButton(_hwnd, IDC_ICON_ALIGN_6, _bmp6); + new PictureButton(_hwnd, IDC_ICON_ALIGN_7, _bmp7); + new PictureButton(_hwnd, IDC_ICON_ALIGN_8, _bmp8); + new PictureButton(_hwnd, IDC_ICON_ALIGN_9, _bmp9); + new PictureButton(_hwnd, IDC_ICON_ALIGN_10, _bmp10); + + _alignment_cur = SendMessage(g_Globals._hwndShellView, PM_GET_ICON_ALGORITHM, 0, 0); + _alignment_tmp = _alignment_cur; + + _display_version_org = SendMessage(g_Globals._hwndShellView, PM_DISPLAY_VERSION, 0, MAKELONG(0,0)); + CheckDlgButton(hwnd, ID_DESKTOP_VERSION, _display_version_org? BST_CHECKED: BST_UNCHECKED); +} + +#ifndef PSN_QUERYINITIALFOCUS // currently (as of 18.01.2004) missing in MinGW headers +#define PSN_QUERYINITIALFOCUS (-213) +#endif + +int DesktopSettingsDlg::Notify(int id, NMHDR* pnmh) +{ + switch(pnmh->code) { + case PSN_QUERYINITIALFOCUS: + SetWindowLong(_hwnd, DWL_MSGRESULT, (LPARAM)GetDlgItem(_hwnd, IDC_ICON_ALIGN_0+_alignment_cur)); + break; + + case PSN_APPLY: + _alignment_cur = _alignment_tmp; + _display_version_org = SendMessage(g_Globals._hwndShellView, PM_DISPLAY_VERSION, 0, MAKELONG(0,0)); + break; + + case PSN_RESET: + if (_alignment_tmp != _alignment_cur) + SendMessage(g_Globals._hwndShellView, PM_SET_ICON_ALGORITHM, _alignment_cur, 0); + SendMessage(g_Globals._hwndShellView, PM_DISPLAY_VERSION, _display_version_org, MAKELONG(1,0)); + break; + + default: + return super::Notify(id, pnmh); + } + + return 0; +} + +int DesktopSettingsDlg::Command(int id, int code) +{ + if (id>=IDC_ICON_ALIGN_0 && id<=IDC_ICON_ALIGN_10) { + int alignment = id - IDC_ICON_ALIGN_0; + + if (alignment != _alignment_tmp) { + _alignment_tmp = alignment; + + PropSheet_Changed(GetParent(_hwnd), _hwnd); + + SendMessage(g_Globals._hwndShellView, PM_SET_ICON_ALGORITHM, alignment, 0); + } + + return 0; + } + + switch(id) { + case ID_DESKTOP_VERSION: + SendMessage(g_Globals._hwndShellView, PM_DISPLAY_VERSION, 0, MAKELONG(0,1)); // toggle version display flag + PropSheet_Changed(GetParent(_hwnd), _hwnd); + break; + + default: + return 1; + } + + return 0; +} + + +TaskbarSettingsDlg::TaskbarSettingsDlg(HWND hwnd) + : super(hwnd), + _cfg_org(g_Globals._cfg) +{ + XMLPos options = g_Globals.get_cfg("desktopbar/options"); + + CheckDlgButton(hwnd, ID_SHOW_CLOCK, XMLBool(options, "show-clock", true)? BST_CHECKED: BST_UNCHECKED); + CheckDlgButton(hwnd, ID_HIDE_INACTIVE_ICONS, XMLBool(options, "hide-inactive", true)? BST_CHECKED: BST_UNCHECKED); +} + +int TaskbarSettingsDlg::Notify(int id, NMHDR* pnmh) +{ + switch(pnmh->code) { + case PSN_APPLY: + _cfg_org = g_Globals._cfg; + break; + + case PSN_RESET: + g_Globals._cfg = _cfg_org; + SendMessage(g_Globals._hwndDesktopBar, PM_REFRESH_CONFIG, 0, 0); + break; + + default: + return super::Notify(id, pnmh); + } + + return 0; +} + +int TaskbarSettingsDlg::Command(int id, int code) +{ + switch(id) { + case ID_CONFIG_NOTIFYAREA: + Dialog::DoModal(IDD_NOTIFYAREA, WINDOW_CREATOR(TrayNotifyDlg), _hwnd); + break; + + case ID_SHOW_CLOCK: { + XMLBoolRef boolRef1(XMLPos(g_Globals.get_cfg("desktopbar/options")), "show-clock", true); + boolRef1.toggle(); + SendMessage(g_Globals._hwndDesktopBar, PM_REFRESH_CONFIG, 0, 0); + PropSheet_Changed(GetParent(_hwnd), _hwnd); + break;} + + case ID_HIDE_INACTIVE_ICONS: { + XMLBoolRef boolRef2(XMLPos(g_Globals.get_cfg("notify-icons/options")), "hide-inactive", true); + boolRef2.toggle(); + SendMessage(g_Globals._hwndDesktopBar, PM_REFRESH_CONFIG, 0, 0); + PropSheet_Changed(GetParent(_hwnd), _hwnd); + break;} + + default: + return 1; + } + + return 0; +} + + +StartmenuSettingsDlg::StartmenuSettingsDlg(HWND hwnd) + : super(hwnd) +{ +} + +int StartmenuSettingsDlg::Command(int id, int code) +{ +/* + switch(id) { + case ID_CONFIG_NOTIFYAREA: + Dialog::DoModal(IDD_NOTIFYAREA, WINDOW_CREATOR(TrayNotifyDlg), _hwnd); + return 0; + } +*/ + return 1; +} + + +MdiSdiDlg::MdiSdiDlg(HWND hwnd) + : super(hwnd) +{ + CenterWindow(hwnd); + + XMLPos explorer_options = g_Globals.get_cfg("general/explorer"); + bool mdi = XMLBool(explorer_options, "mdi", true); + bool separateFolders = XMLBool(explorer_options, "separate-folders", true); + + int id = mdi? IDC_MDI: IDC_SDI; + CheckDlgButton(hwnd, id, BST_CHECKED); + SetFocus(GetDlgItem(hwnd, id)); + + CheckDlgButton(hwnd, IDC_SEPARATE_SUBFOLDERS, separateFolders?BST_CHECKED:BST_UNCHECKED); +} + +int MdiSdiDlg::Command(int id, int code) +{ + if (code == BN_CLICKED) { + switch(id) { + case IDOK: { + bool mdi = IsDlgButtonChecked(_hwnd, IDC_MDI)==BST_CHECKED; + bool separateFolders = IsDlgButtonChecked(_hwnd, IDC_SEPARATE_SUBFOLDERS)==BST_CHECKED; + + XMLPos explorer_options = g_Globals.get_cfg("general/explorer"); + + XMLBoolRef(explorer_options, "mdi") = mdi; + XMLBoolRef(explorer_options, "separate-folders") = separateFolders; + } // fall through + + case IDCANCEL: + EndDialog(_hwnd, id); + break; + } + + return 0; + } + + return 1; +} diff --git a/reactos/base/shell/explorer/dialogs/settings.h b/reactos/base/shell/explorer/dialogs/settings.h new file mode 100644 index 00000000000..a71710139a4 --- /dev/null +++ b/reactos/base/shell/explorer/dialogs/settings.h @@ -0,0 +1,99 @@ +/* + * Copyright 2004, 2004 Martin Fuchs + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + + // + // Explorer clone + // + // dialogs/settings.h + // + // Explorer dialogs + // + // Martin Fuchs, 18.01.2004 + // + + +void ExplorerPropertySheet(HWND hparent); + + + /// "Desktopbar Settings" Property Sheet Dialog +struct DesktopSettingsDlg : public OwnerDrawParent +{ + typedef OwnerDrawParent super; + + DesktopSettingsDlg(HWND hwnd); + +protected: + ResBitmap _bmp0; + ResBitmap _bmp1; + ResBitmap _bmp2; + ResBitmap _bmp3; + ResBitmap _bmp4; + ResBitmap _bmp5; + ResBitmap _bmp6; + ResBitmap _bmp7; + ResBitmap _bmp8; + ResBitmap _bmp9; + ResBitmap _bmp10; + + int _alignment_cur; + int _alignment_tmp; + + int _display_version_org; + + virtual int Command(int id, int code); + virtual int Notify(int id, NMHDR* pnmh); +}; + + + /// "Taskbar Settings" Property Sheet Dialog +struct TaskbarSettingsDlg : public PropSheetPageDlg +{ + typedef PropSheetPageDlg super; + + TaskbarSettingsDlg(HWND hwnd); + + virtual int Command(int id, int code); + virtual int Notify(int id, NMHDR* pnmh); + +protected: + XMLDoc _cfg_org; +}; + + + /// "Startmenu Settings" Property Sheet Dialog +struct StartmenuSettingsDlg : public PropSheetPageDlg +{ + typedef PropSheetPageDlg super; + + StartmenuSettingsDlg(HWND hwnd); + + virtual int Command(int id, int code); +}; + + + /// configuration dialog to choose between MDI and SDI mode +struct MdiSdiDlg : public ResizeController +{ + typedef ResizeController super; + + MdiSdiDlg(HWND hwnd); + +protected: + virtual int Command(int id, int code); +}; diff --git a/reactos/base/shell/explorer/doc/TODO.txt b/reactos/base/shell/explorer/doc/TODO.txt new file mode 100644 index 00000000000..ef35cabb975 --- /dev/null +++ b/reactos/base/shell/explorer/doc/TODO.txt @@ -0,0 +1,34 @@ +- rewrite autostart code and include all possible autostart locations +- read "DESCRIPT.ION" files to display file descriptions +- detect display mode changes and adjust desktop bar size +- handling of full screen applications +- implement additional deskbands +- Drag Drop and file renaming on the desktop does not work. +- implement Drag Drop from the tree view. +- activate accelerator keys like in shell view folders +- program manager "progman" DDE server +- Windows-key combos +- Application Desktop Toolbars +- hide CVS subdirectories, may be even implement a CVS managment plugin +- printer and RAS connection icons in desktop notification area +- use multi threading for launching of programs and filling start menu subdirectories +- close start start menu when resizing explorer bar +- adjust already open windows of all running applications when resizing explorer bar +- implement blink effect in task bar for SetForegoundWindow() requests +- Execute selected programs with additional command line options ("Run" dialog with pre-filled edit field) +- switch background images with desktop switcher +- Desktop Manager: Desktop Names; Speicherung der Verteilung von Applikations-Fenstern auf die verschiedenen Desktops -> config file +- autostart doesn't work on NT4 ? +- hide desktop bar when showing full screen applications +- new start menu entry "Filemanager" close to "Explore" -> display C: and D: drive in MDI window +- Startmenu: You can open the start menu by pressing Win-key, but can't close with another hit of Win-key. +- Export von Bookmarks für IE (+ Mozilla) + +- Search Programs -> performance monitor.msc -> Abort + + + Martin, I would have a whish concerning explorer: I often want to start a program and give it some parameters. So nice featue: "Start with param..." + Nonvo: shell extension + tinus: we should think about installing some default shell extensions + m-fuchs: perhaps, but it'd be nice if they actually were shell extensions + diff --git a/reactos/base/shell/explorer/doc/changes.txt b/reactos/base/shell/explorer/doc/changes.txt new file mode 100644 index 00000000000..372642f99f6 --- /dev/null +++ b/reactos/base/shell/explorer/doc/changes.txt @@ -0,0 +1,170 @@ +You will find only major changes in this file. +Small bug fixes and developments steps are not listet here. +If you search for more information, look into the Subversion repository. + +14.10.2002 m. fuchs Korrektur der Anpassungen durch Übernahme in wine: Anzeige der Verzeichnisnamen in Tree Pane + m. fuchs Wieder-Anpassung an natives Übersetzen unter WIN32 mit VC++ + +15.10.2002 m. fuchs Entfernung der Warnungsmeldung durch SetWindowText(0, ...) + m. fuchs korrekte Anzeige der Header Control-Texte (nicht Unicode -> dlls/comctl32/header.c) + +15.10.2002 m. fuchs sofortige Anzeige der Dateiliste beim Starten und Öffnen neuer Fenster +15.10.2002 m. fuchs Programmaufruf über Doppelklick in der Dateiliste + +07.06.2003 m. fuchs integration with ROS desktop window +21.07.2003 m. fuchs extension of winefile for shell namespace +04.08.2003 m. fuchs C++ explorer with architecture like MS Explorer: + usage of IShellView C++, implementation of IShellBrowser, ... +09.08.2003 m. fuchs class DesktopWindow for shell view on the desktop +11.08.2003 m. fuchs class BackgroundWindow for painting of desktop background + open child folders by double click in ShellBrowserChild +13.08.2003 m. fuchs make explorer bar look more like windows taskbar bar +16.08.2003 m. fuchs first draft of working task bar +18.08.2003 m. fuchs first draft of explorer start menu +21.08.2003 m. fuchs working start menu; beginning of tray notification area + Start menu popup is now closed when clicking in another window. +22.08.2003 m. fuchs implemented clock display in tray notification area + implemented quick launch bar +23.08.2003 m. fuchs implemented "Run..." dialog by calling shell32.dll + fixed memory and GDI handle leaks + implemented context menus for task bar + tool tips for quick launch bar +24.08.2003 m. fuchs added reactos logo to startmenu + added romanian translation of Ciobanu Alexander +26.08.2003 m. fuchs implemented tooltips and launching of date/time control panel applet for clock display +27.08.2003 m. fuchs partly implemented control panel window +28.08.2003 m. fuchs control panel window in cabinet view mode +29.09.2003 m. fuchs Now we handle start menu popups via StartMenuRoot::TrackStartmenu(). +30.09.2003 m. fuchs compatibility to building as Winelib application +10.09.2003 m. fuchs compatibility changes for correct desktop windows size on Windows NT +19.09.2003 m. fuchs compatibility changes for correct start menu subentries on Windows 9x +27.09.2003 m. fuchs moved start menu entries for control panel, etc. into new settings submenu + created a Makefile for compiling as standalone project using MinGW + eliminated all warnings displayed when using -Wall + activated option for compiling as UNICODE version + merged start menus of the same name (e.g. "All Users\Startup" with "\Startup") +28.09.2003 m. fuchs open cabinet windows then clicking on desktop folders +18.10.2003 m. fuchs Program search dialog with interactive filtering and sorting does now work. +19.10.2003 m. fuchs implemented floating start menus +29.11.2003 m. fuchs implemented GDB stub for remote debugging +06.12.2003 m. fuchs basic support to display NTFS streams in winefile windows +20.12.2003 m. fuchs context menu implementation for desktop window +01.01.2004 m. fuchs integrated icons of Everaldo (http://www.everaldo.com) into the start menu. +02.01.2004 m. fuchs reimplemented start menu as light weight version +03.01.2004 m. fuchs lazy icon extraction for start menu + direct file system access for start menu +04.01.2004 m. fuchs implemented icon cache +11.01.2004 m. fuchs keyboard navigation in start menu +14.01.2004 m. fuchs automatically adjusted size of notification area and quicklaunch bar in desktop bar +18.01.2004 m. fuchs explorer/desktop settings property sheet +31.01.2004 m. fuchs included NT Object namespace as virtual file system +31.01.2004 m. fuchs included Registry as virtual file system +02.02.2004 m. fuchs reading of FAT image files +07.02.2004 m. fuchs included IE/Mozilla as Active X control +08.02.2004 m. fuchs desktop switching +16.02.2004 m. fuchs lean explorer version without additional bells and whistles -> see CVS branch "lean-explorer" +23.02.2004 m. fuchs start menu navigation using first characters of entry names + fixes for leaking GDI handles +25.02.2004 m. fuchs rebar control for desktop bar +28.02.2004 m. fuchs "minimize all" functionality + various fixes for notification icons, task bar and desktop switching +12.03.2004 m. fuchs automatic adjustment start button to text size +15.03.2004 m. fuchs implementation of volume control tray icon +20.03.2004 m. fuchs context menu for notification area +21.03.2004 m. fuchs configuration dialog for notification icons + XML storage for configuration options +28.03.2004 m. fuchs configuration options for showing/hiding clock, ... +04.04.2004 m. fuchs import of IE bookmarks; explorer sidebar with bookmark display +09.04.2004 m. fuchs changed favorites start menu implementation to work with internal bookmarks + +12.04.2004 m. fuchs ShellBrowserChild: jump to addressbar target +17.05.2004 m. fuchs use precompiled headers for VC++ builds +01.06.2004 m. fuchs integrate optional SDI mode into main explorer branch +15.07.2004 m. fuchs fix root path for folders opened from the desktop +18.07.2004 m. fuchs precompiled header support for GCC 3.4.1 +31.07.2004 m. fuchs use same startmenu entries height as MS explorer +02.08.2004 m. fuchs context menus for start menus and quick launch bar +03.08.2004 m. fuchs get version number to display from RES_STR_PRODUCT_VERSION +16.08.2004 m. fuchs display version information in about dialog and on the desktop +15.09.2004 m. fuchs remove direct version output from desktop; instead store the activation flag into the registry +17.09.2004 m. fuchs handle "." and ".." as special direcory names and move them at the very first beginning of directory listings +23.09.2004 m. fuchs configuration dialog to choose between MDI and SDI mode with persistent storage +20.11.2004 m. fuchs display notification icon change times + notification area button to toggle hidden icons + m. fuchs alpha-blend hidden notification icons + m. fuchs fix UTF8 conversion for the bookmarks list + m. fuchs decode HTML-encoded bookmark names + m. fuchs work around GCC's wide string constant bug when compiling inline functions +27.12.2004 m. fuchs fix GPF for clicks in the favorites folder +09.01.2005 frik85 update for german resource scripts +10.01.2005 m. fuchs new _NO_ALPHABLEND compiler switch +21.01.2005 tamlin Fix crashing browsing NT object namespace with non-zero-terminated UNICODE_STRING. +27.01.2005 m. fuchs fixes for command line handling +06.02.2005 m. fuchs support for owner drawn context menus at various places +08.02.2005 gvg Prefer SEE_MASK_IDLIST, since that one is actually implemented in shell32 +20.02.2005 m. fuchs updates for Expat and XMLStorage files +21.02.2005 m. fuchs move public expat headers into common include folder +27.02.2005 frik85 Add support for explorer to load the desk.cpl when right clicking on background. +04.03.2005 fireball New StartMenu and ReactOS icons by Mindflyer +05.03.2005 m. fuchs case insensitive startmenu merging + m. fuchs update ROS icon in about dialog and start menu side bar +14.03.2005 gvg tinus: Use RegisterShellHookWindow() +19.03.2005 m. fuchs register ourselves as task manager window to make the RegisterShellHookWindow() call working [thanks to Filip :)] +21.03.2005 fireball Nice "About Explorer" icon by Mindflyer +27.03.2005 m. fuchs hide login screen to make the login on XP faster + m. fuchs launch shell DDE server + m. fuchs make Shell Hook Messages really work in Windows +27.03.2005 greatlrd New Explorer icon from Mindflyer +28.03.2005 m. fuchs launch all registered Shell Service Objects (Systray, network icons, ...) + m. fuchs enable multiline tooltips +01.04.2005 greatlrd David Nordenberg: fixed minor things in swedish translation +02.04.2005 m. fuchs terminate shell service objects thread if there is nothing to do + m. fuchs switch to search icon in search dialog + m. fuchs fix tray icon config dialog for the first icon + m. fuchs "minimize all": only minimize windows with valid positions + m. fuchs fix termination of "search program" dialog +03.04.2005 m. fuchs fix SDI shell browser + m. fuchs display "log off" dialog, add "terminate" menu entry + m. fuchs show logoff dialog in lean explorer + m. fuchs activate printer folder menu +14.04.2005 m. fuchs charn: step-wise taskbar resizing +01.05.2005 m. fuchs merge ROS Shell without integrated explorer part into trunk +03.05.2005 m. fuchs display custom folders in start menu root +03.05.2005 m. fuchs rosshell: printer and network folder in start menu +04.05.2005 greatlrd Fixes for Swedish resource script +20.05.2005 navaraf Luk "denzil" Frolka: partial Czech translation of Explorer +02.06.2005 fireball First version of Explorer's translation into Russian. Done by Dmitry Philippov, checked by me, DarkHobbit and others +03.06.2005 m. fuchs split the big explorer resource file into smaller language specific rescource scripts +05.06.2005 hpoussin Include French resources in explorer +15.07.2005 greatlrd update swedish .rc and rename it from sw to sv, remove the german part in swedish rc +16.07.2005 greatlrd crop the startmenu side bar logo to 30x280 +17.07.2005 m. fuchs add explorer-ro.rc +26.08.2005 navaraf Make the explorer taskbar look a bit nicer +12.09.2005 royce security audit of explorer code: strcpy -> lstrcpyn, ... +19.09.2005 navaraf Fix the taskbar button resizing to account for button spacing. +21.09.2005 m. fuchs XMLStorage update, Bugfix for UTF-8 strings + m. fuchs use size_t for buffer/string lengths instead of int, define COUNTOF if not defined already +25.09.2005 navaraf Patricio Martínez Ros: Update spanish translation +25.09.2005 m. fuchs new tool bar icons for the drive bar + m. fuchs refactor all IUnknown implementations using IComSrvBase +30.09.2005 m. fuchs Fix of Bugzilla Bug 676: dynamic explorer start menu sidebar size +01.10.2005 greatlrd new, smaller startmenu pictures using the dynamic explorer start menu sidebar feature +01.10.2005 m. fuchs MDI/SDI option dialog: pictures for illustration, remove resizable flag +02.10.2005 m. fuchs new option to open explorer subfolders in separate windows + m. fuchs fix enabling of split border + m. fuchs fix directory traversing in explorer SDI windows + m. fuchs fix tree list image loading: work around GCC's wide string constant bug +04.10.2005 m. fuchs complete german resources for explorer +04.10.2005 m. fuchs "execute" menu entry + m. fuchs activate execution from command bar +05.10.2005 m. fuchs fix UNICODE control panel calls to handle double clicks on the task bar clock + m. fuchs one-click activation of "Start" button + m. fuchs use GET_X_LPARAM macro in WM_MOUSEMOVE handlers + m. fuchs leave TrackStartmenu() function when executing any start menu command +06.10.2005 m. fuchs implemented command line parser for Explorer +09.10.2005 m. fuchs Fix for Bugzilla Entry 330: Correctly handle WM_COMMAND messages in web windows without web control + m. fuchs replace "search computer" start menu entry by a "not yet implemented" message +01.11.2005 m. fuchs String::str(), String::toLower() to allow conventient and WINE compatible string conversions +29.11.2005 m. fuchs Adjustments for Visual Studio 2005: use new secure CT functions, COUNTOF for buffer sizes +28.12.2005 m. fuchs display icon overlays in Explorer tree view +31.12.2005 m. fuchs handle "/root" command line parameter diff --git a/reactos/base/shell/explorer/doc/readme.txt b/reactos/base/shell/explorer/doc/readme.txt new file mode 100644 index 00000000000..0324dd1d4f3 --- /dev/null +++ b/reactos/base/shell/explorer/doc/readme.txt @@ -0,0 +1,45 @@ + +For information on how to compile and install the ReactOS Explorer please look at the FAQ web page: + +http://www.sky.franken.de/explorer/ + + + +Desktop Example +--------------- + +This program doesn't do much, apart from create a window which could be +used as a desktop. + +It's pretty straightforward. It creates a window the size of the screen, +displays some text in the corner, and then disables ALT+F4. + +Ideally, this would be incorporated into some other part of ReactOS, where +it could be closed in a controlled manner (ie, when the user wishes to exit +the GUI.) + +Hope someone finds it of some use. I think it should run before the +explorer clone (taskbar) to get the wallpaper displayed (since when +explorer crashes on Windows, the wallpaper is always displayed, and there +is always a desktop, even with no icons, when the login window is shown.) + +It obviously is in need of some improvement, such as wallpaper actually +being drawn (stretch, center/centre and tile...) + +So, feel free to play around with it. + +Andrew "Silver Blade" Greenwood +silverblade_uk@hotmail.com + + +Explorer Bar Example +-------------------- + +I have merged in Alexander Ciobanu's Explorer bar code as a example starting +for the start menu. Its very simple at this point and just loads a window with +buttons. + +The loading of this module was based on a patch by Martin Fuchs. + +Steven Edwards +Steven_Ed4153@yahoo.com diff --git a/reactos/base/shell/explorer/doxy-footer.html b/reactos/base/shell/explorer/doxy-footer.html new file mode 100644 index 00000000000..1ed7376a03a --- /dev/null +++ b/reactos/base/shell/explorer/doxy-footer.html @@ -0,0 +1,16 @@ +
+ + + + + +
+ROS Explorer Source Code Documentation +
generated on 21.11.2004 by +doxygen +
+
+

ROS Explorer Homepage +

+ + diff --git a/reactos/base/shell/explorer/doxy-footer.htmt b/reactos/base/shell/explorer/doxy-footer.htmt new file mode 100644 index 00000000000..53f33c8a274 --- /dev/null +++ b/reactos/base/shell/explorer/doxy-footer.htmt @@ -0,0 +1,16 @@ +
+ + + + + +
+ROS Explorer Source Code Documentation +
@GEN@ by +doxygen +
+
+

ROS Explorer Homepage +

+ + diff --git a/reactos/base/shell/explorer/expat.license b/reactos/base/shell/explorer/expat.license new file mode 100644 index 00000000000..5c5d524a1f8 --- /dev/null +++ b/reactos/base/shell/explorer/expat.license @@ -0,0 +1,22 @@ +Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd + and Clark Cooper +Copyright (c) 2001, 2002, 2003 Expat maintainers. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/reactos/base/shell/explorer/explorer-cfg-template.xml b/reactos/base/shell/explorer/explorer-cfg-template.xml new file mode 100644 index 00000000000..9597e1230d3 --- /dev/null +++ b/reactos/base/shell/explorer/explorer-cfg-template.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/reactos/base/shell/explorer/explorer-cn.rc b/reactos/base/shell/explorer/explorer-cn.rc new file mode 100644 index 00000000000..7b36104aba2 Binary files /dev/null and b/reactos/base/shell/explorer/explorer-cn.rc differ diff --git a/reactos/base/shell/explorer/explorer-cz.rc b/reactos/base/shell/explorer/explorer-cz.rc new file mode 100644 index 00000000000..42c129d1250 --- /dev/null +++ b/reactos/base/shell/explorer/explorer-cz.rc @@ -0,0 +1,401 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "resource.h" +#define APSTUDIO_HIDDEN_SYMBOLS +#include "windows.h" +#undef APSTUDIO_HIDDEN_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// Czech resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CSY) +#ifdef _WIN32 +LANGUAGE LANG_CZECH, SUBLANG_DEFAULT +#pragma code_page(1250) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Menu +// + +IDM_MDIFRAME MENU PRELOAD DISCARDABLE +BEGIN + POPUP "&Soubor" + BEGIN + MENUITEM "&Spustit...", ID_EXECUTE + MENUITEM SEPARATOR + MENUITEM "&Ukonèit", ID_FILE_EXIT + END + POPUP "&Zobrazení" + BEGIN + MENUITEM "&Lišta nástrojù", ID_VIEW_TOOL_BAR + MENUITEM "&Extra Bar", ID_VIEW_EXTRA_BAR + MENUITEM "L&išta diskù", ID_VIEW_DRIVE_BAR, CHECKED + MENUITEM "&Boèní lišta", ID_VIEW_SIDE_BAR + MENUITEM "&Status Bar", ID_VIEW_STATUSBAR + MENUITEM SEPARATOR + MENUITEM "&Aktualizovat\tF5", ID_REFRESH + MENUITEM "&Celá obrazovka\tCtrl+Shift+S", ID_VIEW_FULLSCREEN + MENUITEM "SDI", ID_VIEW_SDI + END + POPUP "&Okno" + BEGIN + MENUITEM "&Nové Okno", ID_WINDOW_NEW + MENUITEM "&Kaskádovat\tShift+F5", ID_WINDOW_CASCADE + MENUITEM "&Uspoøádat vodorovnì", ID_WINDOW_TILE_HORZ + MENUITEM "U&spoøádat svisle\tShift+F4", ID_WINDOW_TILE_VERT + MENUITEM "Us&poøádat automaticky", ID_WINDOW_AUTOSORT + MENUITEM "Usp&oøádat symboly", ID_WINDOW_ARRANGE + END + POPUP "&Nástroje" + BEGIN + MENUITEM "&Nastavení", ID_TOOLS_OPTIONS + END + POPUP "&Pomoc" + BEGIN + MENUITEM "&Prùzkumník &FAQ...", ID_EXPLORER_FAQ + MENUITEM "O p&rùzkumníku...", ID_ABOUT_EXPLORER + MENUITEM "&O OS...", ID_ABOUT_WINDOWS + END +END + +IDM_DESKTOPBAR MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Nastavení...", ID_DESKTOPBAR_SETTINGS + MENUITEM "&Správce úloh...", ID_TASKMGR + MENUITEM SEPARATOR + MENUITEM "&O Exploreru...", ID_ABOUT_EXPLORER + END +END + +IDM_VOLUME MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Otevøít ovládání hlasitosti", ID_TRAY_VOLUME + MENUITEM "&Upravit vlastnosti zvuku", ID_VOLUME_PROPERTIES + END +END + +IDM_NOTIFYAREA MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Zobrazit skryté ikony", ID_SHOW_HIDDEN_ICONS + MENUITEM "Z&obrazit ikonu tlaèítka", ID_SHOW_ICON_BUTTON + MENUITEM "&Nastavit upozornìní...", ID_CONFIG_NOTIFYAREA + MENUITEM "N&astavit datum a èas...", ID_CONFIG_TIME + MENUITEM SEPARATOR + MENUITEM "&O prùzkuníku...", ID_ABOUT_EXPLORER + END +END + +IDM_SDIFRAME MENU PRELOAD DISCARDABLE +BEGIN + POPUP "&Soubor" + BEGIN + MENUITEM "&Spustit...", ID_EXECUTE + MENUITEM SEPARATOR + MENUITEM "&Ukonèit", ID_FILE_EXIT + END + POPUP "&Zobrazení" + BEGIN + MENUITEM "&Lišta nástrojù", ID_VIEW_TOOL_BAR + MENUITEM "&Boèní lišta", ID_VIEW_SIDE_BAR, GRAYED + MENUITEM "&Status lišta", ID_VIEW_STATUSBAR + MENUITEM SEPARATOR + MENUITEM "&Aktualizovat\tF5", ID_REFRESH + MENUITEM "Celá obrazovka\tCtrl+Shift+S", ID_VIEW_FULLSCREEN + MENUITEM "&MDI", ID_VIEW_MDI + END + POPUP "&Nástroje" + BEGIN + MENUITEM "&Nastavení", ID_TOOLS_OPTIONS + END + POPUP "&Pomoc" + BEGIN + MENUITEM "Prùzkumník &FAQ...", ID_EXPLORER_FAQ + MENUITEM "O &prùzkumníku...", ID_ABOUT_EXPLORER + MENUITEM "O &OS...", ID_ABOUT_WINDOWS + END +END + + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_EXECUTE DIALOG FIXED IMPURE 15, 13, 210, 63 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Spustit" +FONT 8, "MS Shell Dlg" +BEGIN + CONTROL "",101,"Static",SS_SIMPLE | SS_NOPREFIX,3,6,162,10 + CONTROL "&Command:",-1,"Static",SS_LEFTNOWORDWRAP | WS_GROUP,3, + 18,60,10 + EDITTEXT 201,3,29,134,12,ES_AUTOHSCROLL + CONTROL "As &Symbol",214,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,3, + 45,71,12 + DEFPUSHBUTTON "&Spustit",1,158,6,47,14 + PUSHBUTTON "&Zrušit",2,158,23,47,14 + PUSHBUTTON "&Pomoc",254,158,43,47,14 +END + +IDD_SEARCH_PROGRAM DIALOGEX 0, 0, 200, 65 +STYLE WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | + WS_SYSMENU | WS_THICKFRAME +EXSTYLE WS_EX_APPWINDOW +CAPTION "Hledat program v nabídce Start" +FONT 8, "MS Sans Serif", 0, 0, 0x1 +BEGIN + LTEXT "&Filter:",IDC_STATIC,7,9,18,8 + EDITTEXT IDC_FILTER,34,7,100,14,ES_AUTOHSCROLL + CONTROL "List1",IDC_PROGRAMS_FOUND,"SysListView32",LVS_REPORT | + LVS_SHOWSELALWAYS | LVS_SORTASCENDING | WS_BORDER | + WS_TABSTOP,7,25,186,33 + PUSHBUTTON "&Vyhledat",IDC_CHECK_ENTRIES,143,7,50,14 +END + +IDD_DESKBAR_DESKTOP DIALOG DISCARDABLE 0, 0, 212, 194 +STYLE WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Vlastnosti plochy" +FONT 8, "MS Sans Serif" +BEGIN + LTEXT "Prosím zvolte si zpùsob zarovnání ikon:",IDC_STATIC,7,7, + 166,8 + CONTROL "left/top dwn",IDC_ICON_ALIGN_0,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,7,25,46,44 + CONTROL "left/top right",IDC_ICON_ALIGN_1,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,57,25,46,44 + CONTROL "right/top left",IDC_ICON_ALIGN_2,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,110,25,46,44 + CONTROL "rig./top dwn",IDC_ICON_ALIGN_3,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,159,25,46,44 + CONTROL "left/bot. up",IDC_ICON_ALIGN_4,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,7,73,46,44 + CONTROL "left/bot. right",IDC_ICON_ALIGN_5,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,57,73,46,44 + CONTROL "right/bot. left",IDC_ICON_ALIGN_6,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,110,73,46,44 + CONTROL "rig./bot. dwn",IDC_ICON_ALIGN_7,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,159,73,46,44 + CONTROL "border down",IDC_ICON_ALIGN_8,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,7,121,46,44 + CONTROL "border H/V",IDC_ICON_ALIGN_9,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,57,121,46,44 + CONTROL "round about",IDC_ICON_ALIGN_10,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,110,121,46,44 + CONTROL "",IDC_ICON_ALIGN_11,"Button",BS_OWNERDRAW | BS_BOTTOM | + WS_TABSTOP,159,121,46,44 + CONTROL "Zobrazit verzi",ID_DESKTOP_VERSION,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,177,91,10 +END + +IDD_DESKBAR_TASKBAR DIALOG DISCARDABLE 0, 0, 210, 194 +STYLE WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Vlastnosti panelu úloh" +FONT 8, "MS Sans Serif" +BEGIN + CONTROL "&Zobrazit èas",ID_SHOW_CLOCK,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,152,52,10 + CONTROL "&Skrýt neaktivní ikony",ID_HIDE_INACTIVE_ICONS,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,174,111,10 + PUSHBUTTON "&Upozornìní...",ID_CONFIG_NOTIFYAREA,153,173,50,14 +END + +IDD_DESKBAR_STARTMENU DIALOG DISCARDABLE 0, 0, 210, 194 +STYLE WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Vlastnosti nabídky Start" +FONT 8, "MS Sans Serif" +BEGIN +END + +IDD_NOTIFYAREA DIALOGEX 0, 0, 208, 174 +STYLE WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | + WS_SYSMENU | WS_THICKFRAME +EXSTYLE WS_EX_APPWINDOW +CAPTION "Nastavení ikon v oblasti upozoròování" +FONT 8, "MS Sans Serif", 0, 0, 0x1 +BEGIN + CONTROL "Tree1",IDC_NOTIFY_ICONS,"SysTreeView32",TVS_HASLINES | + TVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,7,7,194,31 + LTEXT "&Tooltip Text:",IDC_LABEL1,7,44,40,8 + EDITTEXT IDC_NOTIFY_TOOLTIP,58,42,143,14,ES_AUTOHSCROLL + LTEXT "W&indow Title:",IDC_LABEL2,7,63,44,8 + EDITTEXT IDC_NOTIFY_TITLE,58,60,143,14,ES_AUTOHSCROLL + LTEXT "&Module Path:",IDC_LABEL3,7,81,43,8 + EDITTEXT IDC_NOTIFY_MODULE,58,78,143,14,ES_AUTOHSCROLL + GROUPBOX "&Display Mode",IDC_LABEL4,7,96,157,28 + CONTROL "&show",IDC_NOTIFY_SHOW,"Button",BS_AUTORADIOBUTTON | + WS_TABSTOP,15,108,33,10 + CONTROL "&hide",IDC_NOTIFY_HIDE,"Button",BS_AUTORADIOBUTTON,66, + 108,29,10 + CONTROL "a&utohide",IDC_NOTIFY_AUTOHIDE,"Button", + BS_AUTORADIOBUTTON,112,108,43,10 + ICON "",IDC_PICTURE,173,101,21,20 + LTEXT "&Last Change:",IDC_LABEL6,7,132,43,8 + EDITTEXT IDC_LAST_CHANGE,59,129,105,14,ES_AUTOHSCROLL | + ES_READONLY + CONTROL "sho&w hidden",ID_SHOW_HIDDEN_ICONS,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,154,56,10 + DEFPUSHBUTTON "&Nastavit",IDOK,91,153,50,14,WS_GROUP + PUSHBUTTON "&Zrušit",IDCANCEL,151,153,50,14 +END + +IDD_MDI_SDI DIALOGEX 0, 0, 194, 157 +STYLE WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +EXSTYLE WS_EX_APPWINDOW +CAPTION "Volba MDI / SDI módu" +FONT 8, "MS Sans Serif", 0, 0, 0x1 +BEGIN + LTEXT "Prosím zvolte si Vámi upøednostòovaný zpùsob zobrazení oken prùzkumníka:", + IDC_STATIC,7,7,160,8 + CONTROL "&MDI (Mnoho dokumentový interface)",IDC_MDI,"Button", + BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,7,31,121,10 + CONTROL "&SDI (Jedno dokumentový interface)",IDC_SDI,"Button", + BS_AUTORADIOBUTTON,7,62,115,10 + CONTROL 170,IDC_STATIC,"Static",SS_BITMAP,145,23,15,13 + CONTROL 171,IDC_STATIC,"Static",SS_BITMAP,145,57,15,13 + CONTROL "Open Subfolders in s&eparate windows", + IDC_SEPARATE_SUBFOLDERS,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,90,135,10 + LTEXT "Toto nastavení bude použito jako implicitní pro všechny okna prùzkumníka.", + IDC_STATIC,7,111,174,22 + DEFPUSHBUTTON "&Nastavit",IDOK,29,136,50,14,WS_GROUP + PUSHBUTTON "&Zrušit",IDCANCEL,106,136,50,14 +END + + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE DISCARDABLE +BEGIN + IDS_TITLE "Reactos prùzkumník" + IDS_START "Start" + IDS_LOGOFF "Odhlásit se..." + IDS_SHUTDOWN "Vypnout..." + IDS_LAUNCH "Spustit..." + IDS_START_HELP "Pomoc" + IDS_SEARCH_FILES "Hledat..." + IDS_DOCUMENTS "Dokumenty" + IDS_FAVORITES "Oblíbené" + IDS_PROGRAMS "Programy" + IDS_SETTINGS "Nastavení" + IDS_EXPLORE "Prozkoumat" + IDS_EMPTY "(Prázdné)" + IDS_RECENT "Nedávné dokumenty" + IDS_ADMIN "Administrace" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_STARTMENU "Nabídka Start" + IDS_MINIMIZE_ALL "minimalizovat všechna okna" + IDS_DESKTOP_NUM "Plocha %d" + IDS_VOLUME "Hlasitost" + IDS_ITEMS_CUR "souèasné položky" + IDS_ITEMS_CONFIGURED "nastavení" + IDS_ITEMS_VISIBLE "viditelné" + IDS_ITEMS_HIDDEN "skryté" + IDS_NOTIFY_SHOW "zobrazit" + IDS_NOTIFY_HIDE "skrýt" + IDS_NOTIFY_AUTOHIDE "skrývat automaticky" + IDS_SHOW_HIDDEN_ICONS "Zobrazit skryté ikony" + IDS_HIDE_ICONS "Skrýt ikony" + IDS_TERMINATE "Ukonèit ReactOS prùzkumník" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_NETWORK "Sí" + IDS_CONNECTIONS "Síové spojení" + IDS_DRIVES "Disky" + IDS_SEARCH_COMPUTER "Hledat..." + IDS_SETTINGS_MENU "Nastavení" + IDS_CONTROL_PANEL "Ovládací panel" + IDS_PRINTERS "Tiskárny" + IDS_BROWSE "Prohlížet soubory" + IDS_SEARCH_PRG "Search Program..." + IDS_ALL_USERS "Všichni uživatelé\\" + IDS_SEARCH "Hledat" + IDS_ABOUT_EXPLORER "&O prùzkumníku..." + IDS_LAUNCH_MANY_PROGRAMS + "Spustili jste více než jeden program.\nJste si jisti, že je chcete spustit všechny?" + IDS_DESKTOPBAR_SETTINGS "Nastavení plochy" + IDS_DESKTOP "Plocha" + IDS_TASKBAR "Panel úloh" +END + +#endif // Czech resources +///////////////////////////////////////////////////////////////////////////// + + +///////////////////////////////////////////////////////////////////////////// +// German (Germany) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DEU) +#ifdef _WIN32 +LANGUAGE LANG_GERMAN, SUBLANG_GERMAN +#pragma code_page(1252) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "#include ""resource.h""\r\n" + "#define APSTUDIO_HIDDEN_SYMBOLS\r\n" + "#include ""windows.h""\r\n" + "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n" + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + +#endif // German (Germany) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/reactos/base/shell/explorer/explorer-de.rc b/reactos/base/shell/explorer/explorer-de.rc new file mode 100644 index 00000000000..34ab5f608a1 --- /dev/null +++ b/reactos/base/shell/explorer/explorer-de.rc @@ -0,0 +1,405 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "resource.h" +#define APSTUDIO_HIDDEN_SYMBOLS +#include "windows.h" +#undef APSTUDIO_HIDDEN_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// German (Germany) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DEU) +#ifdef _WIN32 +LANGUAGE LANG_GERMAN, SUBLANG_GERMAN +#pragma code_page(1252) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Menu +// + +IDM_MDIFRAME MENU DISCARDABLE +BEGIN + POPUP "&Datei" + BEGIN + MENUITEM "&Ausführen...", ID_EXECUTE + MENUITEM SEPARATOR + MENUITEM "&Beenden", ID_FILE_EXIT + END + POPUP "&Ansicht" + BEGIN + MENUITEM "&Toolbar", ID_VIEW_TOOL_BAR + MENUITEM "&Extra Bar", ID_VIEW_EXTRA_BAR + MENUITEM "Lauf&werkleiste", ID_VIEW_DRIVE_BAR, CHECKED + MENUITEM "S&ide Bar", ID_VIEW_SIDE_BAR + MENUITEM "&Status Bar", ID_VIEW_STATUSBAR + MENUITEM SEPARATOR + MENUITEM "&Aktualisieren\tF5", ID_REFRESH + MENUITEM "&Vollbild\tCtrl+Shift+S", ID_VIEW_FULLSCREEN + MENUITEM "SDI", ID_VIEW_SDI + END + POPUP "&Fenster" + BEGIN + MENUITEM "Neues &Fenster", ID_WINDOW_NEW + MENUITEM "Über&lappend\tUmschalt+F5", ID_WINDOW_CASCADE + MENUITEM "&Untereinander", ID_WINDOW_TILE_HORZ + MENUITEM "&Nebeneinander\tUmschalt+F4", ID_WINDOW_TILE_VERT + MENUITEM "au&tomatisch anordnen", ID_WINDOW_AUTOSORT + MENUITEM "&Symbole anordnen", ID_WINDOW_ARRANGE + END + POPUP "&Extras" + BEGIN + MENUITEM "&Optionen", ID_TOOLS_OPTIONS + END + POPUP "&Hilfe" + BEGIN + MENUITEM "Explorer &FAQ...", ID_EXPLORER_FAQ + MENUITEM "&Über ReactOS Explorer...", ID_ABOUT_EXPLORER + MENUITEM "Über React&OS...", ID_ABOUT_WINDOWS + END +END + +IDM_SDIFRAME MENU DISCARDABLE +BEGIN + POPUP "&Datei" + BEGIN + MENUITEM "&Ausführen...", ID_EXECUTE + MENUITEM SEPARATOR + MENUITEM "&Schliessen", ID_FILE_EXIT + END + POPUP "&Ansicht" + BEGIN + MENUITEM "&Toolbar", ID_VIEW_TOOL_BAR + MENUITEM "S&ide Bar", ID_VIEW_SIDE_BAR, GRAYED + MENUITEM "&Status Bar", ID_VIEW_STATUSBAR + MENUITEM SEPARATOR + MENUITEM "&Aktualisieren\tF5", ID_REFRESH + MENUITEM "&Vollbild\tCtrl+Shift+S", ID_VIEW_FULLSCREEN + MENUITEM "&MDI", ID_VIEW_MDI + END + POPUP "&Extras" + BEGIN + MENUITEM "&Optionen", ID_TOOLS_OPTIONS + END + POPUP "&Hilfe" + BEGIN + MENUITEM "Explorer &FAQ...", ID_EXPLORER_FAQ + MENUITEM "&Über Explorer...", ID_ABOUT_EXPLORER + MENUITEM "Über &OS...", ID_ABOUT_WINDOWS + END +END + +IDM_DESKTOPBAR MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Einstellungen...", ID_DESKTOPBAR_SETTINGS + MENUITEM "&Task Manager...", ID_TASKMGR + MENUITEM SEPARATOR + MENUITEM "&Über Explorer...", ID_ABOUT_EXPLORER + END +END + +IDM_NOTIFYAREA MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Zeige versteckte Icons", ID_SHOW_HIDDEN_ICONS + MENUITEM "Zeige Icon-&Button", ID_SHOW_ICON_BUTTON + MENUITEM "&Konfiguriere Benachrichtigungen...", ID_CONFIG_NOTIFYAREA + MENUITEM "Einstellen von &Datum/Zeit...", ID_CONFIG_TIME + MENUITEM SEPARATOR + MENUITEM "&Über Explorer...", ID_ABOUT_EXPLORER + END +END + +IDM_VOLUME MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "Öffne &Lautstärkeregler", ID_TRAY_VOLUME + MENUITEM "Editieren der Audio-&Einstellungen", ID_VOLUME_PROPERTIES + END +END + + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_EXECUTE DIALOG DISCARDABLE 15, 13, 210, 63 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Ausführen" +FONT 8, "MS Shell Dlg" +BEGIN + CONTROL "",101,"Static",SS_SIMPLE | SS_NOPREFIX,3,6,162,10 + CONTROL "Befehls&zeile:",-1,"Static",SS_LEFTNOWORDWRAP | + WS_GROUP,3,18,60,10 + EDITTEXT 201,3,29,134,12,ES_AUTOHSCROLL + CONTROL "Als &Symbol",214,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, + 3,45,71,12 + DEFPUSHBUTTON "&OK",1,158,6,47,14 + PUSHBUTTON "A&bbrechen",2,158,23,47,14 + PUSHBUTTON "&Hilfe",254,158,43,47,14 +END + +IDD_ABOUT_EXPLORER DIALOG DISCARDABLE 0, 0, 199, 106 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Über ReactOS Explorer" +FONT 10, "MS Sans Serif" +BEGIN + LTEXT "ReactOS Explorer",IDC_ROS_EXPLORER,91,13,104,11 + LTEXT "V 0.9",IDC_VERSION_TXT,91,27,104,8 + LTEXT "(c) 2003-2005 Martin Fuchs",IDC_STATIC,91,42,104,8 + LTEXT "",IDC_WIN_VERSION,91,58,98,22 + LTEXT "http://www.sky.franken.de/explorer/",IDC_WWW,17,84,129, + 8 + CONTROL "&OK",IDOK,"Button",BS_OWNERDRAW | BS_FLAT | WS_GROUP, + 154,90,38,12 +END + +IDD_DESKBAR_DESKTOP DIALOG DISCARDABLE 0, 0, 212, 204 +STYLE WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Desktop-Einstellungen" +FONT 8, "MS Sans Serif" +BEGIN + LTEXT "Bitte wählen Sie den gewünschten Platzierungs-Algorithmus für die Desktop-Icons aus:", + IDC_STATIC,7,7,197,23 + CONTROL "left/top dwn",IDC_ICON_ALIGN_0,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,7,35,46,44 + CONTROL "left/top right",IDC_ICON_ALIGN_1,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,57,35,46,44 + CONTROL "right/top left",IDC_ICON_ALIGN_2,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,110,35,46,44 + CONTROL "rig./top dwn",IDC_ICON_ALIGN_3,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,159,35,46,44 + CONTROL "left/bot. up",IDC_ICON_ALIGN_4,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,7,83,46,44 + CONTROL "left/bot. right",IDC_ICON_ALIGN_5,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,57,83,46,44 + CONTROL "right/bot. left",IDC_ICON_ALIGN_6,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,110,83,46,44 + CONTROL "rig./bot. dwn",IDC_ICON_ALIGN_7,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,159,83,46,44 + CONTROL "border down",IDC_ICON_ALIGN_8,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,7,131,46,44 + CONTROL "border H/V",IDC_ICON_ALIGN_9,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,57,131,46,44 + CONTROL "round about",IDC_ICON_ALIGN_10,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,110,131,46,44 + CONTROL "",IDC_ICON_ALIGN_11,"Button",BS_OWNERDRAW | BS_BOTTOM | + WS_TABSTOP,159,131,46,44 + CONTROL "Anzeige der &Versionsnummer",ID_DESKTOP_VERSION,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,187,107,10 +END + +IDD_DESKBAR_STARTMENU DIALOG DISCARDABLE 0, 0, 210, 204 +STYLE WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Startmenü-Einstellungen" +FONT 8, "MS Sans Serif" +BEGIN +END + +IDD_DESKBAR_TASKBAR DIALOG DISCARDABLE 0, 0, 210, 204 +STYLE WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Taskbar-Einstellungen" +FONT 8, "MS Sans Serif" +BEGIN + CONTROL "Anzeigen der &Uhr",ID_SHOW_CLOCK,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,152,71,10 + CONTROL "&verstecke inaktive Notification-Icons", + ID_HIDE_INACTIVE_ICONS,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,174,131,10 + PUSHBUTTON "&Notifications...",ID_CONFIG_NOTIFYAREA,153,173,50,14 +END + +IDD_MDI_SDI DIALOGEX 0, 0, 194, 157 +STYLE WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +EXSTYLE WS_EX_APPWINDOW +CAPTION "Auswahl des Explorerfenster-Modus" +FONT 8, "MS Sans Serif", 0, 0, 0x1 +BEGIN + LTEXT "Please select your prefered explorer user interface:", + IDC_STATIC,7,7,160,8 + CONTROL "&MDI (Multiple Document Interface)",IDC_MDI,"Button", + BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,7,31,124,10 + CONTROL "&SDI (Single Document Interface)",IDC_SDI,"Button", + BS_AUTORADIOBUTTON,7,62,118,10 + CONTROL 170,IDC_STATIC,"Static",SS_BITMAP,145,23,15,13 + CONTROL 171,IDC_STATIC,"Static",SS_BITMAP,145,57,15,13 + CONTROL "Öffne Unterverzeichnisses in &neuen Fenstern", + IDC_SEPARATE_SUBFOLDERS,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,90,157,10 + LTEXT "Diese Auswahl wird künftig für alle Explorer-Fenster verwendet werden.", + IDC_STATIC,7,111,174,22 + DEFPUSHBUTTON "&OK",IDOK,29,136,50,14,WS_GROUP + PUSHBUTTON "A&bbrechen",IDCANCEL,106,136,50,14 +END + +IDD_NOTIFYAREA DIALOGEX 0, 0, 208, 174 +STYLE WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | + WS_SYSMENU | WS_THICKFRAME +EXSTYLE WS_EX_APPWINDOW +CAPTION "Konfiguration der Benachrichtigungs-Icons" +FONT 8, "MS Sans Serif", 0, 0, 0x1 +BEGIN + CONTROL "Tree1",IDC_NOTIFY_ICONS,"SysTreeView32",TVS_HASLINES | + TVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,7,7,194,31 + LTEXT "&Tooltip-Text:",IDC_LABEL1,7,44,40,8 + EDITTEXT IDC_NOTIFY_TOOLTIP,58,42,143,14,ES_AUTOHSCROLL + LTEXT "&Fenster-Titel:",IDC_LABEL2,7,63,42,8 + EDITTEXT IDC_NOTIFY_TITLE,58,60,143,14,ES_AUTOHSCROLL + LTEXT "&Modulpfad:",IDC_LABEL3,7,81,36,8 + EDITTEXT IDC_NOTIFY_MODULE,58,78,143,14,ES_AUTOHSCROLL + GROUPBOX "&Anzeigemodus",IDC_LABEL4,7,96,157,28 + CONTROL "&zeigen",IDC_NOTIFY_SHOW,"Button",BS_AUTORADIOBUTTON | + WS_TABSTOP,15,108,37,10 + CONTROL "&verstecken",IDC_NOTIFY_HIDE,"Button", + BS_AUTORADIOBUTTON,55,108,51,10 + CONTROL "a&utomatisch",IDC_NOTIFY_AUTOHIDE,"Button", + BS_AUTORADIOBUTTON,110,108,54,10 + ICON "",IDC_PICTURE,173,101,20,20 + LTEXT "&Letzte Änderung:",IDC_LABEL6,7,132,55,8 + EDITTEXT IDC_LAST_CHANGE,66,129,98,14,ES_AUTOHSCROLL | + ES_READONLY + CONTROL "zei&ge versteckte",ID_SHOW_HIDDEN_ICONS,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,154,68,10 + DEFPUSHBUTTON "&OK",IDOK,91,153,50,14,WS_GROUP + PUSHBUTTON "A&bbrechen",IDCANCEL,151,153,50,14 +END + +IDD_SEARCH_PROGRAM DIALOGEX 0, 0, 200, 65 +STYLE WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | + WS_SYSMENU | WS_THICKFRAME +EXSTYLE WS_EX_APPWINDOW +CAPTION "Programmsuche im Startmenü" +FONT 8, "MS Sans Serif", 0, 0, 0x1 +BEGIN + LTEXT "&Filter:",IDC_STATIC,7,9,18,8 + EDITTEXT IDC_FILTER,34,7,96,14,ES_AUTOHSCROLL + CONTROL "List1",IDC_PROGRAMS_FOUND,"SysListView32",LVS_REPORT | + LVS_SHOWSELALWAYS | LVS_SORTASCENDING | WS_BORDER | + WS_TABSTOP,7,25,186,33 + PUSHBUTTON "Alle über&prüfen",IDC_CHECK_ENTRIES,138,7,55,14 +END + + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "#include ""resource.h""\r\n" + "#define APSTUDIO_HIDDEN_SYMBOLS\r\n" + "#include ""windows.h""\r\n" + "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n" + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE DISCARDABLE +BEGIN + IDS_TITLE "Reactos Explorer" + IDS_START "Start" + IDS_LOGOFF "Abmelden..." + IDS_SHUTDOWN "Herunterfahren..." + IDS_LAUNCH "Starten..." + IDS_START_HELP "Hilfe" + IDS_SEARCH_FILES "Suche Dateien..." + IDS_DOCUMENTS "Dokumente" + IDS_FAVORITES "Bookmarks" + IDS_PROGRAMS "Programme" + IDS_SETTINGS "Einstellungen" + IDS_EXPLORE "Explore" + IDS_EMPTY "(Empty)" + IDS_RECENT "Aktuelle Dokumente" + IDS_ADMIN "Verwaltung" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_STARTMENU "Startmenü" + IDS_MINIMIZE_ALL "alle Fenster minimieren" + IDS_DESKTOP_NUM "Desktop %d" + IDS_VOLUME "Lautstärke" + IDS_ITEMS_CUR "aktuelle Icons" + IDS_ITEMS_CONFIGURED "Konfiguratrion" + IDS_ITEMS_VISIBLE "sichtbar" + IDS_ITEMS_HIDDEN "unsichtbar" + IDS_NOTIFY_SHOW "sichtbar" + IDS_NOTIFY_HIDE "versteckt" + IDS_NOTIFY_AUTOHIDE "automatisch" + IDS_SHOW_HIDDEN_ICONS "Zeige versteckte Icons" + IDS_HIDE_ICONS "Verstecke Icons" + IDS_TERMINATE "ROS Explorer beenden" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_NETWORK "Netzwerk" + IDS_CONNECTIONS "Netzwerk-Verbindungen" + IDS_DRIVES "Verzeichnisse" + IDS_SEARCH_COMPUTER "Suche Computer..." + IDS_SETTINGS_MENU "Einstellungen-Menu" + IDS_CONTROL_PANEL "Systemsteuerung" + IDS_PRINTERS "Drucker" + IDS_BROWSE "Dateien" + IDS_SEARCH_PRG "Suche Programm..." + IDS_ALL_USERS "Alle Benutzer\\" + IDS_SEARCH "Suche" + IDS_ABOUT_EXPLORER "&Über Explorer..." + IDS_LAUNCH_MANY_PROGRAMS + "Sie haben mehrere Programme ausgewählt.\nSind Sie sicher, daß sie diese alle starten wollen?" + IDS_DESKTOPBAR_SETTINGS "Desktop-Einstellungen" + IDS_DESKTOP "Desktop" + IDS_TASKBAR "Taskbar" +END + +#endif // German (Germany) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/reactos/base/shell/explorer/explorer-en.rc b/reactos/base/shell/explorer/explorer-en.rc new file mode 100644 index 00000000000..1324948e7b7 --- /dev/null +++ b/reactos/base/shell/explorer/explorer-en.rc @@ -0,0 +1,399 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (U.S.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Menu +// + +IDM_MDIFRAME MENU DISCARDABLE +BEGIN + POPUP "&File" + BEGIN + MENUITEM "&Execute...", ID_EXECUTE + MENUITEM SEPARATOR + MENUITEM "E&xit", ID_FILE_EXIT + END + POPUP "&View" + BEGIN + MENUITEM "&Toolbar", ID_VIEW_TOOL_BAR + MENUITEM "&Extra Bar", ID_VIEW_EXTRA_BAR + MENUITEM "&Drivebar", ID_VIEW_DRIVE_BAR, CHECKED + MENUITEM "S&ide Bar", ID_VIEW_SIDE_BAR + MENUITEM "&Status Bar", ID_VIEW_STATUSBAR + MENUITEM SEPARATOR + MENUITEM "&Refresh\tF5", ID_REFRESH + MENUITEM "F&ull Screen\tCtrl+Shift+S", ID_VIEW_FULLSCREEN + MENUITEM "SDI", ID_VIEW_SDI + END + POPUP "&Window" + BEGIN + MENUITEM "New &Window", ID_WINDOW_NEW + MENUITEM "Cascading\tShift+F5", ID_WINDOW_CASCADE + MENUITEM "Tile &Horizontally", ID_WINDOW_TILE_HORZ + MENUITEM "Tile &Vertically\tShift+F4", ID_WINDOW_TILE_VERT + MENUITEM "Arrange Automatically", ID_WINDOW_AUTOSORT + MENUITEM "Arrange &Symbols", ID_WINDOW_ARRANGE + END + POPUP "&Tools" + BEGIN + MENUITEM "&Options", ID_TOOLS_OPTIONS + END + POPUP "&Help" + BEGIN + MENUITEM "Explorer &FAQ...", ID_EXPLORER_FAQ + MENUITEM "&About Explorer...", ID_ABOUT_EXPLORER + MENUITEM "About &OS...", ID_ABOUT_WINDOWS + END +END + +IDM_DESKTOPBAR MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Settings...", ID_DESKTOPBAR_SETTINGS + MENUITEM "&Task Manager...", ID_TASKMGR + MENUITEM SEPARATOR + MENUITEM "&About Explorer...", ID_ABOUT_EXPLORER + END +END + +IDM_VOLUME MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "Open Volume Control", ID_TRAY_VOLUME + MENUITEM "Adjust Audio Properties", ID_VOLUME_PROPERTIES + END +END + +IDM_NOTIFYAREA MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Show hidden icons", ID_SHOW_HIDDEN_ICONS + MENUITEM "Show Icon &Button", ID_SHOW_ICON_BUTTON + MENUITEM "&Configure Notifications...", ID_CONFIG_NOTIFYAREA + MENUITEM "Adjust Date/&Time...", ID_CONFIG_TIME + MENUITEM SEPARATOR + MENUITEM "&About Explorer...", ID_ABOUT_EXPLORER + END +END + +IDM_SDIFRAME MENU DISCARDABLE +BEGIN + POPUP "&File" + BEGIN + MENUITEM "&Execute...", ID_EXECUTE + MENUITEM SEPARATOR + MENUITEM "&Close", ID_FILE_EXIT + END + POPUP "&View" + BEGIN + MENUITEM "&Toolbar", ID_VIEW_TOOL_BAR + MENUITEM "S&ide Bar", ID_VIEW_SIDE_BAR, GRAYED + MENUITEM "&Status Bar", ID_VIEW_STATUSBAR + MENUITEM SEPARATOR + MENUITEM "&Refresh\tF5", ID_REFRESH + MENUITEM "F&ull Screen\tCtrl+Shift+S", ID_VIEW_FULLSCREEN + MENUITEM "&MDI", ID_VIEW_MDI + END + POPUP "&Tools" + BEGIN + MENUITEM "&Options", ID_TOOLS_OPTIONS + END + POPUP "&Help" + BEGIN + MENUITEM "Explorer &FAQ...", ID_EXPLORER_FAQ + MENUITEM "&About Explorer...", ID_ABOUT_EXPLORER + MENUITEM "About &OS...", ID_ABOUT_WINDOWS + END +END + + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_EXECUTE DIALOG DISCARDABLE 15, 13, 210, 63 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Execute" +FONT 8, "MS Shell Dlg" +BEGIN + CONTROL "",101,"Static",SS_SIMPLE | SS_NOPREFIX,3,6,150,10 + CONTROL "&Command:",-1,"Static",SS_LEFTNOWORDWRAP | WS_GROUP,3, + 18,60,10 + EDITTEXT 201,3,29,134,12,ES_AUTOHSCROLL + CONTROL "As &Symbol",214,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,3, + 45,71,12 + DEFPUSHBUTTON "&OK",1,158,6,47,14 + PUSHBUTTON "&Cancel",2,158,23,47,14 + PUSHBUTTON "&Help",254,158,43,47,14 +END + +IDD_SEARCH_PROGRAM DIALOGEX 0, 0, 200, 65 +STYLE WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | + WS_SYSMENU | WS_THICKFRAME +EXSTYLE WS_EX_APPWINDOW +CAPTION "Search Program in Startmenu" +FONT 8, "MS Sans Serif", 0, 0, 0x1 +BEGIN + LTEXT "&Filter:",IDC_STATIC,7,9,18,8 + EDITTEXT IDC_FILTER,34,7,100,14,ES_AUTOHSCROLL + CONTROL "List1",IDC_PROGRAMS_FOUND,"SysListView32",LVS_REPORT | + LVS_SHOWSELALWAYS | LVS_SORTASCENDING | WS_BORDER | + WS_TABSTOP,7,25,186,33 + PUSHBUTTON "&Check Entries",IDC_CHECK_ENTRIES,143,7,50,14 +END + +IDD_DESKBAR_DESKTOP DIALOG DISCARDABLE 0, 0, 212, 194 +STYLE WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Desktop Properties" +FONT 8, "MS Sans Serif" +BEGIN + LTEXT "Please select your prefered icon alignment algorithm:", + IDC_STATIC,7,7,166,8 + CONTROL "left/top dwn",IDC_ICON_ALIGN_0,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,7,25,46,44 + CONTROL "left/top right",IDC_ICON_ALIGN_1,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,57,25,46,44 + CONTROL "right/top left",IDC_ICON_ALIGN_2,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,110,25,46,44 + CONTROL "rig./top dwn",IDC_ICON_ALIGN_3,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,159,25,46,44 + CONTROL "left/bot. up",IDC_ICON_ALIGN_4,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,7,73,46,44 + CONTROL "left/bot. right",IDC_ICON_ALIGN_5,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,57,73,46,44 + CONTROL "right/bot. left",IDC_ICON_ALIGN_6,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,110,73,46,44 + CONTROL "rig./bot. dwn",IDC_ICON_ALIGN_7,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,159,73,46,44 + CONTROL "border down",IDC_ICON_ALIGN_8,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,7,121,46,44 + CONTROL "border H/V",IDC_ICON_ALIGN_9,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,57,121,46,44 + CONTROL "round about",IDC_ICON_ALIGN_10,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,110,121,46,44 + CONTROL "",IDC_ICON_ALIGN_11,"Button",BS_OWNERDRAW | BS_BOTTOM | + WS_TABSTOP,159,121,46,44 + CONTROL "Display &Version Number",ID_DESKTOP_VERSION,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,177,91,10 +END + +IDD_DESKBAR_TASKBAR DIALOG DISCARDABLE 0, 0, 210, 194 +STYLE WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Taskbar Properties" +FONT 8, "MS Sans Serif" +BEGIN + CONTROL "show &clock",ID_SHOW_CLOCK,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,152,52,10 + CONTROL "&hide inactive notification icons", + ID_HIDE_INACTIVE_ICONS,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,174,111,10 + PUSHBUTTON "&Notifications...",ID_CONFIG_NOTIFYAREA,153,173,50,14 +END + +IDD_DESKBAR_STARTMENU DIALOG DISCARDABLE 0, 0, 210, 194 +STYLE WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Startmenu Properties" +FONT 8, "MS Sans Serif" +BEGIN +END + +IDD_NOTIFYAREA DIALOGEX 0, 0, 208, 174 +STYLE WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | + WS_SYSMENU | WS_THICKFRAME +EXSTYLE WS_EX_APPWINDOW +CAPTION "Configure Notification Icons" +FONT 8, "MS Sans Serif", 0, 0, 0x1 +BEGIN + CONTROL "Tree1",IDC_NOTIFY_ICONS,"SysTreeView32",TVS_HASLINES | + TVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,7,7,194,31 + LTEXT "&Tooltip Text:",IDC_LABEL1,7,44,40,8 + EDITTEXT IDC_NOTIFY_TOOLTIP,58,42,143,14,ES_AUTOHSCROLL + LTEXT "W&indow Title:",IDC_LABEL2,7,63,44,8 + EDITTEXT IDC_NOTIFY_TITLE,58,60,143,14,ES_AUTOHSCROLL + LTEXT "&Module Path:",IDC_LABEL3,7,81,43,8 + EDITTEXT IDC_NOTIFY_MODULE,58,78,143,14,ES_AUTOHSCROLL + GROUPBOX "&Display Mode",IDC_LABEL4,7,96,157,28 + CONTROL "&show",IDC_NOTIFY_SHOW,"Button",BS_AUTORADIOBUTTON | + WS_TABSTOP,15,108,33,10 + CONTROL "&hide",IDC_NOTIFY_HIDE,"Button",BS_AUTORADIOBUTTON,66, + 108,29,10 + CONTROL "a&utohide",IDC_NOTIFY_AUTOHIDE,"Button", + BS_AUTORADIOBUTTON,112,108,43,10 + ICON "",IDC_PICTURE,173,101,21,20 + LTEXT "&Last Change:",IDC_LABEL6,7,132,43,8 + EDITTEXT IDC_LAST_CHANGE,59,129,105,14,ES_AUTOHSCROLL | + ES_READONLY + CONTROL "sho&w hidden",ID_SHOW_HIDDEN_ICONS,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,154,56,10 + DEFPUSHBUTTON "&OK",IDOK,91,153,50,14,WS_GROUP + PUSHBUTTON "&Cancel",IDCANCEL,151,153,50,14 +END + +IDD_MDI_SDI DIALOGEX 0, 0, 194, 157 +STYLE WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +EXSTYLE WS_EX_APPWINDOW +CAPTION "Choose Explorer window mode" +FONT 8, "MS Sans Serif", 0, 0, 0x1 +BEGIN + LTEXT "Please select your prefered explorer user interface:", + IDC_STATIC,7,7,160,8 + CONTROL "&MDI (Multiple Document Interface)",IDC_MDI,"Button", + BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,7,31,124,10 + CONTROL "&SDI (Single Document Interface)",IDC_SDI,"Button", + BS_AUTORADIOBUTTON,7,62,118,10 + CONTROL 170,IDC_STATIC,"Static",SS_BITMAP,145,23,15,13 + CONTROL 171,IDC_STATIC,"Static",SS_BITMAP,145,57,15,13 + CONTROL "Open Subfolders in s&eparate windows", + IDC_SEPARATE_SUBFOLDERS,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,90,135,10 + LTEXT "This setting will be used as default for all explorer windows in the future.", + IDC_STATIC,7,111,174,22 + DEFPUSHBUTTON "&OK",IDOK,29,136,50,14,WS_GROUP + PUSHBUTTON "&Cancel",IDCANCEL,106,136,50,14 +END + +IDD_ABOUT_EXPLORER DIALOG DISCARDABLE 0, 0, 199, 106 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "About ReactOS Explorer" +FONT 10, "MS Sans Serif" +BEGIN + LTEXT "ReactOS Explorer",IDC_ROS_EXPLORER,91,13,104,11 + LTEXT "V 0.9",IDC_VERSION_TXT,91,27,104,8 + LTEXT "(c) 2003-2005 Martin Fuchs",IDC_STATIC,91,42,104,8 + LTEXT "",IDC_WIN_VERSION,91,58,98,22 + LTEXT "http://www.sky.franken.de/explorer/",IDC_WWW,17,84,129, + 8 + CONTROL "&OK",IDOK,"Button",BS_OWNERDRAW | BS_FLAT | WS_GROUP, + 154,90,38,12 +END + + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE MOVEABLE PURE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE MOVEABLE PURE +BEGIN + "#include \r\n" + "\0" +END + +3 TEXTINCLUDE MOVEABLE PURE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE DISCARDABLE +BEGIN + IDS_TITLE "Reactos Explorer" + IDS_START "Start" + IDS_LOGOFF "Log Off..." + IDS_SHUTDOWN "Turn Off..." + IDS_LAUNCH "Run..." + IDS_START_HELP "Help" + IDS_SEARCH_FILES "Search..." + IDS_DOCUMENTS "My Documents" + IDS_FAVORITES "Favorites" + IDS_PROGRAMS "Programs" + IDS_SETTINGS "Settings" + IDS_EXPLORE "Explore" + IDS_EMPTY "(Empty)" + IDS_RECENT "Recent Documents" + IDS_ADMIN "Administration" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_STARTMENU "Startmenu" + IDS_MINIMIZE_ALL "minimize all windows" + IDS_DESKTOP_NUM "Desktop %d" + IDS_VOLUME "Volume" + IDS_ITEMS_CUR "current items" + IDS_ITEMS_CONFIGURED "configuration" + IDS_ITEMS_VISIBLE "visible" + IDS_ITEMS_HIDDEN "hidden" + IDS_NOTIFY_SHOW "show" + IDS_NOTIFY_HIDE "hide" + IDS_NOTIFY_AUTOHIDE "autohide" + IDS_SHOW_HIDDEN_ICONS "Show hidden icons" + IDS_HIDE_ICONS "Hide icons" + IDS_TERMINATE "Terminate ROS Explorer" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_NETWORK "Network" + IDS_CONNECTIONS "Network Connections" + IDS_DRIVES "Drives" + IDS_SEARCH_COMPUTER "Search Computer..." + IDS_SETTINGS_MENU "Settings Menu" + IDS_CONTROL_PANEL "Control Panel" + IDS_PRINTERS "Printers" + IDS_BROWSE "Browse Files" + IDS_SEARCH_PRG "Search Program..." + IDS_ALL_USERS "All Users\\" + IDS_SEARCH "Search" + IDS_ABOUT_EXPLORER "&About Explorer..." + IDS_LAUNCH_MANY_PROGRAMS + "You have selected more than one program.\nAre you sure you want to launch all of them?" + IDS_DESKTOPBAR_SETTINGS "Desktop Settings" + IDS_DESKTOP "Desktop" + IDS_TASKBAR "Taskbar" +END + +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/reactos/base/shell/explorer/explorer-es.rc b/reactos/base/shell/explorer/explorer-es.rc new file mode 100644 index 00000000000..07220b93768 --- /dev/null +++ b/reactos/base/shell/explorer/explorer-es.rc @@ -0,0 +1,384 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// Spanish (Castilian) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ESP) +#ifdef _WIN32 +LANGUAGE LANG_SPANISH, SUBLANG_NEUTRAL +#pragma code_page(1252) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Menu +// + +IDM_MDIFRAME MENU DISCARDABLE +BEGIN + POPUP "&Archivo" + BEGIN + MENUITEM "E&jecutar...", ID_EXECUTE + MENUITEM SEPARATOR + MENUITEM "&Salir", ID_FILE_EXIT + END + POPUP "&Ver" + BEGIN + MENUITEM "&Herramientas", ID_VIEW_TOOL_BAR + MENUITEM "Barra &Extra", ID_VIEW_EXTRA_BAR + MENUITEM "Barra de &Unidades", ID_VIEW_DRIVE_BAR, CHECKED + MENUITEM "Barra &Lateral", ID_VIEW_SIDE_BAR + MENUITEM "Barra de &Estado", ID_VIEW_STATUSBAR + MENUITEM SEPARATOR + MENUITEM "&Actualizar\tF5", ID_REFRESH + MENUITEM "P&antalla Completa\tCtrl+Shift+S", ID_VIEW_FULLSCREEN + MENUITEM "&SDI", ID_VIEW_SDI + END + POPUP "&Ventana" + BEGIN + MENUITEM "Nueva &Ventana", ID_WINDOW_NEW + MENUITEM "Cascada\tShift+F5", ID_WINDOW_CASCADE + MENUITEM "Mosaico &Horizontal", ID_WINDOW_TILE_HORZ + MENUITEM "Mosaico &Vertical\tShift+F4", ID_WINDOW_TILE_VERT + MENUITEM "Agrupar Automaticamente", ID_WINDOW_AUTOSORT + MENUITEM "Agrupar &Símbolos", ID_WINDOW_ARRANGE + END + POPUP "&Tools" + BEGIN + MENUITEM "&Options", ID_TOOLS_OPTIONS + END + POPUP "A&yuda" + BEGIN + MENUITEM "Explorer &FAQ...", ID_EXPLORER_FAQ + MENUITEM "&Acerca de Explorer...", ID_ABOUT_EXPLORER + MENUITEM "Acerca de &OS...", ID_ABOUT_WINDOWS + END +END + +IDM_DESKTOPBAR MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Configuracion...", ID_DESKTOPBAR_SETTINGS + MENUITEM "&Administrador de Tareas...", ID_TASKMGR + MENUITEM SEPARATOR + MENUITEM "&Acerca de Explorer...", ID_ABOUT_EXPLORER + END +END + +IDM_VOLUME MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "Abrir Control de Volumen", ID_TRAY_VOLUME + MENUITEM "Ajustar Propiedades de Audio", ID_VOLUME_PROPERTIES + END +END + +IDM_NOTIFYAREA MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Mostrar iconos ocultos", ID_SHOW_HIDDEN_ICONS + MENUITEM "Mostrar &Botón de Icono", ID_SHOW_ICON_BUTTON + MENUITEM "&Configurar Notificaciones...", ID_CONFIG_NOTIFYAREA + MENUITEM "Ajustar Fecha/&Hora...", ID_CONFIG_TIME + MENUITEM SEPARATOR + MENUITEM "&Acerca de Explorer...", ID_ABOUT_EXPLORER + END +END + +IDM_SDIFRAME MENU DISCARDABLE +BEGIN + POPUP "&Archivo" + BEGIN + MENUITEM "E&jecutar...", ID_EXECUTE + MENUITEM SEPARATOR + MENUITEM "S&alir", ID_FILE_EXIT + END + POPUP "&Ver" + BEGIN + MENUITEM "&Barra de Herramientas", ID_VIEW_TOOL_BAR + MENUITEM "Barra &Lateral", ID_VIEW_SIDE_BAR, GRAYED + MENUITEM "Barra de &Estado", ID_VIEW_STATUSBAR + MENUITEM SEPARATOR + MENUITEM "&Actualizar\tF5", ID_REFRESH + MENUITEM "P&antalla Completa\tCtrl+Shift+S", ID_VIEW_FULLSCREEN + MENUITEM "&MDI", ID_VIEW_MDI + END + POPUP "Herramientas" + BEGIN + MENUITEM "&Opciones", ID_TOOLS_OPTIONS + END + POPUP "&Ayuda" + BEGIN + MENUITEM "Explorer &FAQ...", ID_EXPLORER_FAQ + MENUITEM "&Acerca de Explorer...", ID_ABOUT_EXPLORER + MENUITEM "Acerca de &OS...", ID_ABOUT_WINDOWS + END +END + + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_EXECUTE DIALOG DISCARDABLE 15, 13, 210, 63 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Ejecutar" +FONT 8, "MS Shell Dlg" +BEGIN + CONTROL "",101,"Static",SS_SIMPLE | SS_NOPREFIX,3,6,150,10 + CONTROL "Orden:",-1,"Static",SS_LEFTNOWORDWRAP | WS_GROUP,3,18, + 60,10 + EDITTEXT 201,3,29,134,12,ES_AUTOHSCROLL + CONTROL "Como &Símbolo",214,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,3,45,71,12 + DEFPUSHBUTTON "&Aceptar",1,158,6,47,14 + PUSHBUTTON "&Cancelar",2,158,23,47,14 + PUSHBUTTON "&Ayuda",254,158,43,47,14 +END + +IDD_SEARCH_PROGRAM DIALOGEX 0, 0, 200, 65 +STYLE WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | + WS_SYSMENU | WS_THICKFRAME +EXSTYLE WS_EX_APPWINDOW +CAPTION "Buscar Programa en el menu Inicio" +FONT 8, "MS Sans Serif", 0, 0, 0x1 +BEGIN + LTEXT "&Filtro:",IDC_STATIC,7,9,23,8 + EDITTEXT IDC_FILTER,34,7,100,14,ES_AUTOHSCROLL + CONTROL "List1",IDC_PROGRAMS_FOUND,"SysListView32",LVS_REPORT | + LVS_SHOWSELALWAYS | LVS_SORTASCENDING | WS_BORDER | + WS_TABSTOP,7,25,186,33 + PUSHBUTTON "&Marcar Entradas",IDC_CHECK_ENTRIES,136,7,57,14 +END + +IDD_DESKBAR_DESKTOP DIALOG DISCARDABLE 0, 0, 212, 194 +STYLE WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Propiedades de Pantalla" +FONT 8, "MS Sans Serif" +BEGIN + LTEXT "Por favor seleccione su algoritmo de alineamiento preferido:", + IDC_STATIC,7,7,195,8 + CONTROL "izquierda/arriba abajo",IDC_ICON_ALIGN_0,"Button", + BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,7,25,46,44 + CONTROL "izquierda/arriba derecha",IDC_ICON_ALIGN_1,"Button", + BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,57,25,46,44 + CONTROL "derecha/arriba izquierda",IDC_ICON_ALIGN_2,"Button", + BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,110,25,46,44 + CONTROL "derecha/arriba abajo",IDC_ICON_ALIGN_3,"Button", + BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,159,25,46,44 + CONTROL "derecha/abajo arriba",IDC_ICON_ALIGN_4,"Button", + BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,7,73,46,44 + CONTROL "izquierda/abajo derecha",IDC_ICON_ALIGN_5,"Button", + BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,57,73,46,44 + CONTROL "derecha/abajo izquierda",IDC_ICON_ALIGN_6,"Button", + BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,110,73,46,44 + CONTROL "derecha/abajo",IDC_ICON_ALIGN_7,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,159,73,46,44 + CONTROL "borde inferior",IDC_ICON_ALIGN_8,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,7,121,46,44 + CONTROL "borde H/V",IDC_ICON_ALIGN_9,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,57,121,46,44 + CONTROL "aproximado",IDC_ICON_ALIGN_10,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,110,121,46,44 + CONTROL "",IDC_ICON_ALIGN_11,"Button",BS_OWNERDRAW | BS_BOTTOM | + WS_TABSTOP,159,121,46,44 + CONTROL "Mostrar &Version",ID_DESKTOP_VERSION,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,177,91,10 +END + +IDD_DESKBAR_TASKBAR DIALOG DISCARDABLE 0, 0, 210, 194 +STYLE WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Propiedades de la Barra de Tareas" +FONT 8, "MS Sans Serif" +BEGIN + CONTROL "Mostrar &Reloj",ID_SHOW_CLOCK,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,152,56,10 + CONTROL "&Ocultar iconos de notificacion inactivos", + ID_HIDE_INACTIVE_ICONS,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,174,136,10 + PUSHBUTTON "&Notificaciones...",ID_CONFIG_NOTIFYAREA,145,173,64,14 +END + +IDD_DESKBAR_STARTMENU DIALOG DISCARDABLE 0, 0, 210, 194 +STYLE WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Propiedades del Menú Inicio" +FONT 8, "MS Sans Serif" +BEGIN +END + +IDD_NOTIFYAREA DIALOGEX 0, 0, 208, 174 +STYLE WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | + WS_SYSMENU | WS_THICKFRAME +EXSTYLE WS_EX_APPWINDOW +CAPTION "Configurar Iconos de Notificaciones" +FONT 8, "MS Sans Serif", 0, 0, 0x1 +BEGIN + CONTROL "Tree1",IDC_NOTIFY_ICONS,"SysTreeView32",TVS_HASLINES | + TVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,7,7,194,31 + LTEXT "&Texto de Info:",IDC_LABEL1,8,44,51,8 + EDITTEXT IDC_NOTIFY_TOOLTIP,82,42,117,14,ES_AUTOHSCROLL + LTEXT "Título de la V&entana:",IDC_LABEL2,8,63,70,8 + EDITTEXT IDC_NOTIFY_TITLE,82,60,117,14,ES_AUTOHSCROLL + LTEXT "&Parche del Módulo:",IDC_LABEL3,8,81,65,8 + EDITTEXT IDC_NOTIFY_MODULE,82,78,117,14,ES_AUTOHSCROLL + GROUPBOX "Modo de &Display",IDC_LABEL4,7,96,157,28 + CONTROL "&Mostrar",IDC_NOTIFY_SHOW,"Button",BS_AUTORADIOBUTTON | + WS_TABSTOP,15,108,38,10 + CONTROL "&Ocultar",IDC_NOTIFY_HIDE,"Button",BS_AUTORADIOBUTTON, + 66,108,36,10 + CONTROL "A&utoocultar",IDC_NOTIFY_AUTOHIDE,"Button", + BS_AUTORADIOBUTTON,112,108,50,10 + ICON "",IDC_PICTURE,173,101,21,20 + LTEXT "Último cambio:",IDC_LABEL6,7,132,50,8 + EDITTEXT IDC_LAST_CHANGE,59,129,105,14,ES_AUTOHSCROLL | + ES_READONLY + CONTROL "Mostrar Ocu<os",ID_SHOW_HIDDEN_ICONS,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,154,64,10 + DEFPUSHBUTTON "&Aceptar",IDOK,91,153,50,14,WS_GROUP + PUSHBUTTON "&Cancelar",IDCANCEL,151,153,50,14 +END + +IDD_MDI_SDI DIALOGEX 0, 0, 194, 157 +STYLE WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +EXSTYLE WS_EX_APPWINDOW +CAPTION "Elegir modo MDI / SDI" +FONT 8, "MS Sans Serif", 0, 0, 0x1 +BEGIN + LTEXT "Por favor, seleccione su interfaz de usuario preferida para el explorador:", + IDC_STATIC,7,7,170,18 + CONTROL "&MDI (Multiple Document Interface)",IDC_MDI,"Button", + BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,7,31,123,10 + CONTROL "&SDI (Single Document Interface)",IDC_SDI,"Button", + BS_AUTORADIOBUTTON,7,62,116,10 + CONTROL 170,IDC_STATIC,"Static",SS_BITMAP,145,23,15,13 + CONTROL 171,IDC_STATIC,"Static",SS_BITMAP,145,57,15,13 + CONTROL "Open Subfolders in s&eparate windows", + IDC_SEPARATE_SUBFOLDERS,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,90,135,10 + LTEXT "Esta configuración se usará por defecto y apartir de ahora para todas las ventanas del explorador.", + IDC_STATIC,7,111,174,22 + DEFPUSHBUTTON "&Aceptar",IDOK,29,136,50,14,WS_GROUP + PUSHBUTTON "&Cancelar",IDCANCEL,106,136,50,14 +END + + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE MOVEABLE PURE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE MOVEABLE PURE +BEGIN + "#include \r\n" + "\0" +END + +3 TEXTINCLUDE MOVEABLE PURE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE DISCARDABLE +BEGIN + IDS_TITLE "ReactOS Explorer" + IDS_START "Iniciar" + IDS_LOGOFF "Salir..." + IDS_SHUTDOWN "Apagar..." + IDS_LAUNCH "Ejecutar..." + IDS_START_HELP "Ayuda" + IDS_SEARCH_FILES "Buscar..." + IDS_DOCUMENTS "Documentos" + IDS_FAVORITES "Favoritos" + IDS_PROGRAMS "Programas" + IDS_SETTINGS "Configuración" + IDS_EXPLORE "Explorar" + IDS_EMPTY "(Vacío)" + IDS_RECENT "Documentos Recientes" + IDS_ADMIN "Administracion" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_STARTMENU "Menú Inicio" + IDS_MINIMIZE_ALL "mimimizar todas las ventanas" + IDS_DESKTOP_NUM "Escritorio %d" + IDS_VOLUME "Volumen" + IDS_ITEMS_CUR "Objetos Actuales" + IDS_ITEMS_CONFIGURED "configuración" + IDS_ITEMS_VISIBLE "visible" + IDS_ITEMS_HIDDEN "oculto" + IDS_NOTIFY_SHOW "mostrar" + IDS_NOTIFY_HIDE "ocultar" + IDS_NOTIFY_AUTOHIDE "autoocultar" + IDS_SHOW_HIDDEN_ICONS "Mostrar iconos ocultos" + IDS_HIDE_ICONS "Ocultar iconos" + IDS_TERMINATE "Finalizar ROS Explorer" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_NETWORK "Red" + IDS_CONNECTIONS "Conexiones de Red" + IDS_DRIVES "Unidades" + IDS_SEARCH_COMPUTER "Buscar PC..." + IDS_SETTINGS_MENU "Menús de Configuración" + IDS_CONTROL_PANEL "Panel de Control" + IDS_PRINTERS "Impresoras" + IDS_BROWSE "Explorar Archivos" + IDS_SEARCH_PRG "Buscar Programas..." + IDS_ALL_USERS "Todos los Usuarios\\" + IDS_SEARCH "Buscar" + IDS_ABOUT_EXPLORER "&Acerca de Explorer..." + IDS_LAUNCH_MANY_PROGRAMS + "Ha seleccionado más de un programa.\n¿Está seguro de que desea ejecutarlos todos?" + IDS_DESKTOPBAR_SETTINGS "Configuracion del Escritorio" + IDS_DESKTOP "Escritorio" + IDS_TASKBAR "Barra de Tareas" +END + +#endif // Spanish (Castilian) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/reactos/base/shell/explorer/explorer-fr.rc b/reactos/base/shell/explorer/explorer-fr.rc new file mode 100644 index 00000000000..4ef5f3e5394 --- /dev/null +++ b/reactos/base/shell/explorer/explorer-fr.rc @@ -0,0 +1,416 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "resource.h" +#define APSTUDIO_HIDDEN_SYMBOLS +#include "windows.h" +#undef APSTUDIO_HIDDEN_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// German (Germany) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DEU) +#ifdef _WIN32 +LANGUAGE LANG_GERMAN, SUBLANG_GERMAN +#pragma code_page(1252) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "#include ""resource.h""\r\n" + "#define APSTUDIO_HIDDEN_SYMBOLS\r\n" + "#include ""windows.h""\r\n" + "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n" + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + +#endif // German (Germany) resources +///////////////////////////////////////////////////////////////////////////// + + +///////////////////////////////////////////////////////////////////////////// +// French (France) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_FRA) +#ifdef _WIN32 +LANGUAGE LANG_FRENCH, SUBLANG_FRENCH +#pragma code_page(1252) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Menu +// + +IDM_MDIFRAME MENU DISCARDABLE +BEGIN + POPUP "&Fichier" + BEGIN + MENUITEM "E&xécuter...", ID_EXECUTE + MENUITEM SEPARATOR + MENUITEM "&Fermer", ID_FILE_EXIT + END + POPUP "&Affichage" + BEGIN + MENUITEM "Barre d'&outils", ID_VIEW_TOOL_BAR + MENUITEM "&Extra Bar", ID_VIEW_EXTRA_BAR + MENUITEM "&Barre des lecteurs", ID_VIEW_DRIVE_BAR, CHECKED + MENUITEM "S&ide Bar", ID_VIEW_SIDE_BAR + MENUITEM "Barre d'&état", ID_VIEW_STATUSBAR + MENUITEM SEPARATOR + MENUITEM "A&ctualiser\tF5", ID_REFRESH + MENUITEM "&Plein écran\tCtrl+Shift+S", ID_VIEW_FULLSCREEN + MENUITEM "SDI", ID_VIEW_SDI + END + POPUP "&Fenêtre" + BEGIN + MENUITEM "Nouvelle &fenêtre", ID_WINDOW_NEW + MENUITEM "Cascade\tShift+F5", ID_WINDOW_CASCADE + MENUITEM "Mosaïque &horizontale", ID_WINDOW_TILE_HORZ + MENUITEM "Mosaïque &verticale\tCtrl+Shift+S", ID_WINDOW_TILE_VERT + MENUITEM "Organisation automatique", ID_WINDOW_AUTOSORT + MENUITEM "&Organisation des symboles", ID_WINDOW_ARRANGE + END + POPUP "&Outils" + BEGIN + MENUITEM "&Options", ID_TOOLS_OPTIONS + END + POPUP "&Aide" + BEGIN + MENUITEM "&FAQ de l'explorateur...", ID_EXPLORER_FAQ + MENUITEM "&A propos de l'explorateur...", ID_ABOUT_EXPLORER + MENUITEM "A propos de l'&OS...", ID_ABOUT_WINDOWS + END +END + +IDM_DESKTOPBAR MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Paramètres...", ID_DESKTOPBAR_SETTINGS + MENUITEM "&Gestionnaire de tâches...", ID_TASKMGR + MENUITEM SEPARATOR + MENUITEM "&A propos de l'explorateur...", ID_ABOUT_EXPLORER + END +END + +IDM_VOLUME MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "Ouvrir le contrôle du volume", ID_TRAY_VOLUME + MENUITEM "Ajuster les propriétés audio", ID_VOLUME_PROPERTIES + END +END + +IDM_NOTIFYAREA MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Afficher les icônes cachés", ID_SHOW_HIDDEN_ICONS + MENUITEM "Afficher l'icône &Boutton", ID_SHOW_ICON_BUTTON + MENUITEM "&Configurer les Notifications...", ID_CONFIG_NOTIFYAREA + MENUITEM "Ajuster Date/&Heure...", ID_CONFIG_TIME + MENUITEM SEPARATOR + MENUITEM "&A propos de l'explorateur...", ID_ABOUT_EXPLORER + END +END + +IDM_SDIFRAME MENU DISCARDABLE +BEGIN + POPUP "&Fichier" + BEGIN + MENUITEM "&Exécuter...", ID_EXECUTE + MENUITEM SEPARATOR + MENUITEM "&Fermer", ID_FILE_EXIT + END + POPUP "&Affichage" + BEGIN + MENUITEM "&Barre d'outils", ID_VIEW_TOOL_BAR + MENUITEM "S&ide Bar", ID_VIEW_SIDE_BAR, GRAYED + MENUITEM "&Barre d'état", ID_VIEW_STATUSBAR + MENUITEM SEPARATOR + MENUITEM "A&ctualiser\tF5", ID_REFRESH + MENUITEM "&Plein écran\tCtrl+Shift+S", ID_VIEW_FULLSCREEN + MENUITEM "&MDI", ID_VIEW_MDI + END + POPUP "&Outils" + BEGIN + MENUITEM "&Options", ID_TOOLS_OPTIONS + END + POPUP "&Aide" + BEGIN + MENUITEM "&FAQ de l'explorateur...", ID_EXPLORER_FAQ + MENUITEM "&A propos de l'explorateur...", ID_ABOUT_EXPLORER + MENUITEM "A propos de l'&OS...", ID_ABOUT_WINDOWS + END +END + + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_EXECUTE DIALOG DISCARDABLE 15, 13, 210, 63 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Exécuter" +FONT 8, "MS Shell Dlg" +BEGIN + CONTROL "",101,"Static",SS_SIMPLE | SS_NOPREFIX,3,6,150,10 + CONTROL "&Commande:",-1,"Static",SS_LEFTNOWORDWRAP | WS_GROUP,3, + 18,60,10 + EDITTEXT 201,3,29,134,12,ES_AUTOHSCROLL + CONTROL "Comme &Symbole",214,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,3,45,71,12 + DEFPUSHBUTTON "&OK",1,158,6,47,14 + PUSHBUTTON "&Annuler",2,158,23,47,14 + PUSHBUTTON "&Aide",254,158,43,47,14 +END + +IDD_SEARCH_PROGRAM DIALOGEX 0, 0, 200, 65 +STYLE WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | + WS_SYSMENU | WS_THICKFRAME +EXSTYLE WS_EX_APPWINDOW +CAPTION "Rechercher un programme dans le menu démarrer" +FONT 8, "MS Sans Serif", 0, 0, 0x1 +BEGIN + LTEXT "&Filtre:",IDC_STATIC,7,9,18,8 + EDITTEXT IDC_FILTER,34,7,100,14,ES_AUTOHSCROLL + CONTROL "List1",IDC_PROGRAMS_FOUND,"SysListView32",LVS_REPORT | + LVS_SHOWSELALWAYS | LVS_SORTASCENDING | WS_BORDER | + WS_TABSTOP,7,25,186,33 + PUSHBUTTON "&Vérifier les entrées",IDC_CHECK_ENTRIES,143,7,50,14 +END + +IDD_DESKBAR_DESKTOP DIALOG DISCARDABLE 0, 0, 212, 194 +STYLE WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Propriétés du bureau" +FONT 8, "MS Sans Serif" +BEGIN + LTEXT "Please select your prefered icon alignment algorithm:", + IDC_STATIC,7,7,166,8 + CONTROL "gauche/haut descend",IDC_ICON_ALIGN_0,"Button", + BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,7,25,46,44 + CONTROL "gauche/haut droite",IDC_ICON_ALIGN_1,"Button", + BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,57,25,46,44 + CONTROL "droite/haut left",IDC_ICON_ALIGN_2,"Button", + BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,110,25,46,44 + CONTROL "droite/haut descend",IDC_ICON_ALIGN_3,"Button", + BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,159,25,46,44 + CONTROL "gauche/fond monte",IDC_ICON_ALIGN_4,"Button", + BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,7,73,46,44 + CONTROL "gauche/fond right",IDC_ICON_ALIGN_5,"Button", + BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,57,73,46,44 + CONTROL "droite/fond gauche",IDC_ICON_ALIGN_6,"Button", + BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,110,73,46,44 + CONTROL "rdroite/fond. descend",IDC_ICON_ALIGN_7,"Button", + BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,159,73,46,44 + CONTROL "bord descend",IDC_ICON_ALIGN_8,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,7,121,46,44 + CONTROL "bord H/V",IDC_ICON_ALIGN_9,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,57,121,46,44 + CONTROL "faire le tour",IDC_ICON_ALIGN_10,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,110,121,46,44 + CONTROL "",IDC_ICON_ALIGN_11,"Button",BS_OWNERDRAW | BS_BOTTOM | + WS_TABSTOP,159,121,46,44 + CONTROL "Afficher le numéro de la &version",ID_DESKTOP_VERSION, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,177,91,10 +END + +IDD_DESKBAR_TASKBAR DIALOG DISCARDABLE 0, 0, 210, 194 +STYLE WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Propriétés de la barre de tâches" +FONT 8, "MS Sans Serif" +BEGIN + CONTROL "afficher l'&heure",ID_SHOW_CLOCK,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,152,52,10 + CONTROL "&masquer les icônes inactives",ID_HIDE_INACTIVE_ICONS, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,174,111,10 + PUSHBUTTON "&Notifications...",ID_CONFIG_NOTIFYAREA,153,173,50,14 +END + +IDD_DESKBAR_STARTMENU DIALOG DISCARDABLE 0, 0, 210, 194 +STYLE WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Propriétés du menu démarrer" +FONT 8, "MS Sans Serif" +BEGIN +END + +IDD_NOTIFYAREA DIALOGEX 0, 0, 208, 174 +STYLE WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | + WS_SYSMENU | WS_THICKFRAME +EXSTYLE WS_EX_APPWINDOW +CAPTION "Configurer Icônes de Notification" +FONT 8, "MS Sans Serif", 0, 0, 0x1 +BEGIN + CONTROL "Tree1",IDC_NOTIFY_ICONS,"SysTreeView32",TVS_HASLINES | + TVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,7,7,194,31 + LTEXT "&Texte conseil:",IDC_LABEL1,7,44,40,8 + EDITTEXT IDC_NOTIFY_TOOLTIP,58,42,143,14,ES_AUTOHSCROLL + LTEXT "Titre de la &fenêtre:",IDC_LABEL2,7,63,44,8 + EDITTEXT IDC_NOTIFY_TITLE,58,60,143,14,ES_AUTOHSCROLL + LTEXT "&Repertoire du module:",IDC_LABEL3,7,81,43,8 + EDITTEXT IDC_NOTIFY_MODULE,58,78,143,14,ES_AUTOHSCROLL + GROUPBOX "&Mode d'affichage",IDC_LABEL4,7,96,157,28 + CONTROL "&afficher",IDC_NOTIFY_SHOW,"Button",BS_AUTORADIOBUTTON | + WS_TABSTOP,15,108,33,10 + CONTROL "&cacher",IDC_NOTIFY_HIDE,"Button",BS_AUTORADIOBUTTON,66, + 108,29,10 + CONTROL "&cacher automatiquement",IDC_NOTIFY_AUTOHIDE,"Button", + BS_AUTORADIOBUTTON,112,108,43,10 + ICON "",IDC_PICTURE,173,101,21,20 + LTEXT "&Dernier changement:",IDC_LABEL6,7,132,43,8 + EDITTEXT IDC_LAST_CHANGE,59,129,105,14,ES_AUTOHSCROLL | + ES_READONLY + CONTROL "afficher les cac&hés",ID_SHOW_HIDDEN_ICONS,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,154,56,10 + DEFPUSHBUTTON "&OK",IDOK,91,153,50,14,WS_GROUP + PUSHBUTTON "&Annuler",IDCANCEL,151,153,50,14 +END + +IDD_MDI_SDI DIALOGEX 0, 0, 194, 157 +STYLE WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +EXSTYLE WS_EX_APPWINDOW +CAPTION "Veuillez choisir un mode de fenêtres pour explorateur" +FONT 8, "MS Sans Serif", 0, 0, 0x1 +BEGIN + LTEXT "Veuillez sélectionner l'interface que vous préférez pour l'explorateur:", + IDC_STATIC,7,7,160,8 + CONTROL "&MDI (Multiple Document Interface)",IDC_MDI,"Button", + BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,7,31,124,10 + CONTROL "&SDI (Single Document Interface)",IDC_SDI,"Button", + BS_AUTORADIOBUTTON,7,62,118,10 + CONTROL 170,IDC_STATIC,"Static",SS_BITMAP,145,23,15,13 + CONTROL 171,IDC_STATIC,"Static",SS_BITMAP,145,57,15,13 + CONTROL "Ouvrir les sous-dossiers dans des fenêtres s&éparrées", + IDC_SEPARATE_SUBFOLDERS,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,90,135,10 + LTEXT "Ce paramètre sera utilisé par défaut.",IDC_STATIC,7,111, + 174,22 + DEFPUSHBUTTON "&OK",IDOK,29,136,50,14,WS_GROUP + PUSHBUTTON "&Annuler",IDCANCEL,106,136,50,14 +END + +IDD_ABOUT_EXPLORER DIALOG DISCARDABLE 0, 0, 199, 106 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "A propos de ReactOS Explorer" +FONT 10, "MS Sans Serif" +BEGIN + LTEXT "ReactOS Explorer",IDC_ROS_EXPLORER,91,13,104,11 + LTEXT "V 0.9",IDC_VERSION_TXT,91,27,104,8 + LTEXT "(c) 2003-2005 Martin Fuchs",IDC_STATIC,91,42,104,8 + LTEXT "",IDC_WIN_VERSION,91,58,98,22 + LTEXT "http://www.sky.franken.de/explorer/",IDC_WWW,17,84,129, + 8 + CONTROL "&OK",IDOK,"Button",BS_OWNERDRAW | BS_FLAT | WS_GROUP, + 154,90,38,12 +END + + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE DISCARDABLE +BEGIN + IDS_TITLE "Reactos Explorer" + IDS_START "Démarrer" + IDS_LOGOFF "Se déconnecter..." + IDS_SHUTDOWN "Arrêter..." + IDS_LAUNCH "Exécuter..." + IDS_START_HELP "Aide" + IDS_SEARCH_FILES "Rechercher..." + IDS_DOCUMENTS "Documents" + IDS_FAVORITES "Favoris" + IDS_PROGRAMS "Programmes" + IDS_SETTINGS "Paramètres" + IDS_EXPLORE "Explorer" + IDS_EMPTY "(Vide)" + IDS_RECENT "Documents récents" + IDS_ADMIN "Administration" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_STARTMENU "Menu démarrer" + IDS_MINIMIZE_ALL "mimimiser toutes les fenêtres" + IDS_DESKTOP_NUM "Bureau %d" + IDS_VOLUME "Volume" + IDS_ITEMS_CUR "abjets actuels" + IDS_ITEMS_CONFIGURED "configuration" + IDS_ITEMS_VISIBLE "visible" + IDS_ITEMS_HIDDEN "caché" + IDS_NOTIFY_SHOW "afficher" + IDS_NOTIFY_HIDE "cacher" + IDS_NOTIFY_AUTOHIDE "cacher automatiquement" + IDS_SHOW_HIDDEN_ICONS "Afficher les icones cachés" + IDS_HIDE_ICONS "Cacher les icones" + IDS_TERMINATE "Fermer ROS Explorer" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_NETWORK "Réseaux" + IDS_CONNECTIONS "Connections Réseaux" + IDS_DRIVES "Drives" + IDS_SEARCH_COMPUTER "Rechercher un ordinateur..." + IDS_SETTINGS_MENU "Paramètres du menu" + IDS_CONTROL_PANEL "Panneau de configuration" + IDS_PRINTERS "Imprimantes" + IDS_BROWSE "Parcourir" + IDS_SEARCH_PRG "Rechercher un programme..." + IDS_ALL_USERS "Tous les utilisateurs\\" + IDS_SEARCH "Rechercher" + IDS_ABOUT_EXPLORER "&A propos de l'explorateur..." + IDS_LAUNCH_MANY_PROGRAMS + "Vous avez selectionné plus d'un programme.\nEtes vous sur de vouloir tous les lancer?" + IDS_DESKTOPBAR_SETTINGS "Paramètres du bureau" + IDS_DESKTOP "Bureau" + IDS_TASKBAR "Barre de tâches" +END + +#endif // French (France) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/reactos/base/shell/explorer/explorer-hu.rc b/reactos/base/shell/explorer/explorer-hu.rc new file mode 100644 index 00000000000..74eefb96757 --- /dev/null +++ b/reactos/base/shell/explorer/explorer-hu.rc @@ -0,0 +1,399 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// Hungarian (unknown sub-lang: 0x0) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_HUN) +#ifdef _WIN32 +LANGUAGE LANG_HUNGARIAN, 0x0 +#pragma code_page(1250) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Menu +// + +IDM_MDIFRAME MENU DISCARDABLE +BEGIN + POPUP "&File" + BEGIN + MENUITEM "&Futtatás...", ID_EXECUTE + MENUITEM SEPARATOR + MENUITEM "&Kilépés", ID_FILE_EXIT + END + POPUP "&Nézet" + BEGIN + MENUITEM "&Eszköztár", ID_VIEW_TOOL_BAR + MENUITEM "&Extra Bar", ID_VIEW_EXTRA_BAR + MENUITEM "&Drivebar", ID_VIEW_DRIVE_BAR, CHECKED + MENUITEM "S&ide Bar", ID_VIEW_SIDE_BAR + MENUITEM "&Állapot sor", ID_VIEW_STATUSBAR + MENUITEM SEPARATOR + MENUITEM "&Frissít\tF5", ID_REFRESH + MENUITEM "T&eljes képernyõ\tCtrl+Shift+S", ID_VIEW_FULLSCREEN + MENUITEM "SDI", ID_VIEW_SDI + END + POPUP "&Ablak" + BEGIN + MENUITEM "Új &Ablak", ID_WINDOW_NEW + MENUITEM "Lépcsõzetes\tShift+F5", ID_WINDOW_CASCADE + MENUITEM "Tile &Horizontally", ID_WINDOW_TILE_HORZ + MENUITEM "Tile &Vertically\tShift+F4", ID_WINDOW_TILE_VERT + MENUITEM "Arrange Automatically", ID_WINDOW_AUTOSORT + MENUITEM "Arrange &Symbols", ID_WINDOW_ARRANGE + END + POPUP "&Eszközök" + BEGIN + MENUITEM "&Beállítások", ID_TOOLS_OPTIONS + END + POPUP "&Súgóó" + BEGIN + MENUITEM "Explorer &GYIK...", ID_EXPLORER_FAQ + MENUITEM "Explorer &névjegye...", ID_ABOUT_EXPLORER + MENUITEM "Az &OS névjegye...", ID_ABOUT_WINDOWS + END +END + +IDM_DESKTOPBAR MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Beállítások...", ID_DESKTOPBAR_SETTINGS + MENUITEM "&Feladatkezelõ...", ID_TASKMGR + MENUITEM SEPARATOR + MENUITEM "&Explorer névjegye...", ID_ABOUT_EXPLORER + END +END + +IDM_VOLUME MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "Hangerõ beállítások", ID_TRAY_VOLUME + MENUITEM "Hangrendszer tulajdonságai", ID_VOLUME_PROPERTIES + END +END + +IDM_NOTIFYAREA MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Rejtett ikonok megjelenítése", ID_SHOW_HIDDEN_ICONS + MENUITEM "Show Icon &Button", ID_SHOW_ICON_BUTTON + MENUITEM "&Configure Notifications...", ID_CONFIG_NOTIFYAREA + MENUITEM "Dátum és idõ beállításai...", ID_CONFIG_TIME + MENUITEM SEPARATOR + MENUITEM "&Explorer névjegye...", ID_ABOUT_EXPLORER + END +END + +IDM_SDIFRAME MENU DISCARDABLE +BEGIN + POPUP "&File" + BEGIN + MENUITEM "&Futtatás...", ID_EXECUTE + MENUITEM SEPARATOR + MENUITEM "&Bezárás", ID_FILE_EXIT + END + POPUP "&Nézet" + BEGIN + MENUITEM "&Eszköztár", ID_VIEW_TOOL_BAR + MENUITEM "S&ide Bar", ID_VIEW_SIDE_BAR, GRAYED + MENUITEM "&Állapot sor", ID_VIEW_STATUSBAR + MENUITEM SEPARATOR + MENUITEM "&Frissítés\tF5", ID_REFRESH + MENUITEM "T&eljes képernyõ\tCtrl+Shift+S", ID_VIEW_FULLSCREEN + MENUITEM "&MDI", ID_VIEW_MDI + END + POPUP "&Eszközök" + BEGIN + MENUITEM "&Beállítások", ID_TOOLS_OPTIONS + END + POPUP "&Súgóó" + BEGIN + MENUITEM "Explorer &GYIK...", ID_EXPLORER_FAQ + MENUITEM "&Az Explorer névjegye...", ID_ABOUT_EXPLORER + MENUITEM "Az &OS névjegye...", ID_ABOUT_WINDOWS + END +END + + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_EXECUTE DIALOG DISCARDABLE 15, 13, 210, 63 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Futtatás" +FONT 8, "MS Shell Dlg" +BEGIN + CONTROL "",101,"Static",SS_SIMPLE | SS_NOPREFIX,3,6,150,10 + CONTROL "&Parancs:",-1,"Static",SS_LEFTNOWORDWRAP | WS_GROUP,3, + 18,60,10 + EDITTEXT 201,3,29,134,12,ES_AUTOHSCROLL + CONTROL "As &Symbol",214,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,3, + 45,71,12 + DEFPUSHBUTTON "&OK",1,158,6,47,14 + PUSHBUTTON "&Mégse",2,158,23,47,14 + PUSHBUTTON "&Súgó",254,158,43,47,14 +END + +IDD_SEARCH_PROGRAM DIALOGEX 0, 0, 200, 65 +STYLE WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | + WS_SYSMENU | WS_THICKFRAME +EXSTYLE WS_EX_APPWINDOW +CAPTION "Search Program in Startmenu" +FONT 8, "MS Sans Serif", 0, 0, 0x1 +BEGIN + LTEXT "&Filter:",IDC_STATIC,7,9,18,8 + EDITTEXT IDC_FILTER,34,7,100,14,ES_AUTOHSCROLL + CONTROL "List1",IDC_PROGRAMS_FOUND,"SysListView32",LVS_REPORT | + LVS_SHOWSELALWAYS | LVS_SORTASCENDING | WS_BORDER | + WS_TABSTOP,7,25,186,33 + PUSHBUTTON "&Check Entries",IDC_CHECK_ENTRIES,143,7,50,14 +END + +IDD_DESKBAR_DESKTOP DIALOG DISCARDABLE 0, 0, 212, 194 +STYLE WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Asztal beállításai" +FONT 8, "MS Sans Serif" +BEGIN + LTEXT "Please select your prefered icon alignment algorithm:", + IDC_STATIC,7,7,166,8 + CONTROL "left/top dwn",IDC_ICON_ALIGN_0,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,7,25,46,44 + CONTROL "left/top right",IDC_ICON_ALIGN_1,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,57,25,46,44 + CONTROL "right/top left",IDC_ICON_ALIGN_2,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,110,25,46,44 + CONTROL "rig./top dwn",IDC_ICON_ALIGN_3,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,159,25,46,44 + CONTROL "left/bot. up",IDC_ICON_ALIGN_4,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,7,73,46,44 + CONTROL "left/bot. right",IDC_ICON_ALIGN_5,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,57,73,46,44 + CONTROL "right/bot. left",IDC_ICON_ALIGN_6,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,110,73,46,44 + CONTROL "rig./bot. dwn",IDC_ICON_ALIGN_7,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,159,73,46,44 + CONTROL "border down",IDC_ICON_ALIGN_8,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,7,121,46,44 + CONTROL "border H/V",IDC_ICON_ALIGN_9,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,57,121,46,44 + CONTROL "round about",IDC_ICON_ALIGN_10,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,110,121,46,44 + CONTROL "",IDC_ICON_ALIGN_11,"Button",BS_OWNERDRAW | BS_BOTTOM | + WS_TABSTOP,159,121,46,44 + CONTROL "Display &Version Number",ID_DESKTOP_VERSION,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,177,91,10 +END + +IDD_DESKBAR_TASKBAR DIALOG DISCARDABLE 0, 0, 210, 194 +STYLE WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Taskbar Properties" +FONT 8, "MS Sans Serif" +BEGIN + CONTROL "show &clock",ID_SHOW_CLOCK,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,152,52,10 + CONTROL "&hide inactive notification icons", + ID_HIDE_INACTIVE_ICONS,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,174,111,10 + PUSHBUTTON "&Notifications...",ID_CONFIG_NOTIFYAREA,153,173,50,14 +END + +IDD_DESKBAR_STARTMENU DIALOG DISCARDABLE 0, 0, 210, 194 +STYLE WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Startmenu Properties" +FONT 8, "MS Sans Serif" +BEGIN +END + +IDD_NOTIFYAREA DIALOGEX 0, 0, 208, 174 +STYLE WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | + WS_SYSMENU | WS_THICKFRAME +EXSTYLE WS_EX_APPWINDOW +CAPTION "Configure Notification Icons" +FONT 8, "MS Sans Serif", 0, 0, 0x1 +BEGIN + CONTROL "Tree1",IDC_NOTIFY_ICONS,"SysTreeView32",TVS_HASLINES | + TVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,7,7,194,31 + LTEXT "&Tooltip Text:",IDC_LABEL1,7,44,40,8 + EDITTEXT IDC_NOTIFY_TOOLTIP,58,42,143,14,ES_AUTOHSCROLL + LTEXT "W&indow Title:",IDC_LABEL2,7,63,44,8 + EDITTEXT IDC_NOTIFY_TITLE,58,60,143,14,ES_AUTOHSCROLL + LTEXT "&Module Path:",IDC_LABEL3,7,81,43,8 + EDITTEXT IDC_NOTIFY_MODULE,58,78,143,14,ES_AUTOHSCROLL + GROUPBOX "&Display Mode",IDC_LABEL4,7,96,157,28 + CONTROL "&show",IDC_NOTIFY_SHOW,"Button",BS_AUTORADIOBUTTON | + WS_TABSTOP,15,108,33,10 + CONTROL "&hide",IDC_NOTIFY_HIDE,"Button",BS_AUTORADIOBUTTON,66, + 108,29,10 + CONTROL "a&utohide",IDC_NOTIFY_AUTOHIDE,"Button", + BS_AUTORADIOBUTTON,112,108,43,10 + ICON "",IDC_PICTURE,173,101,21,20 + LTEXT "&Last Change:",IDC_LABEL6,7,132,43,8 + EDITTEXT IDC_LAST_CHANGE,59,129,105,14,ES_AUTOHSCROLL | + ES_READONLY + CONTROL "sho&w hidden",ID_SHOW_HIDDEN_ICONS,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,154,56,10 + DEFPUSHBUTTON "&OK",IDOK,91,153,50,14,WS_GROUP + PUSHBUTTON "&Mégse",IDCANCEL,151,153,50,14 +END + +IDD_MDI_SDI DIALOGEX 0, 0, 194, 157 +STYLE WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +EXSTYLE WS_EX_APPWINDOW +CAPTION "Choose Explorer window mode" +FONT 8, "MS Sans Serif", 0, 0, 0x1 +BEGIN + LTEXT "Please select your prefered explorer user interface:", + IDC_STATIC,7,7,160,8 + CONTROL "&MDI (Multiple Document Interface)",IDC_MDI,"Button", + BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,7,31,124,10 + CONTROL "&SDI (Single Document Interface)",IDC_SDI,"Button", + BS_AUTORADIOBUTTON,7,62,118,10 + CONTROL 170,IDC_STATIC,"Static",SS_BITMAP,145,23,15,13 + CONTROL 171,IDC_STATIC,"Static",SS_BITMAP,145,57,15,13 + CONTROL "Open Subfolders in s&eparate windows", + IDC_SEPARATE_SUBFOLDERS,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,90,135,10 + LTEXT "This setting will be used as default for all explorer windows in the future.", + IDC_STATIC,7,111,174,22 + DEFPUSHBUTTON "&OK",IDOK,29,136,50,14,WS_GROUP + PUSHBUTTON "&Mégse",IDCANCEL,106,136,50,14 +END + +IDD_ABOUT_EXPLORER DIALOG DISCARDABLE 0, 0, 199, 106 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "About ReactOS Explorer" +FONT 10, "MS Sans Serif" +BEGIN + LTEXT "ReactOS Explorer",IDC_ROS_EXPLORER,91,13,104,11 + LTEXT "V 0.9",IDC_VERSION_TXT,91,27,104,8 + LTEXT "(c) 2003-2005 Martin Fuchs",IDC_STATIC,91,42,104,8 + LTEXT "",IDC_WIN_VERSION,91,58,98,22 + LTEXT "http://www.sky.franken.de/explorer/",IDC_WWW,17,84,129, + 8 + CONTROL "&OK",IDOK,"Button",BS_OWNERDRAW | BS_FLAT | WS_GROUP, + 154,90,38,12 +END + + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE MOVEABLE PURE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE MOVEABLE PURE +BEGIN + "#include \r\n" + "\0" +END + +3 TEXTINCLUDE MOVEABLE PURE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE DISCARDABLE +BEGIN + IDS_TITLE "Reactos Explorer" + IDS_START "Start" + IDS_LOGOFF "Kijelentkezés..." + IDS_SHUTDOWN "Kikapcsolás..." + IDS_LAUNCH "Futtatás..." + IDS_START_HELP "Súgó" + IDS_SEARCH_FILES "Keresés..." + IDS_DOCUMENTS "Dokumentumok" + IDS_FAVORITES "Kedvencek" + IDS_PROGRAMS "Programok" + IDS_SETTINGS "Beállítások" + IDS_EXPLORE "Böngészés" + IDS_EMPTY "(Üres)" + IDS_RECENT "Recent Documents" + IDS_ADMIN "Felügyelet" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_STARTMENU "Startmenu" + IDS_MINIMIZE_ALL "mimimize all windows" + IDS_DESKTOP_NUM "%d. asztal" + IDS_VOLUME "Hangerõ" + IDS_ITEMS_CUR "current items" + IDS_ITEMS_CONFIGURED "configuration" + IDS_ITEMS_VISIBLE "visible" + IDS_ITEMS_HIDDEN "Rejtett" + IDS_NOTIFY_SHOW "show" + IDS_NOTIFY_HIDE "hide" + IDS_NOTIFY_AUTOHIDE "autohide" + IDS_SHOW_HIDDEN_ICONS "Show hidden icons" + IDS_HIDE_ICONS "Hide icons" + IDS_TERMINATE "Kilépés a ROS Explorerbõl" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_NETWORK "Hálózat" + IDS_CONNECTIONS "Hálózati kapcsolatok" + IDS_DRIVES "Meghajtók" + IDS_SEARCH_COMPUTER "Számítógép keresése..." + IDS_SETTINGS_MENU "Settings Menu" + IDS_CONTROL_PANEL "Vezérlõpult" + IDS_PRINTERS "Nyomtatók" + IDS_BROWSE "Állományok böngészése" + IDS_SEARCH_PRG "Search Program..." + IDS_ALL_USERS "All Users\\" + IDS_SEARCH "Keresés" + IDS_ABOUT_EXPLORER "Az &Explorer névjegye..." + IDS_LAUNCH_MANY_PROGRAMS + "Több programot választottál ki.\nBiztosan szeretnéd mindegyiket futtatni?" + IDS_DESKTOPBAR_SETTINGS "Asztal beállításai" + IDS_DESKTOP "Asztal" + IDS_TASKBAR "Taskbar" +END + +#endif // Hungarian (unknown sub-lang: 0x0) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/reactos/base/shell/explorer/explorer-jp.rc b/reactos/base/shell/explorer/explorer-jp.rc new file mode 100644 index 00000000000..37a728dbac1 --- /dev/null +++ b/reactos/base/shell/explorer/explorer-jp.rc @@ -0,0 +1,399 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// Japanese resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_JPN) +#ifdef _WIN32 +LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT +#pragma code_page(932) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Menu +// + +IDM_MDIFRAME MENU DISCARDABLE +BEGIN + POPUP "ƒtƒ@ƒCƒ‹(&F)" + BEGIN + MENUITEM "ŽÀs(&E)...", ID_EXECUTE + MENUITEM SEPARATOR + MENUITEM "I—¹(&X)", ID_FILE_EXIT + END + POPUP "•\\Ž¦(&V)" + BEGIN + MENUITEM "ƒc[ƒ‹ ƒo[(&T)", ID_VIEW_TOOL_BAR + MENUITEM "ƒGƒLƒXƒgƒ‰ ƒo[(&E)", ID_VIEW_EXTRA_BAR + MENUITEM "ƒhƒ‰ƒCƒuƒo[(&D)", ID_VIEW_DRIVE_BAR, CHECKED + MENUITEM "ƒTƒCƒh ƒo[(&I)", ID_VIEW_SIDE_BAR + MENUITEM "ƒXƒe[ƒ^ƒX ƒo[(&S)", ID_VIEW_STATUSBAR + MENUITEM SEPARATOR + MENUITEM "ÅV‚Ìî•ñ‚ÉXV(&R)\tF5", ID_REFRESH + MENUITEM "‘S‰æ–Ê•\\Ž¦(&U)\tCtrl+Shift+S", ID_VIEW_FULLSCREEN + MENUITEM "SDI", ID_VIEW_SDI + END + POPUP "ƒEƒBƒ“ƒhƒE(&W)" + BEGIN + MENUITEM "V‚µ‚¢ƒEƒBƒ“ƒhƒE(&W)", ID_WINDOW_NEW + MENUITEM "d‚Ë‚Ä•\\Ž¦\tShift+F5", ID_WINDOW_CASCADE + MENUITEM "…•½‚É•À‚ׂĕ\\Ž¦(&H)", ID_WINDOW_TILE_HORZ + MENUITEM "‚’¼‚É•À‚ׂĕ\\Ž¦(&V)\tShift+F4", ID_WINDOW_TILE_VERT + MENUITEM "Ž©“®®—ñ", ID_WINDOW_AUTOSORT + MENUITEM "Ŭ‰»‚³‚ꂽŽqƒEƒBƒ“ƒhƒE‚ð®—ñ(&S)", ID_WINDOW_ARRANGE + END + POPUP "ƒc[ƒ‹(&T)" + BEGIN + MENUITEM "ƒIƒvƒVƒ‡ƒ“(&O)", ID_TOOLS_OPTIONS + END + POPUP "ƒwƒ‹ƒv(&H)" + BEGIN + MENUITEM "Explorer FAQ (&F)...", ID_EXPLORER_FAQ + MENUITEM "Explorer ‚ɂ‚¢‚Ä(&A)...", ID_ABOUT_EXPLORER + MENUITEM "OS ‚ɂ‚¢‚Ä(&O)...", ID_ABOUT_WINDOWS + END +END + +IDM_DESKTOPBAR MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "Ý’è(&S)...", ID_DESKTOPBAR_SETTINGS + MENUITEM "ƒ^ƒXƒN ƒ}ƒl[ƒWƒƒ(&T)...", ID_TASKMGR + MENUITEM SEPARATOR + MENUITEM "Explorer ‚ɂ‚¢‚Ä(&A)...", ID_ABOUT_EXPLORER + END +END + +IDM_VOLUME MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "ƒ{ƒŠƒ…[ƒ€ ƒRƒ“ƒgƒ[ƒ‹‚ðŠJ‚­", ID_TRAY_VOLUME + MENUITEM "ƒI[ƒfƒBƒI ƒvƒƒpƒeƒB‚Ì’²®", ID_VOLUME_PROPERTIES + END +END + +IDM_NOTIFYAREA MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "‰B‚³‚ꂽƒAƒCƒRƒ“‚ð•\\Ž¦‚·‚é(&S)", ID_SHOW_HIDDEN_ICONS + MENUITEM "ƒAƒCƒRƒ“ ƒ{ƒ^ƒ“‚ð•\\Ž¦‚·‚é(&B)", ID_SHOW_ICON_BUTTON + MENUITEM "’Ê’m‚̃JƒXƒ^ƒ}ƒCƒY(&C)...", ID_CONFIG_NOTIFYAREA + MENUITEM "“ú•t‚ÆŽž‚Ì’²®(&T)...", ID_CONFIG_TIME + MENUITEM SEPARATOR + MENUITEM "Explorer ‚ɂ‚¢‚Ä(&A)...", ID_ABOUT_EXPLORER + END +END + +IDM_SDIFRAME MENU DISCARDABLE +BEGIN + POPUP "ƒtƒ@ƒCƒ‹(&F)" + BEGIN + MENUITEM "ŽÀs(&E)...", ID_EXECUTE + MENUITEM SEPARATOR + MENUITEM "•Â‚¶‚é(&C)", ID_FILE_EXIT + END + POPUP "•\\Ž¦(&V)" + BEGIN + MENUITEM "ƒc[ƒ‹ ƒo[(&T)", ID_VIEW_TOOL_BAR + MENUITEM "ƒTƒCƒh ƒo[(&I)", ID_VIEW_SIDE_BAR, GRAYED + MENUITEM "ƒXƒe[ƒ^ƒX ƒo[(&S)", ID_VIEW_STATUSBAR + MENUITEM SEPARATOR + MENUITEM "ÅV‚Ìî•ñ‚ÉXV(&R)\tF5", ID_REFRESH + MENUITEM "‘S‰æ–Ê•\\Ž¦(&U)\tCtrl+Shift+S", ID_VIEW_FULLSCREEN + MENUITEM "MDI (&M)", ID_VIEW_MDI + END + POPUP "ƒc[ƒ‹(&T)" + BEGIN + MENUITEM "ƒIƒvƒVƒ‡ƒ“(&O)", ID_TOOLS_OPTIONS + END + POPUP "ƒwƒ‹ƒv(&H)" + BEGIN + MENUITEM "Explorer FAQ (&F)...", ID_EXPLORER_FAQ + MENUITEM "Explorer ‚ɂ‚¢‚Ä(&A)...", ID_ABOUT_EXPLORER + MENUITEM "OS ‚ɂ‚¢‚Ä(&O)...", ID_ABOUT_WINDOWS + END +END + + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_EXECUTE DIALOG DISCARDABLE 15, 13, 210, 63 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "ŽÀs" +FONT 9, "MS UI Gothic" +BEGIN + CONTROL "",101,"Static",SS_SIMPLE | SS_NOPREFIX,3,6,150,10 + CONTROL "ƒRƒ}ƒ“ƒh(&C):",-1,"Static",SS_LEFTNOWORDWRAP | WS_GROUP,3, + 18,60,10 + EDITTEXT 201,3,29,134,12,ES_AUTOHSCROLL + CONTROL "Ŭ‰»‚µ‚½ó‘Ô‚ÅŽÀs(&S)",214,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,3, + 45,71,12 + DEFPUSHBUTTON "OK (&O)",1,158,6,47,14 + PUSHBUTTON "ƒLƒƒƒ“ƒZƒ‹(&C)",2,158,23,47,14 + PUSHBUTTON "ƒwƒ‹ƒv(&H)",254,158,43,47,14 +END + +IDD_SEARCH_PROGRAM DIALOGEX 0, 0, 200, 65 +STYLE WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | + WS_SYSMENU | WS_THICKFRAME +EXSTYLE WS_EX_APPWINDOW +CAPTION "ƒXƒ^[ƒgƒƒjƒ…[‚©‚çƒvƒƒOƒ‰ƒ€‚ðŒŸõ" +FONT 9, "MS UI Gothic", 0, 0, 0x1 +BEGIN + LTEXT "ƒtƒBƒ‹ƒ^(&F):",IDC_STATIC,7,9,18,8 + EDITTEXT IDC_FILTER,34,7,100,14,ES_AUTOHSCROLL + CONTROL "List1",IDC_PROGRAMS_FOUND,"SysListView32",LVS_REPORT | + LVS_SHOWSELALWAYS | LVS_SORTASCENDING | WS_BORDER | + WS_TABSTOP,7,25,186,33 + PUSHBUTTON "“o˜^‚ðƒ`ƒFƒbƒN‚·‚é(&C)",IDC_CHECK_ENTRIES,143,7,50,14 +END + +IDD_DESKBAR_DESKTOP DIALOG DISCARDABLE 0, 0, 212, 194 +STYLE WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "ƒfƒXƒNƒgƒbƒv‚̃vƒƒpƒeƒB" +FONT 9, "MS UI Gothic" +BEGIN + LTEXT "Žg—p‚µ‚½‚¢ƒAƒCƒRƒ“‚Ì”z’u‚ð‘I‘ð‚µ‚Ä‚­‚¾‚³‚¢:", + IDC_STATIC,7,7,166,8 + CONTROL "¶ã‚©‚牺‚Ö",IDC_ICON_ALIGN_0,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,7,25,46,44 + CONTROL "¶ã‚©‚ç‰E‚Ö",IDC_ICON_ALIGN_1,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,57,25,46,44 + CONTROL "‰Eã‚©‚綂Ö",IDC_ICON_ALIGN_2,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,110,25,46,44 + CONTROL "‰Eã‚©‚牺‚Ö",IDC_ICON_ALIGN_3,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,159,25,46,44 + CONTROL "¶‰º‚©‚çã‚Ö",IDC_ICON_ALIGN_4,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,7,73,46,44 + CONTROL "¶‰º‚©‚ç‰E‚Ö",IDC_ICON_ALIGN_5,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,57,73,46,44 + CONTROL "‰E‰º‚©‚綂Ö",IDC_ICON_ALIGN_6,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,110,73,46,44 + CONTROL "‰E‰º‚©‚牺‚Ö",IDC_ICON_ALIGN_7,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,159,73,46,44 + CONTROL "¶‰E‚ð‰º‚Ö",IDC_ICON_ALIGN_8,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,7,121,46,44 + CONTROL "ã‚ƶ‰E‚Ì’[",IDC_ICON_ALIGN_9,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,57,121,46,44 + CONTROL "—Ö‚É‚È‚é‚悤‚É",IDC_ICON_ALIGN_10,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,110,121,46,44 + CONTROL "",IDC_ICON_ALIGN_11,"Button",BS_OWNERDRAW | BS_BOTTOM | + WS_TABSTOP,159,121,46,44 + CONTROL "ƒfƒXƒNƒgƒbƒv‚Ƀo[ƒWƒ‡ƒ“‚ð•\\Ž¦‚·‚é(&V)",ID_DESKTOP_VERSION,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,177,91,10 +END + +IDD_DESKBAR_TASKBAR DIALOG DISCARDABLE 0, 0, 210, 194 +STYLE WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "ƒ^ƒXƒN ƒo[‚̃vƒƒpƒeƒB" +FONT 9, "MS UI Gothic" +BEGIN + CONTROL "ŽžŒv‚ð•\\Ž¦‚·‚é(&C)",ID_SHOW_CLOCK,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,152,52,10 + CONTROL "ƒAƒNƒeƒBƒu‚Å‚È‚¢’Ê’mƒAƒCƒRƒ“‚ð‰B‚·(&H)", + ID_HIDE_INACTIVE_ICONS,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,174,111,10 + PUSHBUTTON "’Ê’mƒAƒCƒRƒ“(&N)...",ID_CONFIG_NOTIFYAREA,153,173,50,14 +END + +IDD_DESKBAR_STARTMENU DIALOG DISCARDABLE 0, 0, 210, 194 +STYLE WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "ƒXƒ^[ƒgƒƒjƒ…[‚̃vƒƒpƒeƒB" +FONT 9, "MS UI Gothic" +BEGIN +END + +IDD_NOTIFYAREA DIALOGEX 0, 0, 208, 174 +STYLE WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | + WS_SYSMENU | WS_THICKFRAME +EXSTYLE WS_EX_APPWINDOW +CAPTION "’Ê’mƒAƒCƒRƒ“‚ÌÝ’è" +FONT 9, "MS UI Gothic", 0, 0, 0x1 +BEGIN + CONTROL "Tree1",IDC_NOTIFY_ICONS,"SysTreeView32",TVS_HASLINES | + TVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,7,7,194,31 + LTEXT "ƒc[ƒ‹ ƒ`ƒbƒv‚Ì“à—e(&T):",IDC_LABEL1,7,44,40,8 + EDITTEXT IDC_NOTIFY_TOOLTIP,58,42,143,14,ES_AUTOHSCROLL + LTEXT "ƒEƒBƒ“ƒhƒE‚̃^ƒCƒgƒ‹(&I):",IDC_LABEL2,7,63,44,8 + EDITTEXT IDC_NOTIFY_TITLE,58,60,143,14,ES_AUTOHSCROLL + LTEXT "ƒ‚ƒWƒ…[ƒ‹‚ÌêŠ(&M):",IDC_LABEL3,7,81,43,8 + EDITTEXT IDC_NOTIFY_MODULE,58,78,143,14,ES_AUTOHSCROLL + GROUPBOX "•\\Ž¦ƒ‚[ƒh(&D)",IDC_LABEL4,7,96,157,28 + CONTROL "•\\Ž¦‚·‚é(&S)",IDC_NOTIFY_SHOW,"Button",BS_AUTORADIOBUTTON | + WS_TABSTOP,15,108,33,10 + CONTROL "‰B‚·(&H)",IDC_NOTIFY_HIDE,"Button",BS_AUTORADIOBUTTON,66, + 108,29,10 + CONTROL "Ž©“®“I‚ɉB‚·(&U)",IDC_NOTIFY_AUTOHIDE,"Button", + BS_AUTORADIOBUTTON,112,108,43,10 + ICON "",IDC_PICTURE,173,101,21,20 + LTEXT "ÅI•ÏX(&L):",IDC_LABEL6,7,132,43,8 + EDITTEXT IDC_LAST_CHANGE,59,129,105,14,ES_AUTOHSCROLL | + ES_READONLY + CONTROL "‰B‚ꂽƒAƒCƒRƒ“‚à•\\Ž¦(&W)",ID_SHOW_HIDDEN_ICONS,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,154,56,10 + DEFPUSHBUTTON "OK (&O)",IDOK,91,153,50,14,WS_GROUP + PUSHBUTTON "ƒLƒƒƒ“ƒZƒ‹(&C)",IDCANCEL,151,153,50,14 +END + +IDD_MDI_SDI DIALOGEX 0, 0, 194, 138 +STYLE WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +EXSTYLE WS_EX_APPWINDOW +CAPTION "ƒGƒNƒXƒvƒ[ƒ‰‚̃EƒBƒ“ƒhƒE ƒ‚[ƒh‚Ì‘I‘ð" +FONT 9, "MS UI Gothic", 0, 0, 0x1 +BEGIN + LTEXT "Žg—p‚µ‚½‚¢ƒ†[ƒU[ ƒCƒ“ƒ^[ƒtƒF[ƒX‚ð‘I‘ð‚µ‚Ä‚­‚¾‚³‚¢:", + IDC_STATIC,7,7,160,8 + CONTROL "MDI (Multiple Document Interface)(&M)",IDC_MDI,"Button", + BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,7,31,124,10 + CONTROL "SDI (Single Document Interface)(&S)",IDC_SDI,"Button", + BS_AUTORADIOBUTTON,7,62,118,10 + CONTROL 170,IDC_STATIC,"Static",SS_BITMAP,145,23,15,13 + CONTROL 171,IDC_STATIC,"Static",SS_BITMAP,145,57,15,13 + CONTROL "ƒTƒuƒtƒHƒ‹ƒ_‚ðV‚µ‚¢ƒEƒBƒ“ƒhƒE‚ÅŠJ‚­(&E)", + IDC_SEPARATE_SUBFOLDERS,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,90,135,10 + LTEXT "‚±‚ê‚æ‚肱‚Ìݒ肪A‚·‚×‚Ä‚Ì Explorer ƒEƒBƒ“ƒhƒE‚̃fƒtƒHƒ‹ƒg‚É‚È‚è‚Ü‚·B", + IDC_STATIC,7,111,174,22 + DEFPUSHBUTTON "OK (&O)",IDOK,29,136,50,14,WS_GROUP + PUSHBUTTON "ƒLƒƒƒ“ƒZƒ‹(&C)",IDCANCEL,106,136,50,14 +END + +IDD_ABOUT_EXPLORER DIALOG DISCARDABLE 0, 0, 199, 106 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "ReactOS Explorer ‚ɂ‚¢‚Ä" +FONT 10, "MS UI Gothic" +BEGIN + LTEXT "ReactOS Explorer",IDC_ROS_EXPLORER,91,13,104,11 + LTEXT "V 0.9",IDC_VERSION_TXT,91,27,104,8 + LTEXT "(c) 2003-2005 Martin Fuchs",IDC_STATIC,91,42,104,8 + LTEXT "",IDC_WIN_VERSION,91,58,98,22 + LTEXT "http://www.sky.franken.de/explorer/",IDC_WWW,17,84,129, + 8 + CONTROL "OK (&O)",IDOK,"Button",BS_OWNERDRAW | BS_FLAT | WS_GROUP, + 154,90,38,12 +END + + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE MOVEABLE PURE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE MOVEABLE PURE +BEGIN + "#include \r\n" + "\0" +END + +3 TEXTINCLUDE MOVEABLE PURE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE DISCARDABLE +BEGIN + IDS_TITLE "ReactOS Explorer" + IDS_START "½À°Ä" + IDS_LOGOFF "ƒƒOƒIƒt..." + IDS_SHUTDOWN "ƒVƒƒƒbƒgƒ_ƒEƒ“..." + IDS_LAUNCH "ƒtƒ@ƒCƒ‹–¼‚ðŽw’肵‚ÄŽÀs..." + IDS_START_HELP "ƒwƒ‹ƒv" + IDS_SEARCH_FILES "ƒtƒ@ƒCƒ‹‚âƒtƒHƒ‹ƒ_..." + IDS_DOCUMENTS "ƒ}ƒCƒhƒLƒ…ƒƒ“ƒg" + IDS_FAVORITES "‚¨‹C‚É“ü‚è" + IDS_PROGRAMS "ƒvƒƒOƒ‰ƒ€" + IDS_SETTINGS "Ý’è" + IDS_EXPLORE "ƒGƒNƒXƒvƒ[ƒ‰" + IDS_EMPTY "(‚È‚µ)" + IDS_RECENT "ŋߎg‚Á‚½ƒtƒ@ƒCƒ‹" + IDS_ADMIN "ŠÇ—ƒc[ƒ‹" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_STARTMENU "ƒXƒ^[ƒgƒƒjƒ…[" + IDS_MINIMIZE_ALL "‘SƒEƒBƒ“ƒhƒE‚ðŬ‰»" + IDS_DESKTOP_NUM "ƒfƒXƒNƒgƒbƒv %d" + IDS_VOLUME "‰¹—Ê" + IDS_ITEMS_CUR "Œ»Ý‚̃AƒCƒRƒ“" + IDS_ITEMS_CONFIGURED "Ý’è" + IDS_ITEMS_VISIBLE "•\\Ž¦" + IDS_ITEMS_HIDDEN "”ñ•\\Ž¦" + IDS_NOTIFY_SHOW "•\\Ž¦‚·‚é" + IDS_NOTIFY_HIDE "‰B‚·" + IDS_NOTIFY_AUTOHIDE "Ž©“®“I‚ɉB‚·" + IDS_SHOW_HIDDEN_ICONS "‰B‚ê‚Ä‚¢‚éƒAƒCƒRƒ“‚à•\\Ž¦‚·‚é" + IDS_HIDE_ICONS "ƒAƒCƒRƒ“‚ð‰B‚·" + IDS_TERMINATE "ROS Explorer ‚ðI—¹‚·‚é" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_NETWORK "ƒlƒbƒgƒ[ƒN" + IDS_CONNECTIONS "ƒlƒbƒgƒ[ƒNÚ‘±" + IDS_DRIVES "ƒ[ƒJƒ‹ƒfƒBƒXƒN" + IDS_SEARCH_COMPUTER "ƒRƒ“ƒsƒ…[ƒ^‚ÌŒŸõ..." + IDS_SETTINGS_MENU "ݒ胃jƒ…[" + IDS_CONTROL_PANEL "ƒRƒ“ƒgƒ[ƒ‹ ƒpƒlƒ‹" + IDS_PRINTERS "ƒvƒŠƒ“ƒ^" + IDS_BROWSE "ƒtƒ@ƒCƒ‹‚̃uƒ‰ƒEƒY" + IDS_SEARCH_PRG "ƒvƒƒOƒ‰ƒ€‚ðŒŸõ..." + IDS_ALL_USERS "All Users\\" + IDS_SEARCH "ŒŸõ" + IDS_ABOUT_EXPLORER "Explorer ‚ɂ‚¢‚Ä(&A)..." + IDS_LAUNCH_MANY_PROGRAMS + "“ñ‚ˆÈã‚̃vƒƒOƒ‰ƒ€‚ª‘I‘ð‚³‚ê‚Ü‚µ‚½B\n‚·‚ׂẴvƒƒOƒ‰ƒ€‚ðŽÀs‚µ‚Ü‚·‚©?" + IDS_DESKTOPBAR_SETTINGS "ƒfƒXƒNƒgƒbƒv‚ÌÝ’è" + IDS_DESKTOP "ƒfƒXƒNƒgƒbƒv" + IDS_TASKBAR "ƒ^ƒXƒNƒo[" +END + +#endif // Japanese resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/reactos/base/shell/explorer/explorer-pl.rc b/reactos/base/shell/explorer/explorer-pl.rc new file mode 100644 index 00000000000..591f0d75b34 --- /dev/null +++ b/reactos/base/shell/explorer/explorer-pl.rc @@ -0,0 +1,399 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// Polish (PL) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE LANG_POLISH, SUBLANG_NEUTRAL +#pragma code_page(1250) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Menu +// + +IDM_MDIFRAME MENU DISCARDABLE +BEGIN + POPUP "&Plik" + BEGIN + MENUITEM "Urucho&m...", ID_EXECUTE + MENUITEM SEPARATOR + MENUITEM "Za&koñcz", ID_FILE_EXIT + END + POPUP "&Widok" + BEGIN + MENUITEM "Przyciski &standardowe", ID_VIEW_TOOL_BAR + MENUITEM "P&rzyciski dodatkowe", ID_VIEW_EXTRA_BAR + MENUITEM "Pasek &dysków", ID_VIEW_DRIVE_BAR, CHECKED + MENUITEM "Pasek &boczny", ID_VIEW_SIDE_BAR + MENUITEM "Pasek sta&nu", ID_VIEW_STATUSBAR + MENUITEM SEPARATOR + MENUITEM "&Odœwie¿\tF5", ID_REFRESH + MENUITEM "P&e³ny ekran\tCtrl+Shift+S", ID_VIEW_FULLSCREEN + MENUITEM "SDI", ID_VIEW_SDI + END + POPUP "&Okna" + BEGIN + MENUITEM "Nowe &okno", ID_WINDOW_NEW + MENUITEM "&Kaskada\tShift+F5", ID_WINDOW_CASCADE + MENUITEM "&S¹siaduj¹co poziomo", ID_WINDOW_TILE_HORZ + MENUITEM "S¹siaduj¹co &pionowo\tShift+F4", ID_WINDOW_TILE_VERT + MENUITEM "&Autorozmieszczenie", ID_WINDOW_AUTOSORT + MENUITEM "Rozmieœæ wed³ug &nazwy", ID_WINDOW_ARRANGE + END + POPUP "&Narzêdzia" + BEGIN + MENUITEM "&Opcje", ID_TOOLS_OPTIONS + END + POPUP "Pomo&c" + BEGIN + MENUITEM "Explorer &FAQ", ID_EXPLORER_FAQ + MENUITEM "ReactOS Explorer - &Informacje", ID_ABOUT_EXPLORER + MENUITEM "ReactOS - I&nformacje", ID_ABOUT_WINDOWS + END +END + +IDM_DESKTOPBAR MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&W³aœciwoœci", ID_DESKTOPBAR_SETTINGS + MENUITEM "Mened¿er &zadañ", ID_TASKMGR + MENUITEM SEPARATOR + MENUITEM "ReactOS Explorer - &Informacje", ID_ABOUT_EXPLORER + END +END + +IDM_VOLUME MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Otwórz regulacje g³oœnoœci", ID_TRAY_VOLUME + MENUITEM "&Ustaw w³aœciwoœci audio", ID_VOLUME_PROPERTIES + END +END + +IDM_NOTIFYAREA MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Poka¿ ukryte ikony", ID_SHOW_HIDDEN_ICONS + MENUITEM "&Ukrywaj nieu¿ywane ikony", ID_SHOW_ICON_BUTTON + MENUITEM "&Konfiguruj powiadomienia", ID_CONFIG_NOTIFYAREA + MENUITEM "Ustaw &datê/godzinê", ID_CONFIG_TIME + MENUITEM SEPARATOR + MENUITEM "ReactOS Explorer - &Informacje", ID_ABOUT_EXPLORER + END +END + +IDM_SDIFRAME MENU DISCARDABLE +BEGIN + POPUP "&Plik" + BEGIN + MENUITEM "Urucho&m...", ID_EXECUTE + MENUITEM SEPARATOR + MENUITEM "Za&koñcz", ID_FILE_EXIT + END + POPUP "&Widok" + BEGIN + MENUITEM "Przyciski &standardowe", ID_VIEW_TOOL_BAR + MENUITEM "Pasek &boczny", ID_VIEW_SIDE_BAR, GRAYED + MENUITEM "Pasek sta&nu", ID_VIEW_STATUSBAR + MENUITEM SEPARATOR + MENUITEM "&Odœwie¿\tF5", ID_REFRESH + MENUITEM "P&e³ny ekran\tCtrl+Shift+S", ID_VIEW_FULLSCREEN + MENUITEM "&MDI", ID_VIEW_MDI + END + POPUP "&Narzêdzia" + BEGIN + MENUITEM "&Opcje", ID_TOOLS_OPTIONS + END + POPUP "Pomo&c" + BEGIN + MENUITEM "Explorer &FAQ", ID_EXPLORER_FAQ + MENUITEM "ReactOS Explorer - &Informacje", ID_ABOUT_EXPLORER + MENUITEM "ReactOS - I&nformacje", ID_ABOUT_WINDOWS + END +END + + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_EXECUTE DIALOG DISCARDABLE 15, 13, 210, 63 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Uruchom" +FONT 8, "MS Shell Dlg" +BEGIN + CONTROL "",101,"Static",SS_SIMPLE | SS_NOPREFIX,3,6,150,10 + CONTROL "&Polecenie:",-1,"Static",SS_LEFTNOWORDWRAP | WS_GROUP,3, + 18,60,10 + EDITTEXT 201,3,29,134,12,ES_AUTOHSCROLL + CONTROL "Jako &symbol",214,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,3, + 45,71,12 + DEFPUSHBUTTON "&OK",1,158,6,47,14 + PUSHBUTTON "&Anuluj",2,158,23,47,14 + PUSHBUTTON "Pomo&c",254,158,43,47,14 +END + +IDD_SEARCH_PROGRAM DIALOGEX 0, 0, 200, 65 +STYLE WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | + WS_SYSMENU | WS_THICKFRAME +EXSTYLE WS_EX_APPWINDOW +CAPTION "Szukaj programu w menu start" +FONT 8, "MS Sans Serif", 0, 0, 0x1 +BEGIN + LTEXT "&Filtry:",IDC_STATIC,7,9,18,8 + EDITTEXT IDC_FILTER,34,7,100,14,ES_AUTOHSCROLL + CONTROL "List1",IDC_PROGRAMS_FOUND,"SysListView32",LVS_REPORT | + LVS_SHOWSELALWAYS | LVS_SORTASCENDING | WS_BORDER | + WS_TABSTOP,7,25,186,33 + PUSHBUTTON "&Szukaj nazwy",IDC_CHECK_ENTRIES,143,7,50,14 +END + +IDD_DESKBAR_DESKTOP DIALOG DISCARDABLE 0, 0, 212, 194 +STYLE WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "W³aœciwoœci pulpitu" +FONT 8, "MS Sans Serif" +BEGIN + LTEXT "Wybierz sposób uk³adania ikon:", + IDC_STATIC,7,7,166,8 + CONTROL "left/top dwn",IDC_ICON_ALIGN_0,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,7,25,46,44 + CONTROL "left/top right",IDC_ICON_ALIGN_1,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,57,25,46,44 + CONTROL "right/top left",IDC_ICON_ALIGN_2,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,110,25,46,44 + CONTROL "rig./top dwn",IDC_ICON_ALIGN_3,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,159,25,46,44 + CONTROL "left/bot. up",IDC_ICON_ALIGN_4,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,7,73,46,44 + CONTROL "left/bot. right",IDC_ICON_ALIGN_5,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,57,73,46,44 + CONTROL "right/bot. left",IDC_ICON_ALIGN_6,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,110,73,46,44 + CONTROL "rig./bot. dwn",IDC_ICON_ALIGN_7,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,159,73,46,44 + CONTROL "border down",IDC_ICON_ALIGN_8,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,7,121,46,44 + CONTROL "border H/V",IDC_ICON_ALIGN_9,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,57,121,46,44 + CONTROL "round about",IDC_ICON_ALIGN_10,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,110,121,46,44 + CONTROL "",IDC_ICON_ALIGN_11,"Button",BS_OWNERDRAW | BS_BOTTOM | + WS_TABSTOP,159,121,46,44 + CONTROL "Wyœwietlaj &numer wersji",ID_DESKTOP_VERSION,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,177,91,10 +END + +IDD_DESKBAR_TASKBAR DIALOG DISCARDABLE 0, 0, 210, 194 +STYLE WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "W³aœciwoœci paska zadañ" +FONT 8, "MS Sans Serif" +BEGIN + CONTROL "Poka¿ &zegar",ID_SHOW_CLOCK,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,152,52,10 + CONTROL "&Ukrywaj nieaktywne ikony", + ID_HIDE_INACTIVE_ICONS,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,174,111,10 + PUSHBUTTON "&Dostosuj",ID_CONFIG_NOTIFYAREA,153,173,50,14 +END + +IDD_DESKBAR_STARTMENU DIALOG DISCARDABLE 0, 0, 210, 194 +STYLE WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "W³aœciwoœci Menu Start" +FONT 8, "MS Sans Serif" +BEGIN +END + +IDD_NOTIFYAREA DIALOGEX 0, 0, 208, 174 +STYLE WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | + WS_SYSMENU | WS_THICKFRAME +EXSTYLE WS_EX_APPWINDOW +CAPTION "Konfiguracja ikon powiadomieñ" +FONT 8, "MS Sans Serif", 0, 0, 0x1 +BEGIN + CONTROL "Tree1",IDC_NOTIFY_ICONS,"SysTreeView32",TVS_HASLINES | + TVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,7,7,194,31 + LTEXT "&PodpowiedŸ:",IDC_LABEL1,7,44,40,8 + EDITTEXT IDC_NOTIFY_TOOLTIP,58,42,143,14,ES_AUTOHSCROLL + LTEXT "&Tytu³ okna:",IDC_LABEL2,7,63,44,8 + EDITTEXT IDC_NOTIFY_TITLE,58,60,143,14,ES_AUTOHSCROLL + LTEXT "Œcie¿ka:",IDC_LABEL3,7,81,43,8 + EDITTEXT IDC_NOTIFY_MODULE,58,78,143,14,ES_AUTOHSCROLL + GROUPBOX "&Sposób wyœwietlania",IDC_LABEL4,7,96,157,28 + CONTROL "&widoczny",IDC_NOTIFY_SHOW,"Button",BS_AUTORADIOBUTTON | + WS_TABSTOP,15,108,33,10 + CONTROL "&ukryty",IDC_NOTIFY_HIDE,"Button",BS_AUTORADIOBUTTON,66, + 108,29,10 + CONTROL "&autoukrywanie",IDC_NOTIFY_AUTOHIDE,"Button", + BS_AUTORADIOBUTTON,112,108,43,10 + ICON "",IDC_PICTURE,173,101,21,20 + LTEXT "&Zmodyfikowany:",IDC_LABEL6,7,132,43,8 + EDITTEXT IDC_LAST_CHANGE,59,129,105,14,ES_AUTOHSCROLL | + ES_READONLY + CONTROL "Po&ka¿ wszystkie",ID_SHOW_HIDDEN_ICONS,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,154,56,10 + DEFPUSHBUTTON "&OK",IDOK,91,153,50,14,WS_GROUP + PUSHBUTTON "&Anuluj",IDCANCEL,151,153,50,14 +END + +IDD_MDI_SDI DIALOGEX 0, 0, 194, 157 +STYLE WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +EXSTYLE WS_EX_APPWINDOW +CAPTION "Tryb wyœwietlania okien" +FONT 8, "MS Sans Serif", 0, 0, 0x1 +BEGIN + LTEXT "Wybierz tryb wyœwietlania okien:", + IDC_STATIC,7,7,160,8 + CONTROL "&MDI (Otwieraj w jednym oknie)",IDC_MDI,"Button", + BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,7,31,124,10 + CONTROL "&SDI (Otwieraj we w³asnym oknie)",IDC_SDI,"Button", + BS_AUTORADIOBUTTON,7,62,118,10 + CONTROL 170,IDC_STATIC,"Static",SS_BITMAP,145,23,15,13 + CONTROL 171,IDC_STATIC,"Static",SS_BITMAP,145,57,15,13 + CONTROL "&Otwieraj podkatalogi w nowych oknach", + IDC_SEPARATE_SUBFOLDERS,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,90,135,10 + LTEXT "Te opcje bêd¹ stosowane w przysz³oœci do wszystkich okien.", + IDC_STATIC,7,111,174,22 + DEFPUSHBUTTON "&OK",IDOK,29,136,50,14,WS_GROUP + PUSHBUTTON "&Anuluj",IDCANCEL,106,136,50,14 +END + +IDD_ABOUT_EXPLORER DIALOG DISCARDABLE 0, 0, 199, 106 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "ReactOS Explorer - &Informacje" +FONT 10, "MS Sans Serif" +BEGIN + LTEXT "ReactOS Explorer",IDC_ROS_EXPLORER,91,13,104,11 + LTEXT "V 0.9",IDC_VERSION_TXT,91,27,104,8 + LTEXT "(c) 2003-2005 Martin Fuchs",IDC_STATIC,91,42,104,8 + LTEXT "",IDC_WIN_VERSION,91,58,98,22 + LTEXT "http://www.sky.franken.de/explorer/",IDC_WWW,17,84,129, + 8 + CONTROL "&OK",IDOK,"Button",BS_OWNERDRAW | BS_FLAT | WS_GROUP, + 154,90,38,12 +END + + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE MOVEABLE PURE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE MOVEABLE PURE +BEGIN + "#include \r\n" + "\0" +END + +3 TEXTINCLUDE MOVEABLE PURE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE DISCARDABLE +BEGIN + IDS_TITLE "Reactos Explorer" + IDS_START "Start" + IDS_LOGOFF "Wyloguj..." + IDS_SHUTDOWN "Zamknij system..." + IDS_LAUNCH "Uruchom..." + IDS_START_HELP "Pomoc" + IDS_SEARCH_FILES "Szukaj..." + IDS_DOCUMENTS "Dokumenty" + IDS_FAVORITES "Ulubione" + IDS_PROGRAMS "Programy" + IDS_SETTINGS "Ustawienia" + IDS_EXPLORE "Eksploruj" + IDS_EMPTY "(pusty)" + IDS_RECENT "Ostatnio otwarte" + IDS_ADMIN "Administracja" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_STARTMENU "Menu start" + IDS_MINIMIZE_ALL "Minimalizuj wszystko" + IDS_DESKTOP_NUM "Pulpit %d" + IDS_VOLUME "G³oœnoœæ" + IDS_ITEMS_CUR "Aktualne pozycje" + IDS_ITEMS_CONFIGURED "ustawienia" + IDS_ITEMS_VISIBLE "widoczne" + IDS_ITEMS_HIDDEN "ukryte" + IDS_NOTIFY_SHOW "poka¿" + IDS_NOTIFY_HIDE "ukryj" + IDS_NOTIFY_AUTOHIDE "autoukrywanie" + IDS_SHOW_HIDDEN_ICONS "Poka¿ ukryte ikony" + IDS_HIDE_ICONS "Ukryj ikony" + IDS_TERMINATE "Zakoñcz dzia³anie ROS Explorer" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_NETWORK "Sieæ" + IDS_CONNECTIONS "Po³¹czenia sieciowe" + IDS_DRIVES "Dysk" + IDS_SEARCH_COMPUTER "ZnajdŸ komputar..." + IDS_SETTINGS_MENU "Settings menu" + IDS_CONTROL_PANEL "Panel sterowania" + IDS_PRINTERS "Drukarki" + IDS_BROWSE "Przegl¹daj" + IDS_SEARCH_PRG "ZnajdŸ progarm..." + IDS_ALL_USERS "All Users\\" + IDS_SEARCH "Szukaj" + IDS_ABOUT_EXPLORER "ReactOS Explorer - &Informacje" + IDS_LAUNCH_MANY_PROGRAMS + "Zaznaczy³eœ wiêcej ni¿ jeden program.\nCzy chcesz uruchomiæ je jednoczeœnie?" + IDS_DESKTOPBAR_SETTINGS "W³aœciwoœci pulpitu" + IDS_DESKTOP "Pulpit" + IDS_TASKBAR "Pasek zadañ" +END + +#endif // Polish (PL) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/reactos/base/shell/explorer/explorer-pt.rc b/reactos/base/shell/explorer/explorer-pt.rc new file mode 100644 index 00000000000..bf482733ac3 --- /dev/null +++ b/reactos/base/shell/explorer/explorer-pt.rc @@ -0,0 +1,167 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "resource.h" +#define APSTUDIO_HIDDEN_SYMBOLS +#include "windows.h" +#undef APSTUDIO_HIDDEN_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// German (Germany) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DEU) +#ifdef _WIN32 +LANGUAGE LANG_GERMAN, SUBLANG_GERMAN +#pragma code_page(1252) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "#include ""resource.h""\r\n" + "#define APSTUDIO_HIDDEN_SYMBOLS\r\n" + "#include ""windows.h""\r\n" + "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n" + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + +#endif // German (Germany) resources +///////////////////////////////////////////////////////////////////////////// + + +///////////////////////////////////////////////////////////////////////////// +// Portuguese (Portugal) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_PTG) +#ifdef _WIN32 +LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE +#pragma code_page(1252) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_EXECUTE DIALOG DISCARDABLE 15, 13, 210, 63 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Executar" +FONT 8, "MS Shell Dlg" +BEGIN + CONTROL "",101,"Static",SS_SIMPLE | SS_NOPREFIX,3,6,162,10 + CONTROL "Co&mando:",-1,"Static",SS_LEFTNOWORDWRAP | WS_GROUP,3, + 18,60,10 + EDITTEXT 201,3,29,134,12,ES_AUTOHSCROLL + CONTROL "Como &Símbolo",214,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,3,45,71,12 + DEFPUSHBUTTON "&OK",1,158,6,47,14 + PUSHBUTTON "&Cancelar",2,158,23,47,14 + PUSHBUTTON "&Ajuda",254,158,43,47,14 +END + + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE DISCARDABLE +BEGIN + IDS_TITLE "Explorador do Reactos" + IDS_START "Iniciar" + IDS_LOGOFF "Terminar sessão..." + IDS_SHUTDOWN "Desligar..." + IDS_LAUNCH "Executar..." + IDS_START_HELP "Ajuda" + IDS_SEARCH_FILES "Procurar..." + IDS_DOCUMENTS "Documentos" + IDS_FAVORITES "Favoritos" + IDS_PROGRAMS "Programas" + IDS_SETTINGS "Definições" + IDS_EXPLORE "Explorar" + IDS_EMPTY "(Vazio)" + IDS_RECENT "Documentos recentes" + IDS_ADMIN "Administrar" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_STARTMENU "Startmenu" + IDS_MINIMIZE_ALL "mimimize all windows" + IDS_DESKTOP_NUM "Desktop %d" + IDS_VOLUME "Volume" + IDS_ITEMS_CUR "current items" + IDS_ITEMS_CONFIGURED "configuration" + IDS_ITEMS_VISIBLE "visible" + IDS_ITEMS_HIDDEN "hidden" + IDS_NOTIFY_SHOW "show" + IDS_NOTIFY_HIDE "hide" + IDS_NOTIFY_AUTOHIDE "autohide" + IDS_SHOW_HIDDEN_ICONS "Show hidden icons" + IDS_HIDE_ICONS "Hide icons" + IDS_TERMINATE "Terminar ROS Explorador" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_NETWORK "Rede" + IDS_CONNECTIONS "Conecções da rede" + IDS_DRIVES "Drives" + IDS_SEARCH_COMPUTER "Procurar computador..." + IDS_SETTINGS_MENU "Menu das definições" + IDS_CONTROL_PANEL "Painel de controle" + IDS_PRINTERS "Impressora" + IDS_BROWSE "Vasculhar Ficheiros" + IDS_SEARCH_PRG "Procurar programa..." + IDS_ALL_USERS "Todos utilizadores\\" + IDS_SEARCH "Procurar" + IDS_ABOUT_EXPLORER "Sobre o Explorador..." + IDS_LAUNCH_MANY_PROGRAMS + "You have selected more than one program.\nAre you sure you want to launch all of them?" + IDS_DESKTOPBAR_SETTINGS "Desktop Settings" + IDS_DESKTOP "Desktop" + IDS_TASKBAR "Taskbar" +END + +#endif // Portuguese (Portugal) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/reactos/base/shell/explorer/explorer-ro.rc b/reactos/base/shell/explorer/explorer-ro.rc new file mode 100644 index 00000000000..f14141e5727 --- /dev/null +++ b/reactos/base/shell/explorer/explorer-ro.rc @@ -0,0 +1,244 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "resource.h" +#define APSTUDIO_HIDDEN_SYMBOLS +#include "windows.h" +#undef APSTUDIO_HIDDEN_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// Romanian resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ROM) +#ifdef _WIN32 +LANGUAGE LANG_ROMANIAN, SUBLANG_NEUTRAL +#pragma code_page(1250) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Menu +// + +IDM_MDIFRAME MENU DISCARDABLE +BEGIN + POPUP "&Fiºier" + BEGIN + MENUITEM "&Execute...", ID_EXECUTE + MENUITEM SEPARATOR + MENUITEM "&Ieºire", ID_FILE_EXIT + END + POPUP "&Prezentare" + BEGIN + MENUITEM "&Bara cu instrumente", ID_VIEW_TOOL_BAR + MENUITEM "&Extra Bar", ID_VIEW_EXTRA_BAR + MENUITEM "&Drivebar", ID_VIEW_DRIVE_BAR, CHECKED + MENUITEM "&Bara de stare", ID_VIEW_STATUSBAR + MENUITEM "&Side Bar", ID_VIEW_SIDE_BAR + MENUITEM SEPARATOR + MENUITEM "&Resetare\tF5", ID_REFRESH + MENUITEM "F&ull Screen\tCtrl+Shift+S", ID_VIEW_FULLSCREEN + MENUITEM "&SDI", ID_VIEW_SDI + END + POPUP "&Fereastrã" + BEGIN + MENUITEM "&Fereastrã Nouã", ID_WINDOW_NEW + MENUITEM "Cascading\tShift+F5", ID_WINDOW_CASCADE + MENUITEM "Aliniazã &Orizontal", ID_WINDOW_TILE_HORZ + MENUITEM "Aliniazã &Vertical\tShift+F4", ID_WINDOW_TILE_VERT + MENUITEM "Aranjeazã automat", ID_WINDOW_AUTOSORT + MENUITEM "Aranjeazã &Simbolurile", ID_WINDOW_ARRANGE + END + POPUP "&Tools" + BEGIN + MENUITEM "&Options", ID_TOOLS_OPTIONS + END + POPUP "&Ajutor" + BEGIN + MENUITEM "Explorer &FAQ...", ID_EXPLORER_FAQ + MENUITEM "&Despre Explorer...", ID_ABOUT_EXPLORER + MENUITEM "Despre &OS...", ID_ABOUT_WINDOWS + END +END + +IDM_SDIFRAME MENU DISCARDABLE +BEGIN + POPUP "&Fiºier" + BEGIN + MENUITEM "&Execute...", ID_EXECUTE + MENUITEM SEPARATOR + MENUITEM "&Ieºire", ID_FILE_EXIT + END + POPUP "&Prezentare" + BEGIN + MENUITEM "&Bara cu instrumente", ID_VIEW_TOOL_BAR + MENUITEM "&Side Bar", ID_VIEW_SIDE_BAR, GRAYED + MENUITEM "&Bara de stare", ID_VIEW_STATUSBAR + MENUITEM SEPARATOR + MENUITEM "&Resetare\tF5", ID_REFRESH + MENUITEM "F&ull Screen\tCtrl+Shift+S", ID_VIEW_FULLSCREEN + MENUITEM "&MDI", ID_VIEW_MDI + END + POPUP "&Tools" + BEGIN + MENUITEM "&Options", ID_TOOLS_OPTIONS + END + POPUP "&Ajutor" + BEGIN + MENUITEM "Explorer &FAQ...", ID_EXPLORER_FAQ + MENUITEM "&Despre Explorer...", ID_ABOUT_EXPLORER + MENUITEM "Despre &OS...", ID_ABOUT_WINDOWS + END +END + + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_EXECUTE DIALOG DISCARDABLE 15, 13, 210, 63 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Execute" +FONT 8, "MS Shell Dlg" +BEGIN + CONTROL "",101,"Static",SS_SIMPLE | SS_NOPREFIX,3,6,162,10 + CONTROL "&Comanda:",-1,"Static",SS_LEFTNOWORDWRAP | WS_GROUP,3, + 18,60,10 + EDITTEXT 201,3,29,134,12,ES_AUTOHSCROLL + CONTROL "Ca &Simbol",214,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,3, + 45,71,12 + DEFPUSHBUTTON "&OK",1,158,6,47,14 + PUSHBUTTON "A&nulare",2,158,23,47,14 + PUSHBUTTON "&Ajutor",254,158,43,47,14 +END + + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE DISCARDABLE +BEGIN + IDS_TITLE "ReactOS Explorer" + IDS_START "Începe" + IDS_LOGOFF "Închide sesiunea ..." + IDS_SHUTDOWN "Oprire calculator ..." + IDS_LAUNCH "Pornire ..." + IDS_START_HELP "Ajutor" + IDS_SEARCH_FILES "Cãutare Files..." + IDS_DOCUMENTS "Documente" + IDS_FAVORITES "Preferinþe" + IDS_PROGRAMS "Programe" + IDS_SETTINGS "Setãri" + IDS_EXPLORE "Explorare" + IDS_EMPTY "(Empty)" + IDS_RECENT "Documente Recente" + IDS_ADMIN "Administrare" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_STARTMENU "Startmenu" + IDS_MINIMIZE_ALL "mimimize all windows" + IDS_DESKTOP_NUM "Desktop %d" + IDS_VOLUME "Volume" + IDS_ITEMS_CUR "current items" + IDS_ITEMS_CONFIGURED "configuration" + IDS_ITEMS_VISIBLE "visible" + IDS_ITEMS_HIDDEN "hidden" + IDS_NOTIFY_SHOW "show" + IDS_NOTIFY_HIDE "hide" + IDS_NOTIFY_AUTOHIDE "autohide" + IDS_SHOW_HIDDEN_ICONS "Show hidden icons" + IDS_HIDE_ICONS "Hide icons" + IDS_TERMINATE "Închide sesiunea" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_NETWORK "Reþea" + IDS_CONNECTIONS "Conecþii" + IDS_DRIVES "Discuri" + IDS_SEARCH_COMPUTER "Search Computer..." + IDS_SETTINGS_MENU "Settings Menu" + IDS_CONTROL_PANEL "Control Panel" + IDS_PRINTERS "Printers" + IDS_BROWSE "Browse Files" + IDS_SEARCH_PRG "Search Programm..." + IDS_ALL_USERS "All Users\\" + IDS_SEARCH "Cãutare..." + IDS_ABOUT_EXPLORER "&Despre Explorer..." + IDS_LAUNCH_MANY_PROGRAMS + "You have selected more than one program.\nAre you sure you want to launch all of them?" + IDS_DESKTOPBAR_SETTINGS "Desktop Settings" + IDS_DESKTOP "Desktop" + IDS_TASKBAR "Taskbar" +END + +#endif // Romanian resources +///////////////////////////////////////////////////////////////////////////// + + +///////////////////////////////////////////////////////////////////////////// +// German (Germany) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DEU) +#ifdef _WIN32 +LANGUAGE LANG_GERMAN, SUBLANG_GERMAN +#pragma code_page(1252) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "#include ""resource.h""\r\n" + "#define APSTUDIO_HIDDEN_SYMBOLS\r\n" + "#include ""windows.h""\r\n" + "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n" + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + +#endif // German (Germany) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/reactos/base/shell/explorer/explorer-ru.rc b/reactos/base/shell/explorer/explorer-ru.rc new file mode 100644 index 00000000000..4771a717699 --- /dev/null +++ b/reactos/base/shell/explorer/explorer-ru.rc @@ -0,0 +1,416 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "resource.h" +#define APSTUDIO_HIDDEN_SYMBOLS +#include "windows.h" +#undef APSTUDIO_HIDDEN_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// Russian resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_RUS) +#ifdef _WIN32 +LANGUAGE LANG_RUSSIAN, SUBLANG_NEUTRAL +#pragma code_page(1251) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Menu +// + +IDM_DESKTOPBAR MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Íàñòðîéêè...", ID_DESKTOPBAR_SETTINGS + MENUITEM "&Äèñïåò÷åð Çàäà÷...", ID_TASKMGR + MENUITEM SEPARATOR + MENUITEM "&Î Ïðîâîäíèêå...", ID_ABOUT_EXPLORER + END +END + +IDM_MDIFRAME MENU DISCARDABLE +BEGIN + POPUP "&Ôàéë" + BEGIN + MENUITEM "&Çàïóñòèòü...", ID_EXECUTE + MENUITEM SEPARATOR + MENUITEM "Â&ûõîä", ID_FILE_EXIT + END + POPUP "&Âèä" + BEGIN + MENUITEM "&Ïàíåëü èíñòðóìåíòîâ", ID_VIEW_TOOL_BAR + MENUITEM "&Äîïîëíèòåëüíàÿ ïàíåëü", ID_VIEW_EXTRA_BAR + MENUITEM "&Äèñêè", ID_VIEW_DRIVE_BAR, CHECKED + MENUITEM "È&çáðàííîå", ID_VIEW_SIDE_BAR + MENUITEM "&Ñòðîêà ñîñòîÿíèÿ", ID_VIEW_STATUSBAR + MENUITEM SEPARATOR + MENUITEM "&Îáíîâèòü\tF5", ID_REFRESH + MENUITEM "Ïî&ëíûé ýêðàí\tCtrl+Shift+S", ID_VIEW_FULLSCREEN + MENUITEM "SDI", ID_VIEW_SDI + END + POPUP "Î&êíà" + BEGIN + MENUITEM "Íîâîå î&êíî", ID_WINDOW_NEW + MENUITEM "Ðàñïîëîæèòü êàñêàäîì\tShift+F5", ID_WINDOW_CASCADE + MENUITEM "&Ãîðèçîíòàëüíî", ID_WINDOW_TILE_HORZ + MENUITEM "&Âåðòèêàëüíî\tShift+F4", ID_WINDOW_TILE_VERT + MENUITEM "Óïîðÿäî÷èòü àâòîìàòè÷åñêè", ID_WINDOW_AUTOSORT + MENUITEM "Óïîðÿäî÷èòü &çíà÷êè", ID_WINDOW_ARRANGE + END + POPUP "&Èíñòðóìåíòû" + BEGIN + MENUITEM "&Îïöèè", ID_TOOLS_OPTIONS + END + POPUP "Ïî&ìîùü" + BEGIN + MENUITEM "&FAQ(×àÂî) ïî Ïðîâîäíèêó...", ID_EXPLORER_FAQ + MENUITEM "Î &Ïðîâîäíèêå...", ID_ABOUT_EXPLORER + MENUITEM "Îá &ÎÑ...", ID_ABOUT_WINDOWS + END +END + +IDM_NOTIFYAREA MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Ïîêàçûâàòü ñêðûòûå çíà÷êè", ID_SHOW_HIDDEN_ICONS + MENUITEM "Ïîêàçûâàòü çíà÷êè íà &êíîïêàõ", ID_SHOW_ICON_BUTTON + MENUITEM "&Íàñòðîéêà óâåäîìëåíèé...", ID_CONFIG_NOTIFYAREA + MENUITEM "Íàñòðîéêà äàòû/&âðåìåíè", ID_CONFIG_TIME + MENUITEM SEPARATOR + MENUITEM "&Î Ïðîâîäíèêå...", ID_ABOUT_EXPLORER + END +END + +IDM_SDIFRAME MENU DISCARDABLE +BEGIN + POPUP "&Ôàéë" + BEGIN + MENUITEM "&Çàïóñòèòü...", ID_EXECUTE + MENUITEM SEPARATOR + MENUITEM "Â&ûõîä", ID_FILE_EXIT + END + POPUP "&Âèä" + BEGIN + MENUITEM "&Ïàíåëü èíñòðóìåíòîâ", ID_VIEW_TOOL_BAR + MENUITEM "È&çáðàííîå", ID_VIEW_SIDE_BAR, GRAYED + MENUITEM "&Ñòðîêà ñîñòîÿíèÿ", ID_VIEW_STATUSBAR + MENUITEM SEPARATOR + MENUITEM "&Îáíîâèòü\tF5", ID_REFRESH + MENUITEM "Ïî&ëíûé ýêðàí\tCtrl+Shift+S", ID_VIEW_FULLSCREEN + MENUITEM "&MDI", ID_VIEW_MDI + END + POPUP "&Èíñòðóìåíòû" + BEGIN + MENUITEM "&Îïöèè", ID_TOOLS_OPTIONS + END + POPUP "&Ñïðàâêà" + BEGIN + MENUITEM "&FAQ(×àÂÎ) ïî Ïðîâîäíèêó...", ID_EXPLORER_FAQ + MENUITEM "Î &Ïðîâîäíèêå...", ID_ABOUT_EXPLORER + MENUITEM "Îá &ÎÑ...", ID_ABOUT_WINDOWS + END +END + +IDM_VOLUME MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "Ãðîìêîñòü", ID_TRAY_VOLUME + MENUITEM "Ñâîéñòâà çâóêà", ID_VOLUME_PROPERTIES + END +END + + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_ABOUT_EXPLORER DIALOGEX 0, 0, 199, 106 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Î Ïðîâîäíèêå ReactOS" +FONT 10, "MS Sans Serif", 0, 0, 0x1 +BEGIN + LTEXT "Ïðîâîäíèê ReactOS",IDC_ROS_EXPLORER,91,13,104,11 + LTEXT "V 0.9",IDC_VERSION_TXT,91,27,104,8 + LTEXT "(c) 2003-2005 Martin Fuchs",IDC_STATIC,91,42,104,8 + LTEXT "",IDC_WIN_VERSION,91,58,98,22 + LTEXT "http://www.sky.franken.de/explorer/",IDC_WWW,17,84,129, + 8 + CONTROL "&OK",IDOK,"Button",BS_OWNERDRAW | BS_FLAT | WS_GROUP, + 154,90,38,12 +END + +IDD_DESKBAR_DESKTOP DIALOGEX 0, 0, 212, 194 +STYLE WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Ñâîéñòâà Ðàáî÷åãî Ñòîëà" +FONT 8, "MS Sans Serif", 0, 0, 0x1 +BEGIN + LTEXT "Âûáåðèòå, íàèáîëåå ïðåäïî÷òèòåëüíûé äëÿ âàñ, \nñïîñîá âûðàâíèâàíèÿ çíà÷êîâ", + IDC_STATIC,7,7,195,18 + CONTROL "left/top dwn",IDC_ICON_ALIGN_0,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,7,25,46,44 + CONTROL "left/top right",IDC_ICON_ALIGN_1,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,57,25,46,44 + CONTROL "right/top left",IDC_ICON_ALIGN_2,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,110,25,46,44 + CONTROL "rig./top dwn",IDC_ICON_ALIGN_3,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,159,25,46,44 + CONTROL "left/bot. up",IDC_ICON_ALIGN_4,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,7,73,46,44 + CONTROL "left/bot. right",IDC_ICON_ALIGN_5,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,57,73,46,44 + CONTROL "right/bot. left",IDC_ICON_ALIGN_6,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,110,73,46,44 + CONTROL "rig./bot. dwn",IDC_ICON_ALIGN_7,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,159,73,46,44 + CONTROL "border down",IDC_ICON_ALIGN_8,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,7,121,46,44 + CONTROL "border H/V",IDC_ICON_ALIGN_9,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,57,121,46,44 + CONTROL "round about",IDC_ICON_ALIGN_10,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,110,121,46,44 + CONTROL "",IDC_ICON_ALIGN_11,"Button",BS_OWNERDRAW | BS_BOTTOM | + WS_TABSTOP,159,121,46,44 + CONTROL "Ïîêàçûâàòü Íîìåð &Âåðñèè",ID_DESKTOP_VERSION,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,177,109,10 +END + +IDD_DESKBAR_STARTMENU DIALOG DISCARDABLE 0, 0, 210, 194 +STYLE WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Ñâîéòñâà ìåíþ Ïóñê" +FONT 8, "MS Sans Serif" +BEGIN +END + +IDD_DESKBAR_TASKBAR DIALOGEX 0, 0, 227, 202 +STYLE WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Ñâîéñòâà ïàíåëè çàäà÷" +FONT 8, "MS Sans Serif", 0, 0, 0x1 +BEGIN + CONTROL "Îòîáðàæàòü &÷àñû",ID_SHOW_CLOCK,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,17,161,76,10 + CONTROL "&Ñêðûâàòü íåèñïîëüçóåìûå çíà÷êè",ID_HIDE_INACTIVE_ICONS, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,17,178,135,10 + PUSHBUTTON "&Óâåäîìëåíèÿ...",ID_CONFIG_NOTIFYAREA,156,174,63,14 +END + +IDD_EXECUTE DIALOGEX 15, 13, 210, 63 +STYLE DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Âûïîëíèòü" +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + CONTROL "",101,"Static",SS_SIMPLE | SS_NOPREFIX,3,6,150,10 + CONTROL "&Êîìàíäà:",-1,"Static",SS_LEFTNOWORDWRAP | WS_GROUP,3, + 18,60,10 + EDITTEXT 201,3,29,134,12,ES_AUTOHSCROLL + CONTROL "As &Symbol",214,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,3, + 45,71,12 + DEFPUSHBUTTON "&OK",1,158,6,47,14 + PUSHBUTTON "&Îòìåíà",2,158,24,47,14 + PUSHBUTTON "&Ñïðàâêà",254,158,42,47,14 +END + +IDD_MDI_SDI DIALOGEX 0, 0, 194, 157 +STYLE WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +EXSTYLE WS_EX_APPWINDOW +CAPTION "Âûáåðèòå ðåæèì MDI / SDI" +FONT 8, "MS Sans Serif", 0, 0, 0x1 +BEGIN + LTEXT "Âûáåðèòå íàèáîëåå ïðåäïî÷òèòåëüíûé äëÿ âàñ\nâèä ïðîâîäíèêà:", + IDC_STATIC,7,7,171,17 + CONTROL "&MDI (ìíîãîäîêóìåíòíûé íòåðôåéñ)",IDC_MDI,"Button", + BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,7,31,136,10 + CONTROL "&SDI (îäíîäîêóìåíòíûé èíòåðôåéñ)",IDC_SDI,"Button", + BS_AUTORADIOBUTTON,7,62,134,10 + CONTROL 170,IDC_STATIC,"Static",SS_BITMAP,145,23,15,13 + CONTROL 171,IDC_STATIC,"Static",SS_BITMAP,145,57,15,13 + CONTROL "Open Subfolders in s&eparate windows", + IDC_SEPARATE_SUBFOLDERS,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,90,135,10 + LTEXT "Ýòè íàñòðîéêè áóäóò èñïîëüçîâàííû, êàê çíà÷åíèå ïî óìîë÷àíèþ äëÿ âñåõ îêîí ïðîâîäíèêà â áóäóùåì.", + IDC_STATIC,7,107,174,26 + DEFPUSHBUTTON "&OK",IDOK,29,136,50,14,WS_GROUP + PUSHBUTTON "&Cancel",IDCANCEL,106,136,50,14 +END + +IDD_NOTIFYAREA DIALOGEX 0, 0, 208, 174 +STYLE WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | + WS_SYSMENU | WS_THICKFRAME +EXSTYLE WS_EX_APPWINDOW +CAPTION "Êîíôèãóðàöèÿ çíà÷êîâ" +FONT 8, "MS Sans Serif", 0, 0, 0x1 +BEGIN + CONTROL "Tree1",IDC_NOTIFY_ICONS,"SysTreeView32",TVS_HASLINES | + TVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,7,7,194,31 + LTEXT "&Òåêñò Ïîäñêàçêè:",IDC_LABEL1,7,44,62,8 + EDITTEXT IDC_NOTIFY_TOOLTIP,76,42,125,14,ES_AUTOHSCROLL + LTEXT "Çàãîëîâîê Î&êíà:",IDC_LABEL2,7,63,58,8 + EDITTEXT IDC_NOTIFY_TITLE,76,60,125,14,ES_AUTOHSCROLL + LTEXT "&Ïóòü ê Ìîäóëþ:",IDC_LABEL3,7,81,54,8 + EDITTEXT IDC_NOTIFY_MODULE,76,78,125,14,ES_AUTOHSCROLL + GROUPBOX "&Ðåæèì Îòîáðàæåíèÿ",IDC_LABEL4,7,96,169,28 + CONTROL "&ïîêàçàòü",IDC_NOTIFY_SHOW,"Button",BS_AUTORADIOBUTTON | + WS_TABSTOP,15,108,47,10 + CONTROL "&ñêðûòü",IDC_NOTIFY_HIDE,"Button",BS_AUTORADIOBUTTON,66, + 108,41,10 + CONTROL "à&âòîñêðûòèå",IDC_NOTIFY_AUTOHIDE,"Button", + BS_AUTORADIOBUTTON,112,108,60,10 + ICON "",IDC_PICTURE,181,101,20,20 + LTEXT "&Ïîñëåäíèå\nÈçìåíåíèÿ",IDC_LABEL6,7,129,40,19 + EDITTEXT IDC_LAST_CHANGE,59,129,105,14,ES_AUTOHSCROLL | + ES_READONLY + CONTROL "ïîêà&çàòü ñêðûòîå",ID_SHOW_HIDDEN_ICONS,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,154,78,10 + DEFPUSHBUTTON "&OK",IDOK,91,153,50,14,WS_GROUP + PUSHBUTTON "&Îòìåíà",IDCANCEL,151,153,50,14 +END + +IDD_SEARCH_PROGRAM DIALOGEX 0, 0, 200, 65 +STYLE WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | + WS_SYSMENU | WS_THICKFRAME +EXSTYLE WS_EX_APPWINDOW +CAPTION "Ïîèñê ïðîãðàììû â Ïñóêå" +FONT 8, "MS Sans Serif", 0, 0, 0x1 +BEGIN + LTEXT "&Ôèëüòð:",IDC_STATIC,7,9,30,8 + EDITTEXT IDC_FILTER,40,7,94,14,ES_AUTOHSCROLL + CONTROL "List1",IDC_PROGRAMS_FOUND,"SysListView32",LVS_REPORT | + LVS_SHOWSELALWAYS | LVS_SORTASCENDING | WS_BORDER | + WS_TABSTOP,7,25,186,33 + PUSHBUTTON "&Ïðîâåðèòü",IDC_CHECK_ENTRIES,143,7,50,14 +END + + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE DISCARDABLE +BEGIN + IDS_TITLE "Ïðîâîäíèê Reactos" + IDS_START "Ïóñê" + IDS_LOGOFF "Âûõîä èç ñèñòåìû..." + IDS_SHUTDOWN "Âûêëþ÷èòü..." + IDS_LAUNCH "Âûïîëíèòü..." + IDS_START_HELP "Ñïðàâêà" + IDS_SEARCH_FILES "Ïîèñê..." + IDS_DOCUMENTS "Äîêóìåíòû" + IDS_FAVORITES "Èçáðàííîå" + IDS_PROGRAMS "Ïðîãðàììû" + IDS_SETTINGS "Íàñòðîéêè" + IDS_EXPLORE "Îáçîð" + IDS_EMPTY "(Ïóñòî)" + IDS_RECENT "Íåäàâíèå äîêóìåíòû" + IDS_ADMIN "Àäìèíèñòðèðîâàíèå" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_NETWORK "Ñåòü" + IDS_CONNECTIONS "Ñåòåâûå ïîäêëþ÷åíèÿ" + IDS_DRIVES "Äèñêè" + IDS_SEARCH_COMPUTER "Íàéòè êîìïüþòåð..." + IDS_SETTINGS_MENU "Íàñòðîéêà ìåíþ" + IDS_CONTROL_PANEL "Ïàíåëü óïðàâëåíèÿ" + IDS_PRINTERS "Ïðèíòåðû" + IDS_BROWSE "Îáçîð ôàéëîâ" + IDS_SEARCH_PRG "Íàéòè ïðîãðàììó..." + IDS_ALL_USERS "Âñå ïîëüçîâàòåëè\\" + IDS_SEARCH "Ïîèñê" + IDS_ABOUT_EXPLORER "&Î Ïðîâîäíèêå..." + IDS_LAUNCH_MANY_PROGRAMS + "Âû âûáðàëè áîëåå îäíîé ïðîãðàììû.\nÂû óâåðåíû, ÷òî õîòèòå âûïîëíèòü èõ âñå?" + IDS_DESKTOPBAR_SETTINGS "Íàñòðîéêè ðàáî÷åãî ñòîëà" + IDS_DESKTOP "Ðàáî÷èé Ñòîë" + IDS_TASKBAR "Ïàíåëü çàäà÷" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_STARTMENU "Ìåíþ Ïóñêà" + IDS_MINIMIZE_ALL "ñâåðíóòü âñå îêíà" + IDS_DESKTOP_NUM "Ðàáî÷èé Ñòîë %d" + IDS_VOLUME "Îáú¸ì" + IDS_ITEMS_CUR "òåêóùåé ýëåìåíò" + IDS_ITEMS_CONFIGURED "êîíôèãóðàöèÿ" + IDS_ITEMS_VISIBLE "âèäèìûé" + IDS_ITEMS_HIDDEN "ñêðûòûé" + IDS_NOTIFY_SHOW "ïîêàçàòü" + IDS_NOTIFY_HIDE "ñêðûòü" + IDS_NOTIFY_AUTOHIDE "àâòîñêðûòèå" + IDS_SHOW_HIDDEN_ICONS "Ïîêàçàòü ñêðûòûå çíà÷êè" + IDS_HIDE_ICONS "Ñêðûòü çíà÷êè" + IDS_TERMINATE "Çàâåðøèòü ðàáîòó Ïðîâîäíèêà" +END + +#endif // Russian resources +///////////////////////////////////////////////////////////////////////////// + + +///////////////////////////////////////////////////////////////////////////// +// German (Germany) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DEU) +#ifdef _WIN32 +LANGUAGE LANG_GERMAN, SUBLANG_GERMAN +#pragma code_page(1252) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "#include ""resource.h""\r\n" + "#define APSTUDIO_HIDDEN_SYMBOLS\r\n" + "#include ""windows.h""\r\n" + "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n" + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + +#endif // German (Germany) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/reactos/base/shell/explorer/explorer-sv.rc b/reactos/base/shell/explorer/explorer-sv.rc new file mode 100644 index 00000000000..cb82147b4bc --- /dev/null +++ b/reactos/base/shell/explorer/explorer-sv.rc @@ -0,0 +1,394 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// German (Germany) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DEU) +#ifdef _WIN32 +LANGUAGE LANG_GERMAN, SUBLANG_GERMAN +#pragma code_page(1252) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE MOVEABLE PURE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE MOVEABLE PURE +BEGIN + "#include \r\n" + "\0" +END + +3 TEXTINCLUDE MOVEABLE PURE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + +#endif // German (Germany) resources +///////////////////////////////////////////////////////////////////////////// + + +///////////////////////////////////////////////////////////////////////////// +// Swedish resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_SVE) +#ifdef _WIN32 +LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL +#pragma code_page(1252) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Menu +// + +IDM_MDIFRAME MENU DISCARDABLE +BEGIN + POPUP "&Arkiv" + BEGIN + MENUITEM "&Kör...", ID_EXECUTE + MENUITEM SEPARATOR + MENUITEM "&Avsluta", ID_FILE_EXIT + END + POPUP "&Visa" + BEGIN + MENUITEM "&Verktygsfält", ID_VIEW_TOOL_BAR + MENUITEM "&Extrafält", ID_VIEW_EXTRA_BAR + MENUITEM "E&nhetsfält", ID_VIEW_DRIVE_BAR, CHECKED + MENUITEM "S&idfält", ID_VIEW_SIDE_BAR + MENUITEM "&Statusfält", ID_VIEW_STATUSBAR + MENUITEM SEPARATOR + MENUITEM "&Uppdatera\tF5", ID_REFRESH + MENUITEM "F&ullskärm\tCtrl+Shift+S", ID_VIEW_FULLSCREEN + MENUITEM "SDI", ID_VIEW_SDI + END + POPUP "&Fönster" + BEGIN + MENUITEM "Nytt &fönster", ID_WINDOW_NEW + MENUITEM "Överlappande\tShift+F5", ID_WINDOW_CASCADE + MENUITEM "Ordna &horizontellt", ID_WINDOW_TILE_HORZ + MENUITEM "Ordna &vertikalt\tShift+F4", ID_WINDOW_TILE_VERT + MENUITEM "Ordna automatiskt", ID_WINDOW_AUTOSORT + MENUITEM "Ordna &symboler", ID_WINDOW_ARRANGE + END + POPUP "&Verktyg" + BEGIN + MENUITEM "&Alternativ", ID_TOOLS_OPTIONS + END + POPUP "&Hjälp" + BEGIN + MENUITEM "Explorer &FAQ...", ID_EXPLORER_FAQ + MENUITEM "Om &Explorer...", ID_ABOUT_EXPLORER + MENUITEM "Om &OS...", ID_ABOUT_WINDOWS + END +END + +IDM_DESKTOPBAR MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Inställningar...", ID_DESKTOPBAR_SETTINGS + MENUITEM "&Aktivitetshanteraren...", ID_TASKMGR + MENUITEM SEPARATOR + MENUITEM "&Om Explorer...", ID_ABOUT_EXPLORER + END +END + +IDM_VOLUME MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "Öppna volymkontroll", ID_TRAY_VOLUME + MENUITEM "Justera ljudinställningar", ID_VOLUME_PROPERTIES + END +END + +IDM_NOTIFYAREA MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Visa dolda ikoner", ID_SHOW_HIDDEN_ICONS + MENUITEM "Visa &ikonknapp", ID_SHOW_ICON_BUTTON + MENUITEM "&Konfigurera meddelanden...", ID_CONFIG_NOTIFYAREA + MENUITEM "Justera &datum och &tid...", ID_CONFIG_TIME + MENUITEM SEPARATOR + MENUITEM "&Om Explorer...", ID_ABOUT_EXPLORER + END +END + +IDM_SDIFRAME MENU DISCARDABLE +BEGIN + POPUP "&Arkiv" + BEGIN + MENUITEM "&Kör...", ID_EXECUTE + MENUITEM SEPARATOR + MENUITEM "&Avsluta", ID_FILE_EXIT + END + POPUP "&Visa" + BEGIN + MENUITEM "&Verktygsfält", ID_VIEW_TOOL_BAR + MENUITEM "&Sidfält", ID_VIEW_SIDE_BAR, GRAYED + MENUITEM "&Statusfält", ID_VIEW_STATUSBAR + MENUITEM SEPARATOR + MENUITEM "&Uppdatera\tF5", ID_REFRESH + MENUITEM "&Fullskärm\tCtrl+Shift+S", ID_VIEW_FULLSCREEN + MENUITEM "&MDI", ID_VIEW_MDI + END + POPUP "&Verktyg" + BEGIN + MENUITEM "&Alternativ", ID_TOOLS_OPTIONS + END + POPUP "&Hjälp" + BEGIN + MENUITEM "Explorer &FAQ...", ID_EXPLORER_FAQ + MENUITEM "&Om Explorer...", ID_ABOUT_EXPLORER + MENUITEM "Om &operativsystemet...", ID_ABOUT_WINDOWS + END +END + + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_EXECUTE DIALOG DISCARDABLE 15, 13, 210, 63 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Kör" +FONT 8, "MS Shell Dlg" +BEGIN + CONTROL "",101,"Static",SS_SIMPLE | SS_NOPREFIX,3,6,162,10 + CONTROL "&Kommando:",-1,"Static",SS_LEFTNOWORDWRAP | WS_GROUP,3, + 18,60,10 + EDITTEXT 201,3,29,134,12,ES_AUTOHSCROLL + CONTROL "&Som symbol",214,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, + 3,45,71,12 + DEFPUSHBUTTON "&OK",1,158,6,47,14 + PUSHBUTTON "&Avbryt",2,158,23,47,14 + PUSHBUTTON "&Hjälp",254,158,43,47,14 +END + +IDD_SEARCH_PROGRAM DIALOGEX 0, 0, 200, 65 +STYLE WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | + WS_SYSMENU | WS_THICKFRAME +EXSTYLE WS_EX_APPWINDOW +CAPTION "Sök program på startmenyn" +FONT 8, "MS Sans Serif", 0, 0, 0x1 +BEGIN + LTEXT "&Filter:",IDC_STATIC,7,9,18,8 + EDITTEXT IDC_FILTER,34,7,100,14,ES_AUTOHSCROLL + CONTROL "List1",IDC_PROGRAMS_FOUND,"SysListView32",LVS_REPORT | + LVS_SHOWSELALWAYS | LVS_SORTASCENDING | WS_BORDER | + WS_TABSTOP,7,25,186,33 + PUSHBUTTON "&Kontrollera poster",IDC_CHECK_ENTRIES,143,7,50,14 +END + +IDD_DESKBAR_DESKTOP DIALOG DISCARDABLE 0, 0, 212, 194 +STYLE WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Skrivbordsinställningar" +FONT 8, "MS Sans Serif" +BEGIN + LTEXT "Välj från vilket hörn och åt vilket håll du föredrar att rada upp ikonerna:", + IDC_STATIC,7,7,166,8 + CONTROL "vä. och neråt",IDC_ICON_ALIGN_0,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,7,25,46,44 + CONTROL "övre åt hö.",IDC_ICON_ALIGN_1,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,57,25,46,44 + CONTROL "övre åt vä.",IDC_ICON_ALIGN_2,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,110,25,46,44 + CONTROL "hö. och neråt",IDC_ICON_ALIGN_3,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,159,25,46,44 + CONTROL "vä. och uppåt",IDC_ICON_ALIGN_4,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,7,73,46,44 + CONTROL "nedre åt hö.",IDC_ICON_ALIGN_5,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,57,73,46,44 + CONTROL "nedre åt vä.",IDC_ICON_ALIGN_6,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,110,73,46,44 + CONTROL "hö. och uppåt",IDC_ICON_ALIGN_7,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,159,73,46,44 + CONTROL "sidor och ner",IDC_ICON_ALIGN_8,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,7,121,46,44 + CONTROL "kanter",IDC_ICON_ALIGN_9,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,57,121,46,44 + CONTROL "runt om",IDC_ICON_ALIGN_10,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,110,121,46,44 + CONTROL "",IDC_ICON_ALIGN_11,"Button",BS_OWNERDRAW | BS_BOTTOM | + WS_TABSTOP,159,121,46,44 + CONTROL "Visa &versionsnummer",ID_DESKTOP_VERSION,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,177,91,10 +END + +IDD_DESKBAR_TASKBAR DIALOG DISCARDABLE 0, 0, 210, 194 +STYLE WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Aktivitetsfältsinställningar" +FONT 8, "MS Sans Serif" +BEGIN + CONTROL "visa &klockan",ID_SHOW_CLOCK,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,152,52,10 + CONTROL "&Göm inaktiva meddelandeikoner",ID_HIDE_INACTIVE_ICONS, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,174,111,10 + PUSHBUTTON "&Meddelanden...",ID_CONFIG_NOTIFYAREA,153,173,50,14 +END + +IDD_DESKBAR_STARTMENU DIALOG DISCARDABLE 0, 0, 210, 194 +STYLE WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Startmenyinställningar" +FONT 8, "MS Sans Serif" +BEGIN +END + +IDD_NOTIFYAREA DIALOGEX 0, 0, 208, 174 +STYLE WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | + WS_SYSMENU | WS_THICKFRAME +EXSTYLE WS_EX_APPWINDOW +CAPTION "Inställningar för meddelandeikoner" +FONT 8, "MS Sans Serif", 0, 0, 0x1 +BEGIN + CONTROL "Tree1",IDC_NOTIFY_ICONS,"SysTreeView32",TVS_HASLINES | + TVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,7,7,194,31 + LTEXT "&Hjälptext:",IDC_LABEL1,7,44,40,8 + EDITTEXT IDC_NOTIFY_TOOLTIP,58,42,143,14,ES_AUTOHSCROLL + LTEXT "&Fönstertitel:",IDC_LABEL2,7,63,44,8 + EDITTEXT IDC_NOTIFY_TITLE,58,60,143,14,ES_AUTOHSCROLL + LTEXT "&Modulsökväg:",IDC_LABEL3,7,81,43,8 + EDITTEXT IDC_NOTIFY_MODULE,58,78,143,14,ES_AUTOHSCROLL + GROUPBOX "&Visningsläge",IDC_LABEL4,7,96,157,28 + CONTROL "v&isa",IDC_NOTIFY_SHOW,"Button",BS_AUTORADIOBUTTON | + WS_TABSTOP,15,108,33,10 + CONTROL "&dölj",IDC_NOTIFY_HIDE,"Button",BS_AUTORADIOBUTTON,66, + 108,29,10 + CONTROL "dölj a&utomatiskt",IDC_NOTIFY_AUTOHIDE,"Button", + BS_AUTORADIOBUTTON,112,108,43,10 + ICON "",IDC_PICTURE,173,101,21,20 + LTEXT "&Senast ändrad:",IDC_LABEL6,7,132,43,8 + EDITTEXT IDC_LAST_CHANGE,59,129,105,14,ES_AUTOHSCROLL | + ES_READONLY + CONTROL "visa d&olda",ID_SHOW_HIDDEN_ICONS,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,154,56,10 + DEFPUSHBUTTON "&OK",IDOK,91,153,50,14,WS_GROUP + PUSHBUTTON "&Avbryt",IDCANCEL,151,153,50,14 +END + +IDD_MDI_SDI DIALOGEX 0, 0, 194, 157 +STYLE WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +EXSTYLE WS_EX_APPWINDOW +CAPTION "Välj MDI / SDI Läge" +FONT 8, "MS Sans Serif", 0, 0, 0x1 +BEGIN + LTEXT "Välj det gränssnitt du föredrar:",IDC_STATIC,7,7,160,8 + CONTROL "&MDI (multiple document interface)",IDC_MDI,"Button", + BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,7,31,121,10 + CONTROL "&SDI (single document interface)",IDC_SDI,"Button", + BS_AUTORADIOBUTTON,7,62,115,10 + CONTROL 170,IDC_STATIC,"Static",SS_BITMAP,145,23,15,13 + CONTROL 171,IDC_STATIC,"Static",SS_BITMAP,145,57,15,13 + CONTROL "Open Subfolders in s&eparate windows", + IDC_SEPARATE_SUBFOLDERS,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,90,135,10 + LTEXT "Den här inställningen kommer att gälla som standard i alla nya explorer-fönster.", + IDC_STATIC,7,107,174,22 + DEFPUSHBUTTON "&OK",IDOK,29,136,50,14,WS_GROUP + PUSHBUTTON "&Avbryt",IDCANCEL,106,136,50,14 +END + + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE DISCARDABLE +BEGIN + IDS_TITLE "Reactos Explorer" + IDS_START "Start" + IDS_LOGOFF "Logga ut..." + IDS_SHUTDOWN "Stäng av..." + IDS_LAUNCH "Kör..." + IDS_START_HELP "Hjälp" + IDS_SEARCH_FILES "Sök..." + IDS_DOCUMENTS "Dokument" + IDS_FAVORITES "Favoriter" + IDS_PROGRAMS "Program" + IDS_SETTINGS "Inställningar" + IDS_EXPLORE "Utforska" + IDS_EMPTY "(tom)" + IDS_RECENT "Senaste dokumenten" + IDS_ADMIN "Administration" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_STARTMENU "Startmeny" + IDS_MINIMIZE_ALL "minimera alla fönster" + IDS_DESKTOP_NUM "Skrivbord %d" + IDS_VOLUME "Volym" + IDS_ITEMS_CUR "aktuella meddelanden" + IDS_ITEMS_CONFIGURED "konfiguration" + IDS_ITEMS_VISIBLE "synlig" + IDS_ITEMS_HIDDEN "dold" + IDS_NOTIFY_SHOW "visa" + IDS_NOTIFY_HIDE "dölj" + IDS_NOTIFY_AUTOHIDE "dölj automatiskt" + IDS_SHOW_HIDDEN_ICONS "Visa dolda ikoner" + IDS_HIDE_ICONS "Dölj ikoner" + IDS_TERMINATE "Avsluta Explorer" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_NETWORK "Nätverk" + IDS_CONNECTIONS "Nätverksanslutningar" + IDS_DRIVES "Enheter" + IDS_SEARCH_COMPUTER "Sök dator..." + IDS_SETTINGS_MENU "Inställningsmeny" + IDS_CONTROL_PANEL "Kontrollpanelen" + IDS_PRINTERS "Skrivare" + IDS_BROWSE "Utforska filer" + IDS_SEARCH_PRG "Sök program..." + IDS_ALL_USERS "Alla användare\\" + IDS_SEARCH "Sök" + IDS_ABOUT_EXPLORER "&Om Explorer..." + IDS_LAUNCH_MANY_PROGRAMS + "Du har valt fler än ett program.\nÄr du säker på att du vill öppna dem alla?" + IDS_DESKTOPBAR_SETTINGS "Skrivbordsinställningar" + IDS_DESKTOP "Skrivbord" + IDS_TASKBAR "Aktivitetsfält" +END + +#endif // Swedish resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/reactos/base/shell/explorer/explorer-uk.rc b/reactos/base/shell/explorer/explorer-uk.rc new file mode 100644 index 00000000000..482bbfe221d --- /dev/null +++ b/reactos/base/shell/explorer/explorer-uk.rc @@ -0,0 +1,399 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// Ukrainian resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_UKR) +#ifdef _WIN32 +LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT +#pragma code_page(1251) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Menu +// + +IDM_MDIFRAME MENU DISCARDABLE +BEGIN + POPUP "&Ôàéë" + BEGIN + MENUITEM "&Âèêîíàòè...", ID_EXECUTE + MENUITEM SEPARATOR + MENUITEM "Â&èõ³ä", ID_FILE_EXIT + END + POPUP "&Âèãëÿä" + BEGIN + MENUITEM "&Ïàíåëü ³íñòðóìåíò³â", ID_VIEW_TOOL_BAR + MENUITEM "&Äîäàòêîâà ïàíåëü", ID_VIEW_EXTRA_BAR + MENUITEM "Ä&èñêè", ID_VIEW_DRIVE_BAR, CHECKED + MENUITEM "&Âèáðàíå", ID_VIEW_SIDE_BAR + MENUITEM "&Ðÿäîê ñòàíó", ID_VIEW_STATUSBAR + MENUITEM SEPARATOR + MENUITEM "&Îíîâèòè\tF5", ID_REFRESH + MENUITEM "Ïîâíèé &åêðàí\tCtrl+Shift+S", ID_VIEW_FULLSCREEN + MENUITEM "SDI", ID_VIEW_SDI + END + POPUP "Â&³êíà" + BEGIN + MENUITEM "&Íîâå â³êíî", ID_WINDOW_NEW + MENUITEM "&Êàñêàäîì\tShift+F5", ID_WINDOW_CASCADE + MENUITEM "&Ãîðèçîíòàëüíî", ID_WINDOW_TILE_HORZ + MENUITEM "&Âåðòèêàëüíî\tShift+F4", ID_WINDOW_TILE_VERT + MENUITEM "Óïîðÿäêóâàòè àâòîìàòè÷íî", ID_WINDOW_AUTOSORT + MENUITEM "Óïîðÿäêóâàòè &çíà÷êè", ID_WINDOW_ARRANGE + END + POPUP "&²íñòðóìåíòè" + BEGIN + MENUITEM "&Îïö³¿", ID_TOOLS_OPTIONS + END + POPUP "&Äîâ³äêà" + BEGIN + MENUITEM "&FAQ(×àÏè) ïî Ïðîâ³äíèêó...", ID_EXPLORER_FAQ + MENUITEM "Ïðî &Ïðîâ³äíèê...", ID_ABOUT_EXPLORER + MENUITEM "Ïðî &ÎÑ...", ID_ABOUT_WINDOWS + END +END + +IDM_DESKTOPBAR MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Íàñòðîéêè...", ID_DESKTOPBAR_SETTINGS + MENUITEM "Ä&èñïåò÷åð çàâäàíü...", ID_TASKMGR + MENUITEM SEPARATOR + MENUITEM "&Ïðî Ïðîâ³äíèê...", ID_ABOUT_EXPLORER + END +END + +IDM_VOLUME MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "Ãó÷í³ñòü", ID_TRAY_VOLUME + MENUITEM "&Âëàñòèâîñò³ çâóêó", ID_VOLUME_PROPERTIES + END +END + +IDM_NOTIFYAREA MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&³äîáðàæàòè ïðèõîâàí³ çíà÷êè", ID_SHOW_HIDDEN_ICONS + MENUITEM "³äîáðàæàòè çíà÷êè íà &êíîïêàõ", ID_SHOW_ICON_BUTTON + MENUITEM "&Í&àñòðîéêà ñïîâ³ùåíü...", ID_CONFIG_NOTIFYAREA + MENUITEM "&Íàñòðîéêà äàòè é ÷àñó...", ID_CONFIG_TIME + MENUITEM SEPARATOR + MENUITEM "&Ïðî Ïðîâ³äíèê...", ID_ABOUT_EXPLORER + END +END + +IDM_SDIFRAME MENU DISCARDABLE +BEGIN + POPUP "&Ôàéë" + BEGIN + MENUITEM "&Âèêîíàòè...", ID_EXECUTE + MENUITEM SEPARATOR + MENUITEM "Â&èõ³ä", ID_FILE_EXIT + END + POPUP "&Âèãëÿä" + BEGIN + MENUITEM "&Ïàíåëü ³íñòðóìåíò³â", ID_VIEW_TOOL_BAR + MENUITEM "&Âèáðàíå", ID_VIEW_SIDE_BAR, GRAYED + MENUITEM "&Ðÿäîê ñòàíó", ID_VIEW_STATUSBAR + MENUITEM SEPARATOR + MENUITEM "&Îíîâèòè\tF5", ID_REFRESH + MENUITEM "Ïîâíèé &åêðàí\tCtrl+Shift+S", ID_VIEW_FULLSCREEN + MENUITEM "&MDI", ID_VIEW_MDI + END + POPUP "&²íñòðóìåíòè" + BEGIN + MENUITEM "&Îïö³¿", ID_TOOLS_OPTIONS + END + POPUP "&Äîâ³äêà" + BEGIN + MENUITEM "&FAQ(×àÏè) ïî Ïðîâ³äíèêó...", ID_EXPLORER_FAQ + MENUITEM "Ïðî &Ïðîâ³äíèê...", ID_ABOUT_EXPLORER + MENUITEM "Ïðî &ÎÑ...", ID_ABOUT_WINDOWS + END +END + + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_EXECUTE DIALOG DISCARDABLE 15, 13, 210, 63 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Âèêîíàòè" +FONT 8, "MS Shell Dlg" +BEGIN + CONTROL "",101,"Static",SS_SIMPLE | SS_NOPREFIX,3,6,150,10 + CONTROL "&Êîìàíäà:",-1,"Static",SS_LEFTNOWORDWRAP | WS_GROUP,3, + 18,60,10 + EDITTEXT 201,3,29,134,12,ES_AUTOHSCROLL + CONTROL "As &Symbol",214,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,3, + 45,71,12 + DEFPUSHBUTTON "&OK",1,158,6,47,14 + PUSHBUTTON "&Ñêàñóâàòè",2,158,23,47,14 + PUSHBUTTON "&Äîâ³äêà",254,158,43,47,14 +END + +IDD_SEARCH_PROGRAM DIALOGEX 0, 0, 200, 65 +STYLE WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | + WS_SYSMENU | WS_THICKFRAME +EXSTYLE WS_EX_APPWINDOW +CAPTION "Ïîøóê ïðîãðàìè â ìåíþ Ïóñê" +FONT 8, "MS Sans Serif", 0, 0, 0x1 +BEGIN + LTEXT "&Ô³ëüòð:",IDC_STATIC,7,9,18,8 + EDITTEXT IDC_FILTER,34,7,100,14,ES_AUTOHSCROLL + CONTROL "List1",IDC_PROGRAMS_FOUND,"SysListView32",LVS_REPORT | + LVS_SHOWSELALWAYS | LVS_SORTASCENDING | WS_BORDER | + WS_TABSTOP,7,25,186,33 + PUSHBUTTON "&Ïåðåâ³ðèòè",IDC_CHECK_ENTRIES,143,7,50,14 +END + +IDD_DESKBAR_DESKTOP DIALOG DISCARDABLE 0, 0, 212, 194 +STYLE WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Âëàñòèâîñò³ ðîáî÷îãî ñòîëà" +FONT 8, "MS Sans Serif" +BEGIN + LTEXT "Îáåð³òü íàéá³ëüø çðó÷íèé äëÿ âàñ àëãîðèòì âèð³âíþâàííÿ çíà÷ê³â:", + IDC_STATIC,7,7,166,8 + CONTROL "left/top dwn",IDC_ICON_ALIGN_0,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,7,25,46,44 + CONTROL "left/top right",IDC_ICON_ALIGN_1,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,57,25,46,44 + CONTROL "right/top left",IDC_ICON_ALIGN_2,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,110,25,46,44 + CONTROL "rig./top dwn",IDC_ICON_ALIGN_3,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,159,25,46,44 + CONTROL "left/bot. up",IDC_ICON_ALIGN_4,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,7,73,46,44 + CONTROL "left/bot. right",IDC_ICON_ALIGN_5,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,57,73,46,44 + CONTROL "right/bot. left",IDC_ICON_ALIGN_6,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,110,73,46,44 + CONTROL "rig./bot. dwn",IDC_ICON_ALIGN_7,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,159,73,46,44 + CONTROL "border down",IDC_ICON_ALIGN_8,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,7,121,46,44 + CONTROL "border H/V",IDC_ICON_ALIGN_9,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,57,121,46,44 + CONTROL "round about",IDC_ICON_ALIGN_10,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,110,121,46,44 + CONTROL "",IDC_ICON_ALIGN_11,"Button",BS_OWNERDRAW | BS_BOTTOM | + WS_TABSTOP,159,121,46,44 + CONTROL "³äîáðàæàòè Íîìåð &Âåðñ³¿",ID_DESKTOP_VERSION,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,177,91,10 +END + +IDD_DESKBAR_TASKBAR DIALOG DISCARDABLE 0, 0, 210, 194 +STYLE WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Âëàñòèâîñò³ ïàíåë³ çàâäàíü" +FONT 8, "MS Sans Serif" +BEGIN + CONTROL "³äîáðà&æàòè ãîäèííèê",ID_SHOW_CLOCK,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,152,52,10 + CONTROL "Ïðè&õîâóâàòè íåâèêîðèñòîâóâàí³ çíà÷êè", + ID_HIDE_INACTIVE_ICONS,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,174,111,10 + PUSHBUTTON "&Ñïîâ³ùåííÿ...",ID_CONFIG_NOTIFYAREA,153,173,50,14 +END + +IDD_DESKBAR_STARTMENU DIALOG DISCARDABLE 0, 0, 210, 194 +STYLE WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Âëàñòèâîñò³ ìåíþ Ïóñê" +FONT 8, "MS Sans Serif" +BEGIN +END + +IDD_NOTIFYAREA DIALOGEX 0, 0, 208, 174 +STYLE WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | + WS_SYSMENU | WS_THICKFRAME +EXSTYLE WS_EX_APPWINDOW +CAPTION "Êîíô³ãóðàö³ÿ çíà÷ê³â ñïîâ³ùåíü" +FONT 8, "MS Sans Serif", 0, 0, 0x1 +BEGIN + CONTROL "Tree1",IDC_NOTIFY_ICONS,"SysTreeView32",TVS_HASLINES | + TVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,7,7,194,31 + LTEXT "&Òåêñò ϳäêàçêè:",IDC_LABEL1,7,44,40,8 + EDITTEXT IDC_NOTIFY_TOOLTIP,58,42,143,14,ES_AUTOHSCROLL + LTEXT "Çàãîëîâîê Â&³êíà:",IDC_LABEL2,7,63,44,8 + EDITTEXT IDC_NOTIFY_TITLE,58,60,143,14,ES_AUTOHSCROLL + LTEXT "&Øëÿõ äî Ìîäóëÿ:",IDC_LABEL3,7,81,43,8 + EDITTEXT IDC_NOTIFY_MODULE,58,78,143,14,ES_AUTOHSCROLL + GROUPBOX "&Ðåæèì ³äîáðàæåííÿ",IDC_LABEL4,7,96,157,28 + CONTROL "&ïîêàçàòè",IDC_NOTIFY_SHOW,"Button",BS_AUTORADIOBUTTON | + WS_TABSTOP,15,108,33,10 + CONTROL "&ñõîâàòè",IDC_NOTIFY_HIDE,"Button",BS_AUTORADIOBUTTON,66, + 108,29,10 + CONTROL "à&âòîïðèõîâàííÿ",IDC_NOTIFY_AUTOHIDE,"Button", + BS_AUTORADIOBUTTON,112,108,43,10 + ICON "",IDC_PICTURE,173,101,21,20 + LTEXT "&Îñòàííÿ çì³íà:",IDC_LABEL6,7,132,43,8 + EDITTEXT IDC_LAST_CHANGE,59,129,105,14,ES_AUTOHSCROLL | + ES_READONLY + CONTROL "ïîêà&çàòè ïðèõîâàíå",ID_SHOW_HIDDEN_ICONS,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,154,56,10 + DEFPUSHBUTTON "&OK",IDOK,91,153,50,14,WS_GROUP + PUSHBUTTON "&Ñêàñóâàòè",IDCANCEL,151,153,50,14 +END + +IDD_MDI_SDI DIALOGEX 0, 0, 194, 157 +STYLE WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +EXSTYLE WS_EX_APPWINDOW +CAPTION "Îáåð³òü ðåæèì â³êîí Ïðîâ³äíèêà" +FONT 8, "MS Sans Serif", 0, 0, 0x1 +BEGIN + LTEXT "Îáåð³òü íàéá³ëüø çðó÷íèé äëÿ âàñ ³íòåðôåéñ ïðîâ³äíèêà:", + IDC_STATIC,7,7,160,8 + CONTROL "&MDI (áàãàòîäîêóìåíòíèé ³íòåðôåéñ)",IDC_MDI,"Button", + BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,7,31,124,10 + CONTROL "&SDI (îäíîäîêóìåíòíèé ³íòåðôåéñ)",IDC_SDI,"Button", + BS_AUTORADIOBUTTON,7,62,118,10 + CONTROL 170,IDC_STATIC,"Static",SS_BITMAP,145,23,15,13 + CONTROL 171,IDC_STATIC,"Static",SS_BITMAP,145,57,15,13 + CONTROL "³äêðèâàòè ï³äïàïêè â î&êðåìèõ â³êíàõ", + IDC_SEPARATE_SUBFOLDERS,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,90,135,10 + LTEXT "Ö³ íàñòðîéêè áóäóòü âèêîðèñòàí³ ÿê çíà÷åííÿ çà çàìîâ÷óâàííÿì äëÿ âñ³õ â³êîí ïðîâ³äíèêà â ìàéáóòíüîìó.", + IDC_STATIC,7,111,174,22 + DEFPUSHBUTTON "&OK",IDOK,29,136,50,14,WS_GROUP + PUSHBUTTON "&Ñêàñóâàòè",IDCANCEL,106,136,50,14 +END + +IDD_ABOUT_EXPLORER DIALOG DISCARDABLE 0, 0, 199, 106 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Ïðî Ïðîâ³äíèê ReactOS" +FONT 10, "MS Sans Serif" +BEGIN + LTEXT "Ïðîâ³äíèê ReactOS",IDC_ROS_EXPLORER,91,13,104,11 + LTEXT "V 0.9",IDC_VERSION_TXT,91,27,104,8 + LTEXT "(c) 2003-2005 Martin Fuchs",IDC_STATIC,91,42,104,8 + LTEXT "",IDC_WIN_VERSION,91,58,98,22 + LTEXT "http://www.sky.franken.de/explorer/",IDC_WWW,17,84,129, + 8 + CONTROL "&OK",IDOK,"Button",BS_OWNERDRAW | BS_FLAT | WS_GROUP, + 154,90,38,12 +END + + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE MOVEABLE PURE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE MOVEABLE PURE +BEGIN + "#include \r\n" + "\0" +END + +3 TEXTINCLUDE MOVEABLE PURE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE DISCARDABLE +BEGIN + IDS_TITLE "Ïðîâ³äíèê Reactos" + IDS_START "Ïóñê" + IDS_LOGOFF "Âèõ³ä ³ç ñèñòåìè..." + IDS_SHUTDOWN "Âèìêíåííÿ..." + IDS_LAUNCH "Âèêîíàòè..." + IDS_START_HELP "Äîâ³äêà" + IDS_SEARCH_FILES "Ïîøóê..." + IDS_DOCUMENTS "Äîêóìåíòè" + IDS_FAVORITES "Âèáðàíå" + IDS_PROGRAMS "Ïðîãðàìè" + IDS_SETTINGS "Íàñòðîéêè" + IDS_EXPLORE "Îãëÿä" + IDS_EMPTY "(Ïîðîæíüî)" + IDS_RECENT "Íåäàâí³ äîêóìåíòè" + IDS_ADMIN "Àäì³í³ñòðóâàííÿ" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_STARTMENU "Ìåíþ Ïóñê" + IDS_MINIMIZE_ALL "çãîðíóòè âñ³ â³êíà" + IDS_DESKTOP_NUM "Ðîáî÷èé Ñò³ë %d" + IDS_VOLUME "Ãó÷í³ñòü" + IDS_ITEMS_CUR "ïîòî÷í³ åëåìåíòè" + IDS_ITEMS_CONFIGURED "êîíô³ãóðàö³ÿ" + IDS_ITEMS_VISIBLE "âèäèìèé" + IDS_ITEMS_HIDDEN "ïðèõîâàíèé" + IDS_NOTIFY_SHOW "ïîêàçàòè" + IDS_NOTIFY_HIDE "ñõîâàòè" + IDS_NOTIFY_AUTOHIDE "àâòîïðèõîâàííÿ" + IDS_SHOW_HIDDEN_ICONS "Ïîêàçàòè ïðèõîâàí³ çíà÷êè" + IDS_HIDE_ICONS "Ñõîâàòè çíà÷êè" + IDS_TERMINATE "Çàâåðøèòè ðîáîòó Ïðîâ³äíèêà" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_NETWORK "Ìåðåæà" + IDS_CONNECTIONS "Ìåðåæí³ ï³äêëþ÷åííÿ" + IDS_DRIVES "Äèñêè" + IDS_SEARCH_COMPUTER "Ïîøóê êîìï’þòåðà..." + IDS_SETTINGS_MENU "Ìåíþ Íàñòðîéêà" + IDS_CONTROL_PANEL "Ïàíåëü êåðóâàííÿ" + IDS_PRINTERS "Ïðèíòåðè" + IDS_BROWSE "Îãëÿä ôàéë³â" + IDS_SEARCH_PRG "Ïîøóê ïðîãðàìè..." + IDS_ALL_USERS "Âñ³ êîðèñòóâà÷³\\" + IDS_SEARCH "Ïîøóê" + IDS_ABOUT_EXPLORER "&Ïðî Ïðîâ³äíèê..." + IDS_LAUNCH_MANY_PROGRAMS + "Âè îáðàëè á³ëüøå îäí³º¿ ïðîãðàìè.\nÂè âïåâíåí³, ùî õî÷åòå çàïóñòèòè ¿õ âñ³?" + IDS_DESKTOPBAR_SETTINGS "Íàñòðîéêè ðîáî÷îãî ñòîëà" + IDS_DESKTOP "Ðîáî÷èé Ñò³ë" + IDS_TASKBAR "Ïàíåëü çàâäàíü" +END + +#endif // Ukrainian resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/reactos/base/shell/explorer/explorer.cpp b/reactos/base/shell/explorer/explorer.cpp new file mode 100644 index 00000000000..eb386bed614 --- /dev/null +++ b/reactos/base/shell/explorer/explorer.cpp @@ -0,0 +1,1150 @@ +/* + * Copyright 2003, 2004, 2005 Martin Fuchs + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + + // + // Explorer clone + // + // explorer.cpp + // + // Martin Fuchs, 23.07.2003 + // + // Credits: Thanks to Leon Finker for his explorer cabinet window example + // + + +#include // instead of "precomp.h" because the ROS build system needs this to find the precompiled header file (*.gch) in the output directory tree + +#include "resource.h" + +#include // for setlocale() + +#ifndef __WINE__ +#include // for dup2() +#include // for _O_RDONLY +#endif + +#include "dialogs/settings.h" // for MdiSdiDlg + +#include "services/shellservices.h" + + +extern "C" int initialize_gdb_stub(); // start up GDB stub + + +DynamicLoadLibFct g_SHDOCVW_ShellDDEInit(TEXT("SHDOCVW"), 118); + + +ExplorerGlobals g_Globals; + + +ExplorerGlobals::ExplorerGlobals() +{ + _hInstance = 0; + _cfStrFName = 0; + +#ifndef ROSSHELL + _hframeClass = 0; + _hMainWnd = 0; + _desktop_mode = false; + _prescan_nodes = false; +#endif + + _log = NULL; +#ifndef __MINGW32__ // SHRestricted() missing in MinGW (as of 29.10.2003) + _SHRestricted = 0; +#endif + _hwndDesktopBar = 0; + _hwndShellView = 0; + _hwndDesktop = 0; +} + + +void ExplorerGlobals::init(HINSTANCE hInstance) +{ + _hInstance = hInstance; + +#ifndef __MINGW32__ // SHRestricted() missing in MinGW (as of 29.10.2003) + _SHRestricted = (DWORD(STDAPICALLTYPE*)(RESTRICTIONS)) GetProcAddress(GetModuleHandle(TEXT("SHELL32")), "SHRestricted"); +#endif + + _icon_cache.init(); +} + + +void ExplorerGlobals::read_persistent() +{ + // read configuration file + _cfg_dir.printf(TEXT("%s\\ReactOS"), (LPCTSTR)SpecialFolderFSPath(CSIDL_APPDATA,0)); + _cfg_path.printf(TEXT("%s\\ros-explorer-cfg.xml"), _cfg_dir.c_str()); + + if (!_cfg.read(_cfg_path)) { + if (_cfg._last_error != XML_ERROR_NO_ELEMENTS) + MessageBox(g_Globals._hwndDesktop, String(_cfg._last_error_msg.c_str()), + TEXT("ROS Explorer - reading user settings"), MB_OK); + + _cfg.read(TEXT("explorer-cfg-template.xml")); + } + + // read bookmarks + _favorites_path.printf(TEXT("%s\\ros-explorer-bookmarks.xml"), _cfg_dir.c_str()); + + if (!_favorites.read(_favorites_path)) { + _favorites.import_IE_favorites(0); + _favorites.write(_favorites_path); + } +} + +void ExplorerGlobals::write_persistent() +{ + // write configuration file + RecursiveCreateDirectory(_cfg_dir); + + _cfg.write(_cfg_path); + _favorites.write(_favorites_path); +} + + +XMLPos ExplorerGlobals::get_cfg() +{ + XMLPos cfg_pos(&_cfg); + + cfg_pos.smart_create("explorer-cfg"); + + return cfg_pos; +} + +XMLPos ExplorerGlobals::get_cfg(const char* path) +{ + XMLPos cfg_pos(&_cfg); + + cfg_pos.smart_create("explorer-cfg"); + cfg_pos.create_relative(path); + + return cfg_pos; +} + + +void _log_(LPCTSTR txt) +{ + FmtString msg(TEXT("%s\n"), txt); + + if (g_Globals._log) + _fputts(msg, g_Globals._log); + + OutputDebugString(msg); +} + + +bool FileTypeManager::is_exe_file(LPCTSTR ext) +{ + static const LPCTSTR s_executable_extensions[] = { + TEXT("COM"), + TEXT("EXE"), + TEXT("BAT"), + TEXT("CMD"), + TEXT("CMM"), + TEXT("BTM"), + TEXT("AWK"), + 0 + }; + + TCHAR ext_buffer[_MAX_EXT]; + const LPCTSTR* p; + LPCTSTR s; + LPTSTR d; + + for(s=ext+1,d=ext_buffer; (*d=toupper(*s)); s++) + ++d; + + for(p=s_executable_extensions; *p; p++) + if (!lstrcmp(ext_buffer, *p)) + return true; + + return false; +} + + +const FileTypeInfo& FileTypeManager::operator[](String ext) +{ + ext.toLower(); + + iterator found = find(ext); + if (found != end()) + return found->second; + + FileTypeInfo& ftype = super::operator[](ext); + + ftype._neverShowExt = false; + + HKEY hkey; + TCHAR value[MAX_PATH], display_name[MAX_PATH]; + LONG valuelen = sizeof(value); + + if (!RegQueryValue(HKEY_CLASSES_ROOT, ext, value, &valuelen)) { + ftype._classname = value; + + valuelen = sizeof(display_name); + if (!RegQueryValue(HKEY_CLASSES_ROOT, ftype._classname, display_name, &valuelen)) + ftype._displayname = display_name; + + if (!RegOpenKey(HKEY_CLASSES_ROOT, ftype._classname, &hkey)) { + if (!RegQueryValueEx(hkey, TEXT("NeverShowExt"), 0, NULL, NULL, NULL)) + ftype._neverShowExt = true; + + RegCloseKey(hkey); + } + } + + return ftype; +} + +LPCTSTR FileTypeManager::set_type(Entry* entry, bool dont_hide_ext) +{ + LPCTSTR ext = _tcsrchr(entry->_data.cFileName, TEXT('.')); + + if (ext) { + const FileTypeInfo& type = (*this)[ext]; + + if (!type._displayname.empty()) + entry->_type_name = _tcsdup(type._displayname); + + // hide some file extensions + if (type._neverShowExt && !dont_hide_ext) { + int len = ext - entry->_data.cFileName; + entry->_display_name = (LPTSTR) malloc((len+1)*sizeof(TCHAR)); + lstrcpyn(entry->_display_name, entry->_data.cFileName, len + 1); + } + + if (is_exe_file(ext)) + entry->_data.dwFileAttributes |= ATTRIBUTE_EXECUTABLE; + } + + return ext; +} + + +Icon::Icon() + : _id(ICID_UNKNOWN), + _itype(IT_STATIC), + _hicon(0) +{ +} + +Icon::Icon(ICON_ID id, UINT nid) //, int cx, int cy + : _id(id), + _itype(IT_STATIC), + _hicon(ResIcon(nid)) // ResIconEx(nid, cx, cy) +{ +} + +Icon::Icon(ICON_ID id, UINT nid, int icon_size) + : _id(id), + _itype(IT_STATIC), + _hicon(ResIconEx(nid, icon_size, icon_size)) +{ +} + +Icon::Icon(ICON_TYPE itype, int id, HICON hIcon) + : _id((ICON_ID)id), + _itype(itype), + _hicon(hIcon) +{ +} + +Icon::Icon(ICON_TYPE itype, int id, int sys_idx) + : _id((ICON_ID)id), + _itype(itype), + _sys_idx(sys_idx) +{ +} + +void Icon::draw(HDC hdc, int x, int y, int cx, int cy, COLORREF bk_color, HBRUSH bk_brush) const +{ + if (_itype == IT_SYSCACHE) + ImageList_DrawEx(g_Globals._icon_cache.get_sys_imagelist(), _sys_idx, hdc, x, y, cx, cy, bk_color, CLR_DEFAULT, ILD_NORMAL); + else + DrawIconEx(hdc, x, y, _hicon, cx, cy, 0, bk_brush, DI_NORMAL); +} + +HBITMAP Icon::create_bitmap(COLORREF bk_color, HBRUSH hbrBkgnd, HDC hdc_wnd) const +{ + if (_itype == IT_SYSCACHE) { + HIMAGELIST himl = g_Globals._icon_cache.get_sys_imagelist(); + + int cx, cy; + ImageList_GetIconSize(himl, &cx, &cy); + + HBITMAP hbmp = CreateCompatibleBitmap(hdc_wnd, cx, cy); + HDC hdc = CreateCompatibleDC(hdc_wnd); + HBITMAP hbmp_old = SelectBitmap(hdc, hbmp); + ImageList_DrawEx(himl, _sys_idx, hdc, 0, 0, cx, cy, bk_color, CLR_DEFAULT, ILD_NORMAL); + SelectBitmap(hdc, hbmp_old); + DeleteDC(hdc); + + return hbmp; + } else + return create_bitmap_from_icon(_hicon, hbrBkgnd, hdc_wnd); +} + + +int Icon::add_to_imagelist(HIMAGELIST himl, HDC hdc_wnd, COLORREF bk_color, HBRUSH bk_brush) const +{ + int ret; + + if (_itype == IT_SYSCACHE) { + HIMAGELIST himl = g_Globals._icon_cache.get_sys_imagelist(); + + int cx, cy; + ImageList_GetIconSize(himl, &cx, &cy); + + HBITMAP hbmp = CreateCompatibleBitmap(hdc_wnd, cx, cy); + HDC hdc = CreateCompatibleDC(hdc_wnd); + HBITMAP hbmp_old = SelectBitmap(hdc, hbmp); + ImageList_DrawEx(himl, _sys_idx, hdc, 0, 0, cx, cy, bk_color, CLR_DEFAULT, ILD_NORMAL); + SelectBitmap(hdc, hbmp_old); + DeleteDC(hdc); + + ret = ImageList_Add(himl, hbmp, 0); + + DeleteObject(hbmp); + } else + ret = ImageList_AddAlphaIcon(himl, _hicon, bk_brush, hdc_wnd); + + return ret; +} + +HBITMAP create_bitmap_from_icon(HICON hIcon, HBRUSH hbrush_bkgnd, HDC hdc_wnd/*, int icon_size*/) +{ + int cx = ICON_SIZE_SMALL; + int cy = ICON_SIZE_SMALL; + HBITMAP hbmp = CreateCompatibleBitmap(hdc_wnd, cx, cy); + + MemCanvas canvas; + BitmapSelection sel(canvas, hbmp); + + RECT rect = {0, 0, cx, cy}; + FillRect(canvas, &rect, hbrush_bkgnd); + + DrawIconEx(canvas, 0, 0, hIcon, cx, cy, 0, hbrush_bkgnd, DI_NORMAL); + + return hbmp; +} + +HBITMAP create_small_bitmap_from_icon(HICON hIcon, HBRUSH hbrush_bkgnd, HDC hdc_wnd) +{ + int cx = GetSystemMetrics(SM_CXSMICON); + int cy = GetSystemMetrics(SM_CYSMICON); + HBITMAP hbmp = CreateCompatibleBitmap(hdc_wnd, cx, cy); + + MemCanvas canvas; + BitmapSelection sel(canvas, hbmp); + + RECT rect = {0, 0, cx, cy}; + FillRect(canvas, &rect, hbrush_bkgnd); + + DrawIconEx(canvas, 0, 0, hIcon, cx, cy, 0, hbrush_bkgnd, DI_NORMAL); + + return hbmp; +} + +int ImageList_AddAlphaIcon(HIMAGELIST himl, HICON hIcon, HBRUSH hbrush_bkgnd, HDC hdc_wnd) +{ + HBITMAP hbmp = create_bitmap_from_icon(hIcon, hbrush_bkgnd, hdc_wnd); + + int ret = ImageList_Add(himl, hbmp, 0); + + DeleteObject(hbmp); + + return ret; +} + + +int IconCache::s_next_id = ICID_DYNAMIC; + + +void IconCache::init() +{ + int icon_size = STARTMENUROOT_ICON_SIZE; + + _icons[ICID_NONE] = Icon(IT_STATIC, ICID_NONE, (HICON)0); + + _icons[ICID_FOLDER] = Icon(ICID_FOLDER, IDI_FOLDER); + //_icons[ICID_DOCUMENT] = Icon(ICID_DOCUMENT, IDI_DOCUMENT); + _icons[ICID_EXPLORER] = Icon(ICID_EXPLORER, IDI_EXPLORER); +// _icons[ICID_APP] = Icon(ICID_APP, IDI_APPICON); + + _icons[ICID_CONFIG] = Icon(ICID_CONFIG, IDI_CONFIG, icon_size); + _icons[ICID_DOCUMENTS] = Icon(ICID_DOCUMENTS, IDI_DOCUMENTS, icon_size); + _icons[ICID_FAVORITES] = Icon(ICID_FAVORITES, IDI_FAVORITES, icon_size); + _icons[ICID_INFO] = Icon(ICID_INFO, IDI_INFO, icon_size); + _icons[ICID_APPS] = Icon(ICID_APPS, IDI_APPS, icon_size); + _icons[ICID_SEARCH] = Icon(ICID_SEARCH, IDI_SEARCH, icon_size); + _icons[ICID_ACTION] = Icon(ICID_ACTION, IDI_ACTION, icon_size); + _icons[ICID_SEARCH_DOC] = Icon(ICID_SEARCH_DOC, IDI_SEARCH_DOC, icon_size); + _icons[ICID_PRINTER] = Icon(ICID_PRINTER, IDI_PRINTER, icon_size); + _icons[ICID_NETWORK] = Icon(ICID_NETWORK, IDI_NETWORK, icon_size); + _icons[ICID_COMPUTER] = Icon(ICID_COMPUTER, IDI_COMPUTER, icon_size); + _icons[ICID_LOGOFF] = Icon(ICID_LOGOFF, IDI_LOGOFF, icon_size); + _icons[ICID_SHUTDOWN] = Icon(ICID_SHUTDOWN, IDI_SHUTDOWN, icon_size); + _icons[ICID_BOOKMARK] = Icon(ICID_BOOKMARK, IDI_DOT_TRANS, icon_size); + _icons[ICID_MINIMIZE] = Icon(ICID_MINIMIZE, IDI_MINIMIZE, icon_size); + _icons[ICID_CONTROLPAN] = Icon(ICID_CONTROLPAN, IDI_CONTROLPAN, icon_size); + _icons[ICID_DESKSETTING]= Icon(ICID_DESKSETTING,IDI_DESKSETTING,icon_size); + _icons[ICID_NETCONNS] = Icon(ICID_NETCONNS, IDI_NETCONNS, icon_size); + _icons[ICID_ADMIN] = Icon(ICID_ADMIN, IDI_ADMIN, icon_size); + _icons[ICID_RECENT] = Icon(ICID_RECENT, IDI_RECENT, icon_size); +} + + +const Icon& IconCache::extract(LPCTSTR path, ICONCACHE_FLAGS flags) +{ + // search for matching icon with unchanged flags in the cache + CacheKey mapkey(path, flags); + PathCacheMap::iterator found = _pathCache.find(mapkey); + + if (found != _pathCache.end()) + return _icons[found->second]; + + // search for matching icon with handle + CacheKey mapkey_hicon(path, flags|ICF_HICON); + if (flags != mapkey_hicon.second) { + found = _pathCache.find(mapkey_hicon); + + if (found != _pathCache.end()) + return _icons[found->second]; + } + + // search for matching icon in the system image list cache + CacheKey mapkey_syscache(path, flags|ICF_SYSCACHE); + if (flags != mapkey_syscache.second) { + found = _pathCache.find(mapkey_syscache); + + if (found != _pathCache.end()) + return _icons[found->second]; + } + + SHFILEINFO sfi; + + int shgfi_flags = 0; + + if (flags & ICF_OPEN) + shgfi_flags |= SHGFI_OPENICON; + + if ((flags&(ICF_LARGE|ICF_MIDDLE|ICF_OVERLAYS|ICF_HICON)) && !(flags&ICF_SYSCACHE)) { + shgfi_flags |= SHGFI_ICON; + + if (!(flags & (ICF_LARGE|ICF_MIDDLE))) + shgfi_flags |= SHGFI_SMALLICON; + + if (flags & ICF_OVERLAYS) + shgfi_flags |= SHGFI_ADDOVERLAYS; + + // get small/big icons with/without overlays + if (SHGetFileInfo(path, 0, &sfi, sizeof(sfi), shgfi_flags)) { + const Icon& icon = add(sfi.hIcon, IT_CACHED); + + ///@todo limit cache size + _pathCache[mapkey_hicon] = icon; + + return icon; + } + } else { + assert(!(flags&ICF_OVERLAYS)); + + shgfi_flags |= SHGFI_SYSICONINDEX|SHGFI_SMALLICON; + + // use system image list - the "search program dialog" needs it + HIMAGELIST himlSys_small = (HIMAGELIST) SHGetFileInfo(path, 0, &sfi, sizeof(sfi), shgfi_flags); + + if (himlSys_small) { + _himlSys_small = himlSys_small; + + const Icon& icon = add(sfi.iIcon/*, IT_SYSCACHE*/); + + ///@todo limit cache size + _pathCache[mapkey_syscache] = icon; + + return icon; + } + } + + return _icons[ICID_NONE]; +} + +const Icon& IconCache::extract(LPCTSTR path, int icon_idx, ICONCACHE_FLAGS flags) +{ + IdxCacheKey key(path, make_pair(icon_idx, (flags|ICF_HICON)&~ICF_SYSCACHE)); + + key.first.toLower(); + + IdxCacheMap::iterator found = _idxCache.find(key); + + if (found != _idxCache.end()) + return _icons[found->second]; + + HICON hIcon; + + if ((int)ExtractIconEx(path, icon_idx, NULL, &hIcon, 1) > 0) { + const Icon& icon = add(hIcon, IT_CACHED); + + _idxCache[key] = icon; + + return icon; + } else { + + ///@todo retreive "http://.../favicon.ico" format icons + + return _icons[ICID_NONE]; + } +} + +const Icon& IconCache::extract(IExtractIcon* pExtract, LPCTSTR path, int icon_idx, ICONCACHE_FLAGS flags) +{ + HICON hIconLarge = 0; + HICON hIcon; + + int icon_size = ICON_SIZE_FROM_ICF(flags); + HRESULT hr = pExtract->Extract(path, icon_idx, &hIconLarge, &hIcon, MAKELONG(GetSystemMetrics(SM_CXICON), icon_size)); + + if (hr == NOERROR) { //@@ oder SUCCEEDED(hr) ? + if (icon_size > ICON_SIZE_SMALL) { //@@ OK? + if (hIcon) + DestroyIcon(hIcon); + + hIcon = hIconLarge; + } else { + if (hIconLarge) + DestroyIcon(hIconLarge); + } + + if (hIcon) + return add(hIcon); //@@ When do we want not to free this icons? + } + + return _icons[ICID_NONE]; +} + +const Icon& IconCache::add(HICON hIcon, ICON_TYPE type) +{ + int id = ++s_next_id; + + return _icons[id] = Icon(type, id, hIcon); +} + +const Icon& IconCache::add(int sys_idx/*, ICON_TYPE type=IT_SYSCACHE*/) +{ + int id = ++s_next_id; + + return _icons[id] = SysCacheIcon(id, sys_idx); +} + +const Icon& IconCache::get_icon(int id) +{ + return _icons[id]; +} + +void IconCache::free_icon(int icon_id) +{ + IconMap::iterator found = _icons.find(icon_id); + + if (found != _icons.end()) { + Icon& icon = found->second; + + if (icon.destroy()) + _icons.erase(found); + } +} + + +ResString::ResString(UINT nid) +{ + TCHAR buffer[BUFFER_LEN]; + + int len = LoadString(g_Globals._hInstance, nid, buffer, sizeof(buffer)/sizeof(TCHAR)); + + super::assign(buffer, len); +} + + +ResIcon::ResIcon(UINT nid) +{ + _hicon = LoadIcon(g_Globals._hInstance, MAKEINTRESOURCE(nid)); +} + +SmallIcon::SmallIcon(UINT nid) +{ + _hicon = (HICON)LoadImage(g_Globals._hInstance, MAKEINTRESOURCE(nid), IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), LR_SHARED); +} + +ResIconEx::ResIconEx(UINT nid, int w, int h) +{ + _hicon = (HICON)LoadImage(g_Globals._hInstance, MAKEINTRESOURCE(nid), IMAGE_ICON, w, h, LR_SHARED); +} + + +void SetWindowIcon(HWND hwnd, UINT nid) +{ + HICON hIcon = ResIcon(nid); + (void)Window_SetIcon(hwnd, ICON_BIG, hIcon); + + HICON hIconSmall = SmallIcon(nid); + (void)Window_SetIcon(hwnd, ICON_SMALL, hIconSmall); +} + + +ResBitmap::ResBitmap(UINT nid) +{ + _hBmp = LoadBitmap(g_Globals._hInstance, MAKEINTRESOURCE(nid)); +} + + +#ifndef ROSSHELL + +void explorer_show_frame(int cmdShow, LPTSTR lpCmdLine) +{ + ExplorerCmd cmd; + + if (g_Globals._hMainWnd) { + if (IsIconic(g_Globals._hMainWnd)) + ShowWindow(g_Globals._hMainWnd, SW_RESTORE); + else + SetForegroundWindow(g_Globals._hMainWnd); + + return; + } + + g_Globals._prescan_nodes = false; + + XMLPos explorer_options = g_Globals.get_cfg("general/explorer"); + XS_String mdiStr = XMLString(explorer_options, "mdi"); + + // If there isn't yet the "mdi" setting in the configuration, display MDI/SDI dialog. + if (mdiStr.empty()) + Dialog::DoModal(IDD_MDI_SDI, WINDOW_CREATOR(MdiSdiDlg), g_Globals._hwndDesktop); + + // Now read the MDI attribute again and interpret it as boolean value. + cmd._mdi = XMLBool(explorer_options, "mdi", true); + + cmd._cmdShow = cmdShow; + + // parse command line options, which may overwrite the MDI flag + if (lpCmdLine) + cmd.ParseCmdLine(lpCmdLine); + + // create main window + MainFrameBase::Create(cmd); +} + +bool ExplorerCmd::ParseCmdLine(LPCTSTR lpCmdLine) +{ + bool ok = true; + + LPCTSTR b = lpCmdLine; + LPCTSTR p = b; + + while(*b) { + // remove leading space + while(_istspace((unsigned)*b)) + ++b; + + p = b; + + bool quote = false; + + // options are separated by ',' + for(; *p; ++p) { + if (*p == '"') // Quote characters may appear at any position in the command line. + quote = !quote; + else if (*p==',' && !quote) + break; + } + + if (p > b) { + int l = p - b; + + // remove trailing space + while(l>0 && _istspace((unsigned)b[l-1])) + --l; + + if (!EvaluateOption(String(b, l))) + ok = false; + + if (*p) + ++p; + + b = p; + } + } + + return ok; +} + +bool ExplorerCmd::EvaluateOption(LPCTSTR option) +{ + String opt_str; + + // Remove quote characters, as they are evaluated at this point. + for(; *option; ++option) + if (*option != '"') + opt_str += *option; + + option = opt_str; + + if (option[0] == '/') { + ++option; + + // option /e for windows in explorer mode + if (!_tcsicmp(option, TEXT("e"))) + _flags |= OWM_EXPLORE; + // option /root for rooted explorer windows + else if (!_tcsicmp(option, TEXT("root"))) + _flags |= OWM_ROOTED; + // non-standard options: /mdi, /sdi + else if (!_tcsicmp(option, TEXT("mdi"))) + _mdi = true; + else if (!_tcsicmp(option, TEXT("sdi"))) + _mdi = false; + else + return false; + } else { + if (!_path.empty()) + return false; + + _path = opt_str; + } + + return true; +} + +bool ExplorerCmd::IsValidPath() const +{ + if (!_path.empty()) { + DWORD attribs = GetFileAttributes(_path); + + if (attribs!=INVALID_FILE_ATTRIBUTES && (attribs&FILE_ATTRIBUTE_DIRECTORY)) + return true; // file system path + else if (*_path==':' && _path.at(1)==':') + return true; // text encoded IDL + } + + return false; +} + +#else + +void explorer_show_frame(int cmdShow, LPTSTR lpCmdLine) +{ + if (!lpCmdLine) + lpCmdLine = TEXT("explorer.exe"); + + launch_file(GetDesktopWindow(), lpCmdLine, cmdShow); +} + +#endif + + +PopupMenu::PopupMenu(UINT nid) +{ + HMENU hMenu = LoadMenu(g_Globals._hInstance, MAKEINTRESOURCE(nid)); + _hmenu = GetSubMenu(hMenu, 0); +} + + + /// "About Explorer" Dialog +struct ExplorerAboutDlg : public + CtlColorParent< + OwnerDrawParent + > +{ + typedef CtlColorParent< + OwnerDrawParent + > super; + + ExplorerAboutDlg(HWND hwnd) + : super(hwnd) + { + SetWindowIcon(hwnd, IDI_REACTOS); + + new FlatButton(hwnd, IDOK); + + _hfont = CreateFont(20, 0, 0, 0, FW_BOLD, TRUE, 0, 0, 0, 0, 0, 0, 0, TEXT("Sans Serif")); + new ColorStatic(hwnd, IDC_ROS_EXPLORER, RGB(32,32,128), 0, _hfont); + + new HyperlinkCtrl(hwnd, IDC_WWW); + + FmtString ver_txt(ResString(IDS_EXPLORER_VERSION_STR), (LPCTSTR)ResString(IDS_VERSION_STR)); + SetWindowText(GetDlgItem(hwnd, IDC_VERSION_TXT), ver_txt); + + HWND hwnd_winver = GetDlgItem(hwnd, IDC_WIN_VERSION); + SetWindowText(hwnd_winver, get_windows_version_str()); + SetWindowFont(hwnd_winver, GetStockFont(DEFAULT_GUI_FONT), FALSE); + + CenterWindow(hwnd); + } + + ~ExplorerAboutDlg() + { + DeleteObject(_hfont); + } + + LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) + { + switch(nmsg) { + case WM_PAINT: + Paint(); + break; + + default: + return super::WndProc(nmsg, wparam, lparam); + } + + return 0; + } + + void Paint() + { + PaintCanvas canvas(_hwnd); + + HICON hicon = (HICON) LoadImage(g_Globals._hInstance, MAKEINTRESOURCE(IDI_REACTOS_BIG), IMAGE_ICON, 0, 0, LR_SHARED); + + DrawIconEx(canvas, 20, 10, hicon, 0, 0, 0, 0, DI_NORMAL); + } + +protected: + HFONT _hfont; +}; + +void explorer_about(HWND hwndParent) +{ + Dialog::DoModal(IDD_ABOUT_EXPLORER, WINDOW_CREATOR(ExplorerAboutDlg), hwndParent); +} + + +static void InitInstance(HINSTANCE hInstance) +{ + CONTEXT("InitInstance"); + + setlocale(LC_COLLATE, ""); // set collating rules to local settings for compareName + +#ifndef ROSSHELL + // register frame window class + g_Globals._hframeClass = IconWindowClass(CLASSNAME_FRAME,IDI_EXPLORER); + + // register child window class + WindowClass(CLASSNAME_CHILDWND, CS_CLASSDC|CS_DBLCLKS|CS_VREDRAW).Register(); + + // register tree window class + WindowClass(CLASSNAME_WINEFILETREE, CS_CLASSDC|CS_DBLCLKS|CS_VREDRAW).Register(); +#endif + + g_Globals._cfStrFName = RegisterClipboardFormat(CFSTR_FILENAME); +} + + +int explorer_main(HINSTANCE hInstance, LPTSTR lpCmdLine, int cmdShow) +{ + CONTEXT("explorer_main"); + + // initialize Common Controls library + CommonControlInit usingCmnCtrl; + + try { + InitInstance(hInstance); + } catch(COMException& e) { + HandleException(e, GetDesktopWindow()); + return -1; + } + +#ifndef ROSSHELL + if (cmdShow != SW_HIDE) { +/* // don't maximize if being called from the ROS desktop + if (cmdShow == SW_SHOWNORMAL) + ///@todo read window placement from registry + cmdShow = SW_MAXIMIZE; +*/ + + explorer_show_frame(cmdShow, lpCmdLine); + } +#endif + + return Window::MessageLoop(); +} + + + // MinGW does not provide a Unicode startup routine, so we have to implement an own. +#if defined(__MINGW32__) && defined(UNICODE) + +#define _tWinMain wWinMain +int WINAPI wWinMain(HINSTANCE, HINSTANCE, LPWSTR, int); + +int main(int argc, char* argv[]) +{ + CONTEXT("main"); + + STARTUPINFO startupinfo; + int nShowCmd = SW_SHOWNORMAL; + + GetStartupInfo(&startupinfo); + + if (startupinfo.dwFlags & STARTF_USESHOWWINDOW) + nShowCmd = startupinfo.wShowWindow; + + LPWSTR cmdline = GetCommandLineW(); + + while(*cmdline && !_istspace((unsigned)*cmdline)) + ++cmdline; + + while(_istspace((unsigned)*cmdline)) + ++cmdline; + + return wWinMain(GetModuleHandle(NULL), 0, cmdline, nShowCmd); +} + +#endif // __MINGW && UNICODE + + +static bool SetShellReadyEvent(LPCTSTR evtName) +{ + HANDLE hEvent = OpenEvent(EVENT_MODIFY_STATE, FALSE, evtName); + if (!hEvent) + return false; + + SetEvent(hEvent); + CloseHandle(hEvent); + + return true; +} + + +int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nShowCmd) +{ + CONTEXT("WinMain()"); + + BOOL any_desktop_running = IsAnyDesktopRunning(); + + BOOL startup_desktop; + + // strip extended options from the front of the command line + String ext_options; + + while(*lpCmdLine == '-') { + while(*lpCmdLine && !_istspace((unsigned)*lpCmdLine)) + ext_options += *lpCmdLine++; + + while(_istspace((unsigned)*lpCmdLine)) + ++lpCmdLine; + } + + // command line option "-install" to replace previous shell application with ROS Explorer + if (_tcsstr(ext_options,TEXT("-install"))) { + // install ROS Explorer into the registry + TCHAR path[MAX_PATH]; + + int l = GetModuleFileName(0, path, COUNTOF(path)); + if (l) { + HKEY hkey; + + if (!RegOpenKey(HKEY_LOCAL_MACHINE, TEXT("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon"), &hkey)) { + + ///@todo save previous shell application in config file + + RegSetValueEx(hkey, TEXT("Shell"), 0, REG_SZ, (LPBYTE)path, l*sizeof(TCHAR)); + RegCloseKey(hkey); + } + + if (!RegOpenKey(HKEY_CURRENT_USER, TEXT("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon"), &hkey)) { + + ///@todo save previous shell application in config file + + RegSetValueEx(hkey, TEXT("Shell"), 0, REG_SZ, (LPBYTE)TEXT(""), l*sizeof(TCHAR)); + RegCloseKey(hkey); + } + } + + HWND shellWindow = GetShellWindow(); + + if (shellWindow) { + DWORD pid; + + // terminate shell process for NT like systems + GetWindowThreadProcessId(shellWindow, &pid); + HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid); + + // On Win 9x it's sufficient to destroy the shell window. + DestroyWindow(shellWindow); + + if (TerminateProcess(hProcess, 0)) + WaitForSingleObject(hProcess, INFINITE); + + CloseHandle(hProcess); + } + + startup_desktop = TRUE; + } else { + // create desktop window and task bar only, if there is no other shell and we are + // the first explorer instance + // MS Explorer looks additionally into the registry entry HKCU\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\shell, + // to decide wether it is currently configured as shell application. + startup_desktop = !any_desktop_running; + } + + + bool autostart = !any_desktop_running; + + // disable autostart if the SHIFT key is pressed + if (GetAsyncKeyState(VK_SHIFT) < 0) + autostart = false; + +#ifdef _DEBUG //MF: disabled for debugging + autostart = false; +#endif + + // If there is given the command line option "-desktop", create desktop window anyways + if (_tcsstr(ext_options,TEXT("-desktop"))) + startup_desktop = TRUE; +#ifndef ROSSHELL + else if (_tcsstr(ext_options,TEXT("-nodesktop"))) + startup_desktop = FALSE; + + // Don't display cabinet window in desktop mode + if (startup_desktop && !_tcsstr(ext_options,TEXT("-explorer"))) + nShowCmd = SW_HIDE; +#endif + + if (_tcsstr(ext_options,TEXT("-noautostart"))) + autostart = false; + else if (_tcsstr(ext_options,TEXT("-autostart"))) + autostart = true; + +#ifndef __WINE__ + if (_tcsstr(ext_options,TEXT("-console"))) { + AllocConsole(); + + _dup2(_open_osfhandle((long)GetStdHandle(STD_INPUT_HANDLE), _O_RDONLY), 0); + _dup2(_open_osfhandle((long)GetStdHandle(STD_OUTPUT_HANDLE), 0), 1); + _dup2(_open_osfhandle((long)GetStdHandle(STD_ERROR_HANDLE), 0), 2); + + g_Globals._log = _fdopen(1, "w"); + setvbuf(g_Globals._log, 0, _IONBF, 0); + + LOG(TEXT("starting explorer debug log\n")); + } +#endif + + + if (startup_desktop) { + // hide the XP login screen (Credit to Nicolas Escuder) + // another undocumented event: "Global\\msgina: ReturnToWelcome" + if (!SetShellReadyEvent(TEXT("msgina: ShellReadyEvent"))) + SetShellReadyEvent(TEXT("Global\\msgina: ShellReadyEvent")); + } +#ifdef ROSSHELL + else + return 0; // no shell to launch, so exit immediatelly +#endif + + + if (!any_desktop_running) { + // launch the shell DDE server + if (g_SHDOCVW_ShellDDEInit) + (*g_SHDOCVW_ShellDDEInit)(TRUE); + } + + + bool use_gdb_stub = false; // !IsDebuggerPresent(); + + if (_tcsstr(ext_options,TEXT("-debug"))) + use_gdb_stub = true; + + if (_tcsstr(ext_options,TEXT("-break"))) { + LOG(TEXT("debugger breakpoint")); +#ifdef _MSC_VER + __asm int 3 +#else + asm("int3"); +#endif + } + + // activate GDB remote debugging stub if no other debugger is running + if (use_gdb_stub) { + LOG(TEXT("waiting for debugger connection...\n")); + + initialize_gdb_stub(); + } + + g_Globals.init(hInstance); + + // initialize COM and OLE before creating the desktop window + OleInit usingCOM; + + // init common controls library + CommonControlInit usingCmnCtrl; + + g_Globals.read_persistent(); + + if (startup_desktop) { + WaitCursor wait; + + g_Globals._desktops.init(); + + g_Globals._hwndDesktop = DesktopWindow::Create(); +#ifdef _USE_HDESK + g_Globals._desktops.get_current_Desktop()->_hwndDesktop = g_Globals._hwndDesktop; +#endif + } + + Thread* pSSOThread = NULL; + + if (startup_desktop) { + // launch SSO thread to allow message processing independent from the explorer main thread + pSSOThread = new SSOThread; + pSSOThread->Start(); + } + + /**TODO launching autostart programs can be moved into a background thread. */ + if (autostart) { + char* argv[] = {"", "s"}; // call startup routine in SESSION_START mode + startup(2, argv); + } + +#ifndef ROSSHELL + if (g_Globals._hwndDesktop) + g_Globals._desktop_mode = true; +#endif + + + int ret = explorer_main(hInstance, lpCmdLine, nShowCmd); + + + // write configuration file + g_Globals.write_persistent(); + + if (pSSOThread) { + pSSOThread->Stop(); + delete pSSOThread; + } + + if (!any_desktop_running) { + // shutdown the shell DDE server + if (g_SHDOCVW_ShellDDEInit) + (*g_SHDOCVW_ShellDDEInit)(FALSE); + } + + return ret; +} diff --git a/reactos/base/shell/explorer/explorer.dsp b/reactos/base/shell/explorer/explorer.dsp new file mode 100644 index 00000000000..283e5a36c72 --- /dev/null +++ b/reactos/base/shell/explorer/explorer.dsp @@ -0,0 +1,872 @@ +# Microsoft Developer Studio Project File - Name="explorer" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Console Application" 0x0103 + +CFG=explorer - Win32 WineDll +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "explorer.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "explorer.mak" CFG="explorer - Win32 WineDll" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "explorer - Win32 Release" (based on "Win32 (x86) Console Application") +!MESSAGE "explorer - Win32 Debug" (based on "Win32 (x86) Console Application") +!MESSAGE "explorer - Win32 Debug Release" (based on "Win32 (x86) Console Application") +!MESSAGE "explorer - Win32 Unicode Release" (based on "Win32 (x86) Console Application") +!MESSAGE "explorer - Win32 Unicode Debug" (based on "Win32 (x86) Console Application") +!MESSAGE "explorer - Win32" (based on "Win32 (x86) Console Application") +!MESSAGE "explorer - Win32 WineRelease" (based on "Win32 (x86) Console Application") +!MESSAGE "explorer - Win32 WineDll" (based on "Win32 (x86) Console Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "explorer - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c +# ADD CPP /nologo /MD /W3 /GR /GX /O1 /D "NDEBUG" /D "WIN32" /D _WIN32_IE=0x0600 /D _WIN32_WINNT=0x0501 /Yu"precomp.h" /FD /c +# ADD BASE RSC /l 0x407 /d "NDEBUG" +# ADD RSC /l 0x407 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 +# ADD LINK32 shell32.lib comctl32.lib gdi32.lib user32.lib advapi32.lib ole32.lib delayimp.lib /nologo /subsystem:windows /machine:I386 /libpath:"Release" /delayload:oleaut32.dll /delayload:wsock32.dll +# SUBTRACT LINK32 /pdb:none + +!ELSEIF "$(CFG)" == "explorer - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /GR /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D _WIN32_IE=0x0600 /D _WIN32_WINNT=0x0501 /FR /Yu"precomp.h" /FD /GZ /c +# ADD BASE RSC /l 0x407 /d "_DEBUG" +# ADD RSC /l 0x407 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib shell32.lib comctl32.lib gdi32.lib user32.lib advapi32.lib ole32.lib delayimp.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept /libpath:"Debug" /delayload:oleaut32.dll /delayload:wsock32.dll +# SUBTRACT LINK32 /pdb:none + +!ELSEIF "$(CFG)" == "explorer - Win32 Debug Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "DRelease" +# PROP BASE Intermediate_Dir "DRelease" +# PROP BASE Ignore_Export_Lib 0 +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "DRelease" +# PROP Intermediate_Dir "DRelease" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_ROS_" /YX /FD /c +# ADD CPP /nologo /MD /W3 /GR /GX /Zi /O2 /D "NDEBUG" /D "WIN32" /D _WIN32_IE=0x0600 /D _WIN32_WINNT=0x0501 /FR /Yu"precomp.h" /FD /c +# ADD BASE RSC /l 0x407 /d "NDEBUG" +# ADD RSC /l 0x407 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 user32.lib gdi32.lib advapi32.lib comctl32.lib shell32.lib /nologo /subsystem:console /machine:I386 +# ADD LINK32 shell32.lib comctl32.lib gdi32.lib user32.lib advapi32.lib ole32.lib delayimp.lib /nologo /subsystem:windows /debug /machine:I386 /delayload:oleaut32.dll /delayload:wsock32.dll +# SUBTRACT LINK32 /pdb:none + +!ELSEIF "$(CFG)" == "explorer - Win32 Unicode Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "URelease" +# PROP BASE Intermediate_Dir "URelease" +# PROP BASE Ignore_Export_Lib 0 +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "URelease" +# PROP Intermediate_Dir "URelease" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "UNICODE" /D "_ROS_" /YX /FD /c +# ADD CPP /nologo /MD /W3 /GR /GX /O2 /D "NDEBUG" /D "UNICODE" /D "WIN32" /D _WIN32_IE=0x0600 /D _WIN32_WINNT=0x0501 /Yu"precomp.h" /FD /c +# ADD BASE RSC /l 0x407 /d "NDEBUG" +# ADD RSC /l 0x407 /d "NDEBUG" /d "UNICODE" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 user32.lib gdi32.lib advapi32.lib comctl32.lib shell32.lib /nologo /subsystem:console /machine:I386 +# ADD LINK32 shell32.lib comctl32.lib gdi32.lib user32.lib advapi32.lib ole32.lib delayimp.lib /nologo /subsystem:windows /machine:I386 /libpath:"Release" /delayload:oleaut32.dll /delayload:wsock32.dll +# SUBTRACT LINK32 /pdb:none + +!ELSEIF "$(CFG)" == "explorer - Win32 Unicode Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "UDebug" +# PROP BASE Intermediate_Dir "UDebug" +# PROP BASE Ignore_Export_Lib 0 +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "UDebug" +# PROP Intermediate_Dir "UDebug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "UNICODE" /D "_ROS_" /FR /YX /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /GR /GX /ZI /Od /D "_DEBUG" /D "UNICODE" /D "WIN32" /D _WIN32_IE=0x0600 /D _WIN32_WINNT=0x0501 /FR /Yu"precomp.h" /FD /GZ /c +# ADD BASE RSC /l 0x407 /d "_DEBUG" +# ADD RSC /l 0x407 /d "_DEBUG" /d "UNICODE" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 user32.lib gdi32.lib advapi32.lib comctl32.lib shell32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept +# ADD LINK32 shell32.lib comctl32.lib gdi32.lib user32.lib advapi32.lib ole32.lib delayimp.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept /libpath:"Debug" /delayload:oleaut32.dll /delayload:wsock32.dll +# SUBTRACT LINK32 /pdb:none + +!ELSEIF "$(CFG)" == "explorer - Win32" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Win32" +# PROP BASE Intermediate_Dir "Win32" +# PROP BASE Ignore_Export_Lib 0 +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Win32" +# PROP Intermediate_Dir "Win32" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /Gm /GR /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "_ROS_" /D _WIN32_IE=0x0501 /D _WIN32_WINNT=0x0501 /FR /YX /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /GR /GX /ZI /Od /D "_DEBUG" /D "UNICODE" /D "WIN32" /D _WIN32_IE=0x0600 /D _WIN32_WINNT=0x0501 /FR /Yu"precomp.h" /FD /GZ /c +# ADD BASE RSC /l 0x407 /d "_DEBUG" +# ADD RSC /l 0x407 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 user32.lib gdi32.lib advapi32.lib comctl32.lib ole32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# SUBTRACT BASE LINK32 /pdb:none +# ADD LINK32 gdi32.lib user32.lib advapi32.lib ole32.lib delayimp.lib /nologo /subsystem:windows /debug /machine:I386 /out:"Win32/wexplorer.exe" /pdbtype:sept /delayload:oleaut32.dll +# SUBTRACT LINK32 /pdb:none + +!ELSEIF "$(CFG)" == "explorer - Win32 WineRelease" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "explorer___Win32_WineRelease" +# PROP BASE Intermediate_Dir "explorer___Win32_WineRelease" +# PROP BASE Ignore_Export_Lib 0 +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "WineRelease" +# PROP Intermediate_Dir "WineRelease" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /Gm /GR /GX /ZI /Od /D "_DEBUG" /D "UNICODE" /D "WIN32" /D "_ROS_" /D _WIN32_IE=0x0501 /D _WIN32_WINNT=0x0501 /FR /YX /FD /GZ /c +# ADD CPP /nologo /MT /W3 /GR /GX /O2 /D "NDEBUG" /D "UNICODE" /D "WIN32" /D _WIN32_IE=0x0600 /D _WIN32_WINNT=0x0501 /Yu"precomp.h" /FD /c +# ADD BASE RSC /l 0x407 /d "_DEBUG" +# ADD RSC /l 0x407 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 user32.lib gdi32.lib advapi32.lib ole32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# SUBTRACT BASE LINK32 /pdb:none +# ADD LINK32 gdi32.lib user32.lib advapi32.lib ole32.lib delayimp.lib /nologo /subsystem:windows /incremental:no /machine:I386 /out:"WineRelease/wexplorer.exe" /pdbtype:sept /delayload:oleaut32.dll /delayload:wsock32.dll /delayload:wsock32.dll +# SUBTRACT LINK32 /pdb:none + +!ELSEIF "$(CFG)" == "explorer - Win32 WineDll" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "explorer___Win32_WineDll" +# PROP BASE Intermediate_Dir "explorer___Win32_WineDll" +# PROP BASE Ignore_Export_Lib 0 +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "WineDll" +# PROP Intermediate_Dir "WineDll" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MT /W3 /GR /GX /O2 /D "NDEBUG" /D "UNICODE" /D "WIN32" /D "_ROS_" /D _WIN32_IE=0x0501 /D _WIN32_WINNT=0x0501 /FD /c +# ADD CPP /nologo /MD /W3 /GR /GX /O2 /D "NDEBUG" /D "UNICODE" /D "WIN32" /D _WIN32_IE=0x0600 /D _WIN32_WINNT=0x0501 /Yu"precomp.h" /FD /c +# ADD BASE RSC /l 0x407 /d "_DEBUG" +# ADD RSC /l 0x407 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 user32.lib gdi32.lib advapi32.lib ole32.lib /nologo /subsystem:windows /machine:I386 /pdbtype:sept +# SUBTRACT BASE LINK32 /pdb:none /debug +# ADD LINK32 gdi32.lib user32.lib advapi32.lib ole32.lib delayimp.lib /nologo /subsystem:windows /machine:I386 /out:"WineDll/wexplorer.exe" /pdbtype:sept /delayload:oleaut32.dll /delayload:wsock32.dll +# SUBTRACT LINK32 /pdb:none + +!ENDIF + +# Begin Target + +# Name "explorer - Win32 Release" +# Name "explorer - Win32 Debug" +# Name "explorer - Win32 Debug Release" +# Name "explorer - Win32 Unicode Release" +# Name "explorer - Win32 Unicode Debug" +# Name "explorer - Win32" +# Name "explorer - Win32 WineRelease" +# Name "explorer - Win32 WineDll" +# Begin Group "utility" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\utility\dragdropimpl.cpp +# End Source File +# Begin Source File + +SOURCE=.\utility\dragdropimpl.h +# End Source File +# Begin Source File + +SOURCE=.\utility\shellbrowserimpl.cpp +# End Source File +# Begin Source File + +SOURCE=.\utility\shellbrowserimpl.h +# End Source File +# Begin Source File + +SOURCE=.\utility\shellclasses.cpp +# End Source File +# Begin Source File + +SOURCE=.\utility\shellclasses.h +# End Source File +# Begin Source File + +SOURCE=.\utility\treedroptarget.h +# End Source File +# Begin Source File + +SOURCE=.\utility\utility.cpp +# End Source File +# Begin Source File + +SOURCE=.\utility\utility.h +# End Source File +# Begin Source File + +SOURCE=.\utility\window.cpp +# End Source File +# Begin Source File + +SOURCE=.\utility\window.h +# End Source File +# Begin Source File + +SOURCE=.\utility\xmlstorage.cpp +# End Source File +# Begin Source File + +SOURCE=.\utility\xmlstorage.h +# End Source File +# End Group +# Begin Group "resources" + +# PROP Default_Filter "bmp,ico" +# Begin Source File + +SOURCE=.\res\action.ico +# End Source File +# Begin Source File + +SOURCE=.\res\administration.ico +# End Source File +# Begin Source File + +SOURCE=.\res\appicon.ico +# End Source File +# Begin Source File + +SOURCE=.\res\apps.ico +# End Source File +# Begin Source File + +SOURCE=.\res\arrow.ico +# End Source File +# Begin Source File + +SOURCE=.\res\arrow_dwn.ico +# End Source File +# Begin Source File + +SOURCE=.\res\arrow_up.ico +# End Source File +# Begin Source File + +SOURCE=.\res\arrowsel.ico +# End Source File +# Begin Source File + +SOURCE=.\res\computer.ico +# End Source File +# Begin Source File + +SOURCE=.\res\config.ico +# End Source File +# Begin Source File + +SOURCE=".\res\control-panel.ico" +# End Source File +# Begin Source File + +SOURCE=".\res\desktop-settings.ico" +# End Source File +# Begin Source File + +SOURCE=.\res\documents.ico +# End Source File +# Begin Source File + +SOURCE=.\res\dot.ico +# End Source File +# Begin Source File + +SOURCE=.\res\dot_red.ico +# End Source File +# Begin Source File + +SOURCE=.\res\dot_trans.ico +# End Source File +# Begin Source File + +SOURCE=.\res\drivebar.bmp +# End Source File +# Begin Source File + +SOURCE=".\explorer-cz.rc" +# PROP Exclude_From_Build 1 +# End Source File +# Begin Source File + +SOURCE=".\explorer-de.rc" +# PROP Exclude_From_Build 1 +# End Source File +# Begin Source File + +SOURCE=".\explorer-en.rc" +# PROP Exclude_From_Build 1 +# End Source File +# Begin Source File + +SOURCE=".\explorer-es.rc" +# PROP Exclude_From_Build 1 +# End Source File +# Begin Source File + +SOURCE=".\explorer-fr.rc" +# PROP Exclude_From_Build 1 +# End Source File +# Begin Source File + +SOURCE=".\explorer-hu.rc" +# PROP Exclude_From_Build 1 +# End Source File +# Begin Source File + +SOURCE=".\explorer-jp.rc" +# PROP Exclude_From_Build 1 +# End Source File +# Begin Source File + +SOURCE=".\explorer-pl.rc" +# PROP Exclude_From_Build 1 +# End Source File +# Begin Source File + +SOURCE=".\explorer-pt.rc" +# PROP Exclude_From_Build 1 +# End Source File +# Begin Source File + +SOURCE=".\explorer-ro.rc" +# PROP Exclude_From_Build 1 +# End Source File +# Begin Source File + +SOURCE=".\explorer-ru.rc" +# PROP Exclude_From_Build 1 +# End Source File +# Begin Source File + +SOURCE=".\explorer-sv.rc" +# PROP Exclude_From_Build 1 +# End Source File +# Begin Source File + +SOURCE=".\explorer-uk.rc" +# PROP Exclude_From_Build 1 +# End Source File +# Begin Source File + +SOURCE=.\explorer.exe.manifest +# End Source File +# Begin Source File + +SOURCE=.\res\explorer.ico +# End Source File +# Begin Source File + +SOURCE=.\explorer_intres.rc +# End Source File +# Begin Source File + +SOURCE=.\res\favorites.ico +# End Source File +# Begin Source File + +SOURCE=.\res\floating.ico +# End Source File +# Begin Source File + +SOURCE=.\res\folder.ico +# End Source File +# Begin Source File + +SOURCE=.\res\icoali10.bmp +# End Source File +# Begin Source File + +SOURCE=.\res\icoalig0.bmp +# End Source File +# Begin Source File + +SOURCE=.\res\icoalig1.bmp +# End Source File +# Begin Source File + +SOURCE=.\res\icoalig2.bmp +# End Source File +# Begin Source File + +SOURCE=.\res\icoalig3.bmp +# End Source File +# Begin Source File + +SOURCE=.\res\icoalig4.bmp +# End Source File +# Begin Source File + +SOURCE=.\res\icoalig5.bmp +# End Source File +# Begin Source File + +SOURCE=.\res\icoalig6.bmp +# End Source File +# Begin Source File + +SOURCE=.\res\icoalig7.bmp +# End Source File +# Begin Source File + +SOURCE=.\res\icoalig8.bmp +# End Source File +# Begin Source File + +SOURCE=.\res\icoalig9.bmp +# End Source File +# Begin Source File + +SOURCE=.\res\images.bmp +# End Source File +# Begin Source File + +SOURCE=.\res\info.ico +# End Source File +# Begin Source File + +SOURCE=.\res\logoff.ico +# End Source File +# Begin Source File + +SOURCE=.\res\logov.bmp +# End Source File +# Begin Source File + +SOURCE=.\res\logov16.bmp +# End Source File +# Begin Source File + +SOURCE=.\res\logov256.bmp +# End Source File +# Begin Source File + +SOURCE=.\res\mdi.bmp +# End Source File +# Begin Source File + +SOURCE=.\res\minimize.ico +# End Source File +# Begin Source File + +SOURCE=".\res\network-conns.ico" +# End Source File +# Begin Source File + +SOURCE=.\res\network.ico +# End Source File +# Begin Source File + +SOURCE=.\res\notify_l.ico +# End Source File +# Begin Source File + +SOURCE=.\res\notify_r.ico +# End Source File +# Begin Source File + +SOURCE=.\res\printer.ico +# End Source File +# Begin Source File + +SOURCE=.\res\reactos.ico +# End Source File +# Begin Source File + +SOURCE=".\res\recent-documents.ico" +# End Source File +# Begin Source File + +SOURCE=.\resource.h +# End Source File +# Begin Source File + +SOURCE=".\res\ros-big.ico" +# End Source File +# Begin Source File + +SOURCE=.\res\sdi.bmp +# End Source File +# Begin Source File + +SOURCE=".\res\search-doc.ico" +# End Source File +# Begin Source File + +SOURCE=.\res\search.ico +# End Source File +# Begin Source File + +SOURCE=.\res\shutdown.ico +# End Source File +# Begin Source File + +SOURCE=.\res\speaker.ico +# End Source File +# Begin Source File + +SOURCE=.\res\startmenu.ico +# End Source File +# Begin Source File + +SOURCE=.\res\toolbar.bmp +# End Source File +# End Group +# Begin Group "taskbar" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\taskbar\desktopbar.cpp +# End Source File +# Begin Source File + +SOURCE=.\taskbar\desktopbar.h +# End Source File +# Begin Source File + +SOURCE=.\taskbar\favorites.cpp +# End Source File +# Begin Source File + +SOURCE=.\taskbar\favorites.h +# End Source File +# Begin Source File + +SOURCE=.\notifyhook\notifyhook.h +# End Source File +# Begin Source File + +SOURCE=.\taskbar\quicklaunch.cpp +# End Source File +# Begin Source File + +SOURCE=.\taskbar\quicklaunch.h +# End Source File +# Begin Source File + +SOURCE=.\taskbar\startmenu.cpp +# End Source File +# Begin Source File + +SOURCE=.\taskbar\startmenu.h +# End Source File +# Begin Source File + +SOURCE=.\taskbar\taskbar.cpp +# End Source File +# Begin Source File + +SOURCE=.\taskbar\taskbar.h +# End Source File +# Begin Source File + +SOURCE=.\taskbar\traynotify.cpp +# End Source File +# Begin Source File + +SOURCE=.\taskbar\traynotify.h +# End Source File +# End Group +# Begin Group "desktop" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\desktop\desktop.cpp +# End Source File +# Begin Source File + +SOURCE=.\desktop\desktop.h +# End Source File +# End Group +# Begin Group "doc" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\doc\changes.txt +# End Source File +# Begin Source File + +SOURCE=.\doc\readme.txt +# End Source File +# Begin Source File + +SOURCE=.\doc\TODO.txt +# End Source File +# End Group +# Begin Group "shell" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\shell\entries.cpp +# End Source File +# Begin Source File + +SOURCE=.\shell\entries.h +# End Source File +# Begin Source File + +SOURCE=.\shell\fatfs.cpp +# End Source File +# Begin Source File + +SOURCE=.\shell\fatfs.h +# End Source File +# Begin Source File + +SOURCE=.\shell\filechild.cpp +# End Source File +# Begin Source File + +SOURCE=.\shell\filechild.h +# End Source File +# Begin Source File + +SOURCE=.\shell\mainframe.cpp +# End Source File +# Begin Source File + +SOURCE=.\shell\mainframe.h +# End Source File +# Begin Source File + +SOURCE=.\shell\ntobjfs.cpp +# End Source File +# Begin Source File + +SOURCE=.\shell\ntobjfs.h +# End Source File +# Begin Source File + +SOURCE=.\shell\pane.cpp +# End Source File +# Begin Source File + +SOURCE=.\shell\pane.h +# End Source File +# Begin Source File + +SOURCE=.\shell\regfs.cpp +# End Source File +# Begin Source File + +SOURCE=.\shell\regfs.h +# End Source File +# Begin Source File + +SOURCE=.\shell\shellbrowser.cpp +# End Source File +# Begin Source File + +SOURCE=.\shell\shellbrowser.h +# End Source File +# Begin Source File + +SOURCE=.\shell\shellfs.cpp +# End Source File +# Begin Source File + +SOURCE=.\shell\shellfs.h +# End Source File +# Begin Source File + +SOURCE=.\shell\unixfs.cpp +# PROP Exclude_From_Build 1 +# End Source File +# Begin Source File + +SOURCE=.\shell\unixfs.h +# End Source File +# Begin Source File + +SOURCE=.\shell\webchild.cpp +# End Source File +# Begin Source File + +SOURCE=.\shell\webchild.h +# End Source File +# Begin Source File + +SOURCE=.\shell\winfs.cpp +# End Source File +# Begin Source File + +SOURCE=.\shell\winfs.h +# End Source File +# End Group +# Begin Group "dialogs" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\dialogs\searchprogram.cpp +# End Source File +# Begin Source File + +SOURCE=.\dialogs\searchprogram.h +# End Source File +# Begin Source File + +SOURCE=.\dialogs\settings.cpp +# End Source File +# Begin Source File + +SOURCE=.\dialogs\settings.h +# End Source File +# End Group +# Begin Group "main" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\explorer.cpp +# End Source File +# Begin Source File + +SOURCE=.\explorer.h +# End Source File +# Begin Source File + +SOURCE=.\externals.h +# End Source File +# Begin Source File + +SOURCE=.\globals.h +# End Source File +# Begin Source File + +SOURCE=".\i386-stub-win32.c" +# SUBTRACT CPP /YX /Yc /Yu +# End Source File +# Begin Source File + +SOURCE=.\precomp.cpp +# ADD CPP /Yc"precomp.h" +# End Source File +# Begin Source File + +SOURCE=.\precomp.h +# End Source File +# End Group +# Begin Group "services" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\services\shellservices.cpp +# End Source File +# Begin Source File + +SOURCE=.\services\shellservices.h +# End Source File +# Begin Source File + +SOURCE=.\services\startup.c +# SUBTRACT CPP /YX /Yc /Yu +# End Source File +# End Group +# End Target +# End Project diff --git a/reactos/base/shell/explorer/explorer.dsw b/reactos/base/shell/explorer/explorer.dsw new file mode 100644 index 00000000000..d212f1818ff --- /dev/null +++ b/reactos/base/shell/explorer/explorer.dsw @@ -0,0 +1,56 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "explorer"=.\explorer.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name notifyhook + End Project Dependency +}}} + +############################################################################### + +Project: "make_explorer"=.\make_explorer.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "notifyhook"=.\notifyhook\notifyhook.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/reactos/base/shell/explorer/explorer.exe.manifest b/reactos/base/shell/explorer/explorer.exe.manifest new file mode 100644 index 00000000000..5df0dd38a2a --- /dev/null +++ b/reactos/base/shell/explorer/explorer.exe.manifest @@ -0,0 +1,22 @@ + + + +ROS Explorer + + + + + + diff --git a/reactos/base/shell/explorer/explorer.h b/reactos/base/shell/explorer/explorer.h new file mode 100644 index 00000000000..6c508ff93b3 --- /dev/null +++ b/reactos/base/shell/explorer/explorer.h @@ -0,0 +1,122 @@ +/* + * Copyright 2003, 2004 Martin Fuchs + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + + // + // Explorer clone + // + // explorer.h + // + // Martin Fuchs, 23.07.2003 + // + + +#define _LIGHT_STARTMENU +#define _LAZY_ICONEXTRACT +#define _SINGLE_ICONEXTRACT +//#define _NO_WIN_FS + + +#include "utility/shellclasses.h" + +#include "shell/entries.h" + +#ifndef _NO_WIN_FS +#include "shell/winfs.h" +#endif + +#include "shell/shellfs.h" + +#ifndef ROSSHELL +#include "shell/unixfs.h" +#endif + +#include "utility/window.h" + + +#define IDW_STATUSBAR 0x100 +#define IDW_TOOLBAR 0x101 +#define IDW_EXTRABAR 0x102 +#define IDW_DRIVEBAR 0x103 +#define IDW_ADDRESSBAR 0x104 +#define IDW_COMMANDBAR 0x105 +#define IDW_SIDEBAR 0x106 +#define IDW_FIRST_CHILD 0xC000 /*0x200*/ + + +#define PM_GET_FILEWND_PTR (WM_APP+0x05) +#define PM_GET_SHELLBROWSER_PTR (WM_APP+0x06) + +#define PM_GET_CONTROLWINDOW (WM_APP+0x16) + +#define PM_RESIZE_CHILDREN (WM_APP+0x17) +#define PM_GET_WIDTH (WM_APP+0x18) + +#define PM_REFRESH (WM_APP+0x1B) +#define PM_REFRESH_CONFIG (WM_APP+0x1C) + + +#define CLASSNAME_FRAME TEXT("CabinetWClass") // same class name for frame window as in MS Explorer + +#define CLASSNAME_CHILDWND TEXT("WFS_Child") +#define CLASSNAME_WINEFILETREE TEXT("WFS_Tree") + + +#include "shell/pane.h" +#include "shell/filechild.h" +#include "shell/shellbrowser.h" + + +#ifndef ROSSHELL + + /// Explorer command line parser + // for commands like "/e,/root,c:\" + // or "::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\::{21EC2020-3AEA-1069-A2DD-08002B30309D}" (launch of control panel) +struct ExplorerCmd +{ + ExplorerCmd() + : _flags(0), + _cmdShow(SW_SHOWNORMAL), + _mdi(false), + _valid_path(false) + { + } + + ExplorerCmd(LPCTSTR url, bool mdi) + : _path(url), + _flags(0), + _cmdShow(SW_SHOWNORMAL), + _mdi(mdi), + _valid_path(true) //@@ + { + } + + bool ParseCmdLine(LPCTSTR lpCmdLine); + bool EvaluateOption(LPCTSTR option); + bool IsValidPath() const; + + String _path; + int _flags; // OPEN_WINDOW_MODE + int _cmdShow; + bool _mdi; + bool _valid_path; +}; + +#include "shell/mainframe.h" + +#endif diff --git a/reactos/base/shell/explorer/explorer.rc b/reactos/base/shell/explorer/explorer.rc new file mode 100644 index 00000000000..ed273193777 --- /dev/null +++ b/reactos/base/shell/explorer/explorer.rc @@ -0,0 +1,21 @@ +/* $Id: explorer.rc 17951 2005-09-20 19:51:27Z mf $ */ + +#include "explorer_intres.rc" + +#define REACTOS_STR_FILE_DESCRIPTION "ReactOS Explorer\0" +#define REACTOS_STR_INTERNAL_NAME "explorer\0" +#define REACTOS_STR_ORIGINAL_FILENAME "explorer.exe\0" +#include + +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US + +#define IDS_VERSION_STR 5000 +#define IDS_EXPLORER_VERSION_STR 5001 + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL + +STRINGTABLE DISCARDABLE +BEGIN + IDS_VERSION_STR REACTOS_STR_PRODUCT_VERSION + IDS_EXPLORER_VERSION_STR "ReactOS %s Explorer" +END diff --git a/reactos/base/shell/explorer/explorer.sln b/reactos/base/shell/explorer/explorer.sln new file mode 100644 index 00000000000..4f01e3694b2 --- /dev/null +++ b/reactos/base/shell/explorer/explorer.sln @@ -0,0 +1,79 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual C++ Express 2005 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "explorer", "explorer.vcproj", "{BFBAE588-8C68-4303-9BF6-C830087D8F25}" + ProjectSection(ProjectDependencies) = postProject + {F28B575D-7DBA-44DE-AAEF-FA0D065E5162} = {F28B575D-7DBA-44DE-AAEF-FA0D065E5162} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "make_explorer", "make_explorer.vcproj", "{E132A04B-8BC6-4D18-81F2-F0156B809871}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "notifyhook", "notifyhook\notifyhook.vcproj", "{F28B575D-7DBA-44DE-AAEF-FA0D065E5162}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + bjam|Win32 = bjam|Win32 + Debug Release|Win32 = Debug Release|Win32 + Debug|Win32 = Debug|Win32 + doxy docu|Win32 = doxy docu|Win32 + Release|Win32 = Release|Win32 + Unicode Debug|Win32 = Unicode Debug|Win32 + Unicode Release|Win32 = Unicode Release|Win32 + WineDll|Win32 = WineDll|Win32 + WineRelease|Win32 = WineRelease|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {BFBAE588-8C68-4303-9BF6-C830087D8F25}.bjam|Win32.ActiveCfg = WineDll|Win32 + {BFBAE588-8C68-4303-9BF6-C830087D8F25}.bjam|Win32.Build.0 = WineDll|Win32 + {BFBAE588-8C68-4303-9BF6-C830087D8F25}.Debug Release|Win32.ActiveCfg = Debug|Win32 + {BFBAE588-8C68-4303-9BF6-C830087D8F25}.Debug Release|Win32.Build.0 = Debug|Win32 + {BFBAE588-8C68-4303-9BF6-C830087D8F25}.Debug|Win32.ActiveCfg = Debug|Win32 + {BFBAE588-8C68-4303-9BF6-C830087D8F25}.Debug|Win32.Build.0 = Debug|Win32 + {BFBAE588-8C68-4303-9BF6-C830087D8F25}.doxy docu|Win32.ActiveCfg = Debug|Win32 + {BFBAE588-8C68-4303-9BF6-C830087D8F25}.doxy docu|Win32.Build.0 = Debug|Win32 + {BFBAE588-8C68-4303-9BF6-C830087D8F25}.Release|Win32.ActiveCfg = Release|Win32 + {BFBAE588-8C68-4303-9BF6-C830087D8F25}.Release|Win32.Build.0 = Release|Win32 + {BFBAE588-8C68-4303-9BF6-C830087D8F25}.Unicode Debug|Win32.ActiveCfg = Unicode Debug|Win32 + {BFBAE588-8C68-4303-9BF6-C830087D8F25}.Unicode Debug|Win32.Build.0 = Unicode Debug|Win32 + {BFBAE588-8C68-4303-9BF6-C830087D8F25}.Unicode Release|Win32.ActiveCfg = Unicode Release|Win32 + {BFBAE588-8C68-4303-9BF6-C830087D8F25}.Unicode Release|Win32.Build.0 = Unicode Release|Win32 + {BFBAE588-8C68-4303-9BF6-C830087D8F25}.WineDll|Win32.ActiveCfg = WineDll|Win32 + {BFBAE588-8C68-4303-9BF6-C830087D8F25}.WineDll|Win32.Build.0 = WineDll|Win32 + {BFBAE588-8C68-4303-9BF6-C830087D8F25}.WineRelease|Win32.ActiveCfg = WineRelease|Win32 + {BFBAE588-8C68-4303-9BF6-C830087D8F25}.WineRelease|Win32.Build.0 = WineRelease|Win32 + {E132A04B-8BC6-4D18-81F2-F0156B809871}.bjam|Win32.ActiveCfg = bjam|Win32 + {E132A04B-8BC6-4D18-81F2-F0156B809871}.bjam|Win32.Build.0 = bjam|Win32 + {E132A04B-8BC6-4D18-81F2-F0156B809871}.Debug Release|Win32.ActiveCfg = Debug|Win32 + {E132A04B-8BC6-4D18-81F2-F0156B809871}.Debug|Win32.ActiveCfg = Debug|Win32 + {E132A04B-8BC6-4D18-81F2-F0156B809871}.doxy docu|Win32.ActiveCfg = doxy docu|Win32 + {E132A04B-8BC6-4D18-81F2-F0156B809871}.doxy docu|Win32.Build.0 = doxy docu|Win32 + {E132A04B-8BC6-4D18-81F2-F0156B809871}.Release|Win32.ActiveCfg = Release|Win32 + {E132A04B-8BC6-4D18-81F2-F0156B809871}.Unicode Debug|Win32.ActiveCfg = Unicode Debug|Win32 + {E132A04B-8BC6-4D18-81F2-F0156B809871}.Unicode Release|Win32.ActiveCfg = Unicode Release|Win32 + {E132A04B-8BC6-4D18-81F2-F0156B809871}.WineDll|Win32.ActiveCfg = Debug|Win32 + {E132A04B-8BC6-4D18-81F2-F0156B809871}.WineDll|Win32.Build.0 = Debug|Win32 + {E132A04B-8BC6-4D18-81F2-F0156B809871}.WineRelease|Win32.ActiveCfg = Release|Win32 + {E132A04B-8BC6-4D18-81F2-F0156B809871}.WineRelease|Win32.Build.0 = Release|Win32 + {F28B575D-7DBA-44DE-AAEF-FA0D065E5162}.bjam|Win32.ActiveCfg = Debug|Win32 + {F28B575D-7DBA-44DE-AAEF-FA0D065E5162}.bjam|Win32.Build.0 = Debug|Win32 + {F28B575D-7DBA-44DE-AAEF-FA0D065E5162}.Debug Release|Win32.ActiveCfg = Debug|Win32 + {F28B575D-7DBA-44DE-AAEF-FA0D065E5162}.Debug Release|Win32.Build.0 = Debug|Win32 + {F28B575D-7DBA-44DE-AAEF-FA0D065E5162}.Debug|Win32.ActiveCfg = Debug|Win32 + {F28B575D-7DBA-44DE-AAEF-FA0D065E5162}.Debug|Win32.Build.0 = Debug|Win32 + {F28B575D-7DBA-44DE-AAEF-FA0D065E5162}.doxy docu|Win32.ActiveCfg = Debug|Win32 + {F28B575D-7DBA-44DE-AAEF-FA0D065E5162}.doxy docu|Win32.Build.0 = Debug|Win32 + {F28B575D-7DBA-44DE-AAEF-FA0D065E5162}.Release|Win32.ActiveCfg = Release|Win32 + {F28B575D-7DBA-44DE-AAEF-FA0D065E5162}.Release|Win32.Build.0 = Release|Win32 + {F28B575D-7DBA-44DE-AAEF-FA0D065E5162}.Unicode Debug|Win32.ActiveCfg = Debug|Win32 + {F28B575D-7DBA-44DE-AAEF-FA0D065E5162}.Unicode Debug|Win32.Build.0 = Debug|Win32 + {F28B575D-7DBA-44DE-AAEF-FA0D065E5162}.Unicode Release|Win32.ActiveCfg = Release|Win32 + {F28B575D-7DBA-44DE-AAEF-FA0D065E5162}.Unicode Release|Win32.Build.0 = Release|Win32 + {F28B575D-7DBA-44DE-AAEF-FA0D065E5162}.WineDll|Win32.ActiveCfg = Debug|Win32 + {F28B575D-7DBA-44DE-AAEF-FA0D065E5162}.WineDll|Win32.Build.0 = Debug|Win32 + {F28B575D-7DBA-44DE-AAEF-FA0D065E5162}.WineRelease|Win32.ActiveCfg = Release|Win32 + {F28B575D-7DBA-44DE-AAEF-FA0D065E5162}.WineRelease|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/reactos/base/shell/explorer/explorer.vcproj b/reactos/base/shell/explorer/explorer.vcproj new file mode 100644 index 00000000000..79428d6db4c --- /dev/null +++ b/reactos/base/shell/explorer/explorer.vcproj @@ -0,0 +1,3788 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/reactos/base/shell/explorer/explorer.xml b/reactos/base/shell/explorer/explorer.xml new file mode 100644 index 00000000000..0385faba4c2 --- /dev/null +++ b/reactos/base/shell/explorer/explorer.xml @@ -0,0 +1,74 @@ + + -luuid + -lstdc++ + -fexceptions + . + + + + + 0x0600 + 0x0501 + 0x0500 + + kernel32 + gdi32 + user32 + ws2_32 + msimg32 + comctl32 + ole32 + oleaut32 + shell32 + expat + notifyhook + precomp.h + + desktop.cpp + + + searchprogram.cpp + settings.cpp + + + entries.cpp + fatfs.cpp + filechild.cpp + shellfs.cpp + mainframe.cpp + ntobjfs.cpp + pane.cpp + regfs.cpp + shellbrowser.cpp + unixfs.cpp + webchild.cpp + winfs.cpp + + + shellservices.cpp + startup.c + + + desktopbar.cpp + favorites.cpp + taskbar.cpp + startmenu.cpp + traynotify.cpp + quicklaunch.cpp + + + shellclasses.cpp + utility.cpp + window.cpp + dragdropimpl.cpp + shellbrowserimpl.cpp + xmlstorage.cpp + + explorer.cpp + i386-stub-win32.c + explorer.rc + +explorer-cfg-template.xml + + + diff --git a/reactos/base/shell/explorer/explorer_intres.rc b/reactos/base/shell/explorer/explorer_intres.rc new file mode 100644 index 00000000000..06be918683a --- /dev/null +++ b/reactos/base/shell/explorer/explorer_intres.rc @@ -0,0 +1,223 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// Neutral resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_NEU) +#ifdef _WIN32 +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +#pragma code_page(1252) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Bitmap +// + +IDB_DRIVEBAR BITMAP MOVEABLE PURE "res/drivebar.bmp" +IDB_LOGOV BITMAP MOVEABLE PURE "res/logov.bmp" +IDB_LOGOV256 BITMAP MOVEABLE PURE "res/logov256.bmp" +IDB_LOGOV16 BITMAP MOVEABLE PURE "res/logov16.bmp" +IDB_ICON_ALIGN_0 BITMAP MOVEABLE PURE "res/icoalig0.bmp" +IDB_ICON_ALIGN_1 BITMAP MOVEABLE PURE "res/icoalig1.bmp" +IDB_ICON_ALIGN_2 BITMAP MOVEABLE PURE "res/icoalig2.bmp" +IDB_ICON_ALIGN_3 BITMAP MOVEABLE PURE "res/icoalig3.bmp" +IDB_ICON_ALIGN_4 BITMAP MOVEABLE PURE "res/icoalig4.bmp" +IDB_ICON_ALIGN_5 BITMAP MOVEABLE PURE "res/icoalig5.bmp" +IDB_ICON_ALIGN_6 BITMAP MOVEABLE PURE "res/icoalig6.bmp" +IDB_ICON_ALIGN_7 BITMAP MOVEABLE PURE "res/icoalig7.bmp" +IDB_ICON_ALIGN_8 BITMAP MOVEABLE PURE "res/icoalig8.bmp" +IDB_ICON_ALIGN_9 BITMAP MOVEABLE PURE "res/icoalig9.bmp" +IDB_ICON_ALIGN_10 BITMAP MOVEABLE PURE "res/icoali10.bmp" +IDB_MDI BITMAP MOVEABLE PURE "res/mdi.bmp" +IDB_SDI BITMAP MOVEABLE PURE "res/sdi.bmp" + +///////////////////////////////////////////////////////////////////////////// +// +// Accelerator +// + +IDA_EXPLORER ACCELERATORS MOVEABLE PURE +BEGIN + "X", ID_FILE_EXIT, VIRTKEY, ALT, NOINVERT + "S", ID_VIEW_FULLSCREEN, VIRTKEY, SHIFT, CONTROL, + NOINVERT +END + +IDA_SEARCH_PROGRAM ACCELERATORS MOVEABLE PURE +BEGIN + VK_F5, ID_REFRESH, VIRTKEY, NOINVERT +END + +IDA_TRAYNOTIFY ACCELERATORS MOVEABLE PURE +BEGIN + VK_F5, ID_REFRESH, VIRTKEY, NOINVERT +END + + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE MOVEABLE PURE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE MOVEABLE PURE +BEGIN + "#include \r\n" + "\0" +END + +3 TEXTINCLUDE MOVEABLE PURE +BEGIN + "#ifndef ROSSHELL\r\n" + "IDB_IMAGES BITMAP DISCARDABLE ""res/images.bmp""\r\n" + "IDB_TOOLBAR BITMAP DISCARDABLE ""res/toolbar.bmp""\r\n" + "#endif\r\n" + "#ifndef _ROS_\r\n" + "LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL\r\n" + "STRINGTABLE DISCARDABLE \r\n" + "BEGIN\r\n" + "IDS_VERSION_STR """"\r\n" + "#ifdef UNICODE\r\n" + "IDS_EXPLORER_VERSION_STR ""ROS Explorer%0s""\r\n" + "#else\r\n" + "IDS_EXPLORER_VERSION_STR ""ROS Explorer Ansi%0s""\r\n" + "#endif\r\n" + "END\r\n" + "#endif\r\n" + "#ifndef _DEBUG\r\n" + "CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST DISCARDABLE PURE ""explorer.exe.manifest""\r\n" + "#endif\r\n" + "\r\n" + "#include ""explorer-en.rc""\r\n" + "#include ""explorer-de.rc""\r\n" + "#include ""explorer-es.rc""\r\n" + "#include ""explorer-sv.rc""\r\n" + "#include ""explorer-pl.rc""\r\n" + "#include ""explorer-pt.rc""\r\n" + "#include ""explorer-cz.rc""\r\n" + "#include ""explorer-ro.rc""\r\n" + "#include ""explorer-ru.rc""\r\n" + "#include ""explorer-jp.rc""\r\n" + "#include ""explorer-hu.rc""\r\n" + "#include ""explorer-uk.rc""\r\n" + "\r\n" + "#ifndef __WINDRES__\r\n" + "#include ""explorer-cn.rc""\r\n" + "#endif\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +IDI_REACTOS ICON DISCARDABLE "res/reactos.ico" +IDI_EXPLORER ICON DISCARDABLE "res/explorer.ico" +IDI_STARTMENU ICON DISCARDABLE "res/startmenu.ico" +IDI_LOGOFF ICON DISCARDABLE "res/logoff.ico" +IDI_SHUTDOWN ICON DISCARDABLE "res/shutdown.ico" +IDI_ARROW ICON DISCARDABLE "res/arrow.ico" +IDI_ARROW_SELECTED ICON DISCARDABLE "res/arrowsel.ico" +IDI_APPICON ICON DISCARDABLE "res/appicon.ico" +IDI_FLOATING ICON DISCARDABLE "res/floating.ico" +IDI_REACTOS_BIG ICON DISCARDABLE "res/ros-big.ico" +IDI_CONFIG ICON DISCARDABLE "res/config.ico" +IDI_DOCUMENTS ICON DISCARDABLE "res/documents.ico" +IDI_FAVORITES ICON DISCARDABLE "res/favorites.ico" +IDI_INFO ICON DISCARDABLE "res/info.ico" +IDI_APPS ICON DISCARDABLE "res/apps.ico" +IDI_SEARCH ICON DISCARDABLE "res/search.ico" +IDI_ACTION ICON DISCARDABLE "res/action.ico" +IDI_FOLDER ICON DISCARDABLE "res/folder.ico" +IDI_SEARCH_DOC ICON DISCARDABLE "res/search-doc.ico" +IDI_PRINTER ICON DISCARDABLE "res/printer.ico" +IDI_NETWORK ICON DISCARDABLE "res/network.ico" +IDI_COMPUTER ICON DISCARDABLE "res/computer.ico" +IDI_SPEAKER ICON DISCARDABLE "res/speaker.ico" +IDI_DOT ICON DISCARDABLE "res/dot.ico" +IDI_DOT_TRANS ICON DISCARDABLE "res/dot_trans.ico" +IDI_DOT_RED ICON DISCARDABLE "res/dot_red.ico" +IDI_ARROW_UP ICON DISCARDABLE "res/arrow_up.ico" +IDI_ARROW_DOWN ICON DISCARDABLE "res/arrow_dwn.ico" +IDI_NOTIFY_L ICON DISCARDABLE "res/notify_l.ico" +IDI_NOTIFY_R ICON DISCARDABLE "res/notify_r.ico" +IDI_MINIMIZE ICON DISCARDABLE "res/minimize.ico" +IDI_CONTROLPAN ICON DISCARDABLE "res/control-panel.ico" +IDI_DESKSETTING ICON DISCARDABLE "res/desktop-settings.ico" +IDI_NETCONNS ICON DISCARDABLE "res/network-conns.ico" +IDI_ADMIN ICON DISCARDABLE "res/administration.ico" +IDI_RECENT ICON DISCARDABLE "res/recent-documents.ico" +#endif // Neutral resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// +#ifndef ROSSHELL +IDB_IMAGES BITMAP DISCARDABLE "res/images.bmp" +IDB_TOOLBAR BITMAP DISCARDABLE "res/toolbar.bmp" +#endif +#ifndef _ROS_ +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +STRINGTABLE DISCARDABLE +BEGIN +IDS_VERSION_STR "" +#ifdef UNICODE +IDS_EXPLORER_VERSION_STR "ROS Explorer%0s" +#else +IDS_EXPLORER_VERSION_STR "ROS Explorer Ansi%0s" +#endif +END +#endif +#ifndef _DEBUG +CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST DISCARDABLE PURE "explorer.exe.manifest" +#endif + +#include "explorer-en.rc" +#include "explorer-de.rc" +#include "explorer-es.rc" +#include "explorer-sv.rc" +#include "explorer-pl.rc" +#include "explorer-pt.rc" +#include "explorer-cz.rc" +#include "explorer-ro.rc" +#include "explorer-ru.rc" +#include "explorer-jp.rc" +#include "explorer-hu.rc" +#include "explorer-uk.rc" + +#ifndef __WINDRES__ +#include "explorer-cn.rc" +#endif + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/reactos/base/shell/explorer/externals.h b/reactos/base/shell/explorer/externals.h new file mode 100644 index 00000000000..50e7650868c --- /dev/null +++ b/reactos/base/shell/explorer/externals.h @@ -0,0 +1,52 @@ +/* + * Copyright 2003, 2004 Martin Fuchs + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + + // + // Explorer clone + // + // externals.h + // + // Martin Fuchs, 07.06.2003 + // + + +#ifdef __cplusplus +extern "C" { +#endif + + + // explorer main routine +extern int explorer_main(HINSTANCE hinstance, LPTSTR lpCmdLine, int cmdshow); + + // display explorer/file manager window +extern void explorer_show_frame(int cmdshow, LPTSTR lpCmdLine=NULL); + + // display explorer "About" dialog +extern void explorer_about(HWND hwndParent); + + // test for already running desktop instance +extern BOOL IsAnyDesktopRunning(); + + // show shutdown dialog +extern void ShowExitWindowsDialog(HWND hwndOwner); + +#ifdef __cplusplus +} // extern "C" +#endif + diff --git a/reactos/base/shell/explorer/globals.h b/reactos/base/shell/explorer/globals.h new file mode 100644 index 00000000000..63cd3731a63 --- /dev/null +++ b/reactos/base/shell/explorer/globals.h @@ -0,0 +1,348 @@ +/* + * Copyright 2003, 2004 Martin Fuchs + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + + // + // Explorer clone + // + // globals.h + // + // Martin Fuchs, 23.07.2003 + // + + +#include "utility/xmlstorage.h" + +using namespace XMLStorage; + +#include "taskbar/favorites.h" + + + /// management of file types +struct FileTypeInfo { + String _classname; + String _displayname; + bool _neverShowExt; +}; + +struct FileTypeManager : public map +{ + typedef map super; + + const FileTypeInfo& operator[](String ext); + + static bool is_exe_file(LPCTSTR ext); + + LPCTSTR set_type(struct Entry* entry, bool dont_hide_ext=false); +}; + + +enum ICON_TYPE { + IT_STATIC, + IT_CACHED, + IT_DYNAMIC, + IT_SYSCACHE +}; + +enum ICON_ID { + ICID_UNKNOWN, + ICID_NONE, + + ICID_FOLDER, + //ICID_DOCUMENT, + ICID_APP, + ICID_EXPLORER, + + ICID_CONFIG, + ICID_DOCUMENTS, + ICID_FAVORITES, + ICID_INFO, + ICID_APPS, + ICID_SEARCH, + ICID_ACTION, + ICID_SEARCH_DOC, + ICID_PRINTER, + ICID_NETWORK, + ICID_COMPUTER, + ICID_LOGOFF, + ICID_SHUTDOWN, + ICID_BOOKMARK, + ICID_MINIMIZE, + ICID_CONTROLPAN, + ICID_DESKSETTING, + ICID_NETCONNS, + ICID_ADMIN, + ICID_RECENT, + + ICID_DYNAMIC +}; + +struct Icon { + Icon(); + Icon(ICON_ID id, UINT nid); + Icon(ICON_ID id, UINT nid, int icon_size); + Icon(ICON_TYPE itype, int id, HICON hIcon); + Icon(ICON_TYPE itype, int id, int sys_idx); + + operator ICON_ID() const {return _id;} + + void draw(HDC hdc, int x, int y, int cx, int cy, COLORREF bk_color, HBRUSH bk_brush) const; + HBITMAP create_bitmap(COLORREF bk_color, HBRUSH hbrBkgnd, HDC hdc_wnd) const; + int add_to_imagelist(HIMAGELIST himl, HDC hdc_wnd, COLORREF bk_color=GetSysColor(COLOR_WINDOW), HBRUSH bk_brush=GetSysColorBrush(COLOR_WINDOW)) const; + + int get_sysiml_idx() const {return _itype==IT_SYSCACHE? _sys_idx: -1;} + HICON get_hicon() const {return _itype!=IT_SYSCACHE? _hicon: 0;} + + bool destroy() {if (_itype == IT_DYNAMIC) {DestroyIcon(_hicon); return true;} else return false;} + +protected: + ICON_ID _id; + ICON_TYPE _itype; + HICON _hicon; + int _sys_idx; +}; + +struct SysCacheIcon : public Icon { + SysCacheIcon(int id, int sys_idx) + : Icon(IT_SYSCACHE, id, sys_idx) {} +}; + +struct IconCache { + IconCache() : _himlSys_small(0) {} + + void init(); + + const Icon& extract(LPCTSTR path, ICONCACHE_FLAGS flags=ICF_NORMAL); + const Icon& extract(LPCTSTR path, int icon_idx, ICONCACHE_FLAGS flags=ICF_HICON); + const Icon& extract(IExtractIcon* pExtract, LPCTSTR path, int icon_idx, ICONCACHE_FLAGS flags=ICF_HICON); + + const Icon& add(HICON hIcon, ICON_TYPE type=IT_DYNAMIC); + const Icon& add(int sys_idx/*, ICON_TYPE type=IT_SYSCACHE*/); + + const Icon& get_icon(int icon_id); + + HIMAGELIST get_sys_imagelist() const {return _himlSys_small;} + + void free_icon(int icon_id); + +protected: + static int s_next_id; + + typedef map IconMap; + IconMap _icons; + + typedef pair CacheKey; + typedef map PathCacheMap; + PathCacheMap _pathCache; + + typedef pair > IdxCacheKey; + typedef map IdxCacheMap; + IdxCacheMap _idxCache; + + HIMAGELIST _himlSys_small; +}; + + +#define ICON_SIZE_SMALL 16 // GetSystemMetrics(SM_CXSMICON) +#define ICON_SIZE_MIDDLE 24 // special size for start menu root icons +#define ICON_SIZE_LARGE 32 // GetSystemMetrics(SM_CXICON) + +#define STARTMENUROOT_ICON_SIZE ICON_SIZE_MIDDLE // ICON_SIZE_LARGE + +#define ICON_SIZE_FROM_ICF(flags) (flags&ICF_LARGE? ICON_SIZE_LARGE: flags&ICF_MIDDLE? ICON_SIZE_MIDDLE: ICON_SIZE_SMALL) +#define ICF_FROM_ICON_SIZE(size) (size>=ICON_SIZE_LARGE? ICF_LARGE: size>=ICON_SIZE_MIDDLE? ICF_MIDDLE: ICF_NORMAL) + + + /// create a bitmap from an icon +extern HBITMAP create_bitmap_from_icon(HICON hIcon, HBRUSH hbrush_bkgnd, HDC hdc_wnd/*, int icon_size*/); + + /// add icon with alpha channel to imagelist using the specified background color +extern int ImageList_AddAlphaIcon(HIMAGELIST himl, HICON hIcon, HBRUSH hbrush_bkgnd, HDC hdc_wnd); + + /// retrieve icon from window +extern HICON get_window_icon_small(HWND hwnd); +extern HICON get_window_icon_big(HWND hwnd, bool allow_from_class=true); + + + /// desktop management +#ifdef _USE_HDESK + +typedef auto_ptr DesktopThreadPtr; + +struct Desktop +{ + HDESK _hdesktop; +// HWINSTA _hwinsta; + DesktopThreadPtr _pThread; + WindowHandle _hwndDesktop; + + Desktop(HDESK hdesktop=0/*, HWINSTA hwinsta=0*/); + ~Desktop(); +}; + +typedef auto_ptr DesktopPtr; +typedef DesktopPtr DesktopRef; + + /// Thread class for additional desktops +struct DesktopThread : public Thread +{ + DesktopThread(Desktop& desktop) + : _desktop(desktop) + { + } + + int Run(); + +protected: + Desktop& _desktop; +}; + +#else + +typedef pair MinimizeStruct; + +struct Desktop +{ + set _windows; + WindowHandle _hwndForeground; + list _minimized; +}; +typedef Desktop DesktopRef; + +#endif + + +#define DESKTOP_COUNT 4 + +struct Desktops : public vector +{ + Desktops(); + ~Desktops(); + + void init(); + void SwitchToDesktop(int idx); + void ToggleMinimize(); + +#ifdef _USE_HDESK + DesktopRef& get_current_Desktop() {return (*this)[_current_desktop];} +#endif + + int _current_desktop; +}; + + + /// structure containing global variables of Explorer +extern struct ExplorerGlobals +{ + ExplorerGlobals(); + + void init(HINSTANCE hInstance); + + void read_persistent(); + void write_persistent(); + + XMLPos get_cfg(); + XMLPos get_cfg(const char* path); + + HINSTANCE _hInstance; + UINT _cfStrFName; + +#ifndef ROSSHELL + ATOM _hframeClass; + HWND _hMainWnd; + bool _desktop_mode; + bool _prescan_nodes; +#endif + + FILE* _log; + +#ifndef __MINGW32__ // SHRestricted() missing in MinGW (as of 29.10.2003) + DWORD(STDAPICALLTYPE* _SHRestricted)(RESTRICTIONS); +#endif + + FileTypeManager _ftype_mgr; + IconCache _icon_cache; + + HWND _hwndDesktopBar; + HWND _hwndShellView; + HWND _hwndDesktop; + + Desktops _desktops; + + XMLDoc _cfg; + String _cfg_dir; + String _cfg_path; + + Favorites _favorites; + String _favorites_path; +} g_Globals; + + + /// convenient loading of string resources +struct ResString : public String +{ + ResString(UINT nid); +}; + + /// convenient loading of standard (32x32) icon resources +struct ResIcon +{ + ResIcon(UINT nid); + + operator HICON() const {return _hicon;} + +protected: + HICON _hicon; +}; + + /// convenient loading of small (16x16) icon resources +struct SmallIcon +{ + SmallIcon(UINT nid); + + operator HICON() const {return _hicon;} + +protected: + HICON _hicon; +}; + + /// convenient loading of icon resources with specified sizes +struct ResIconEx +{ + ResIconEx(UINT nid, int w, int h); + + operator HICON() const {return _hicon;} + +protected: + HICON _hicon; +}; + + /// set big and small icons out of the resources for a window +extern void SetWindowIcon(HWND hwnd, UINT nid); + + /// convenient loading of bitmap resources +struct ResBitmap +{ + ResBitmap(UINT nid); + ~ResBitmap() {DeleteObject(_hBmp);} + + operator HBITMAP() const {return _hBmp;} + +protected: + HBITMAP _hBmp; +}; diff --git a/reactos/base/shell/explorer/i386-stub-win32.c b/reactos/base/shell/explorer/i386-stub-win32.c new file mode 100644 index 00000000000..3587612d704 --- /dev/null +++ b/reactos/base/shell/explorer/i386-stub-win32.c @@ -0,0 +1,1278 @@ +/**************************************************************************** + + THIS SOFTWARE IS NOT COPYRIGHTED + + HP offers the following for use in the public domain. HP makes no + warranty with regard to the software or it's performance and the + user accepts the software "AS IS" with all faults. + + HP DISCLAIMS ANY WARRANTIES, EXPRESS OR IMPLIED, WITH REGARD + TO THIS SOFTWARE INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + +****************************************************************************/ + +/**************************************************************************** + * Header: remcom.c,v 1.34 91/03/09 12:29:49 glenne Exp $ + * + * Module name: remcom.c $ + * Revision: 1.34 $ + * Date: 91/03/09 12:29:49 $ + * Contributor: Lake Stevens Instrument Division$ + * + * Description: low level support for gdb debugger. $ + * + * Considerations: only works on target hardware $ + * + * Written by: Glenn Engel $ + * ModuleState: Experimental $ + * + * NOTES: See Below $ + * + * Modified for 386 by Jim Kingdon, Cygnus Support. + * + * To enable debugger support, two things need to happen. One, a + * call to set_debug_traps() is necessary in order to allow any breakpoints + * or error conditions to be properly intercepted and reported to gdb. + * Two, a breakpoint needs to be generated to begin communication. This + * is most easily accomplished by a call to breakpoint(). Breakpoint() + * simulates a breakpoint by executing a trap #1. + * + * The external function exceptionHandler() is + * used to attach a specific handler to a specific 386 vector number. + * It should use the same privilege level it runs at. It should + * install it as an interrupt gate so that interrupts are masked + * while the handler runs. + * + * Because gdb will sometimes write to the stack area to execute function + * calls, this program cannot rely on using the supervisor stack so it + * uses it's own stack area reserved in the int array remcomStack. + * + ************* + * + * The following gdb commands are supported: + * + * command function Return value + * + * g return the value of the CPU registers hex data or ENN + * G set the value of the CPU registers OK or ENN + * + * mAA..AA,LLLL Read LLLL bytes at address AA..AA hex data or ENN + * MAA..AA,LLLL: Write LLLL bytes at address AA.AA OK or ENN + * + * c Resume at current address SNN ( signal NN) + * cAA..AA Continue at address AA..AA SNN + * + * s Step one instruction SNN + * sAA..AA Step one instruction from AA..AA SNN + * + * k kill + * + * ? What was the last sigval ? SNN (signal NN) + * + * All commands and responses are sent with a packet which includes a + * checksum. A packet consists of + * + * $#. + * + * where + * :: + * :: < two hex digits computed as modulo 256 sum of > + * + * When a packet is received, it is first acknowledged with either '+' or '-'. + * '+' indicates a successful transfer. '-' indicates a failed transfer. + * + * Example: + * + * Host: Reply: + * $m0,10#2a +$00010203040506070809101112131415#42 + * + ****************************************************************************/ + +#include +#include + +#include "utility/utility.h" // for strcpy_s() + +/************************************************************************ + * + * external low-level support routines + */ + +extern void putDebugChar(); /* write a single character */ +extern int getDebugChar(); /* read and return a single char */ +extern void exceptionHandler(); /* assign an exception handler */ + +/************************************************************************/ +/* BUFMAX defines the maximum number of characters in inbound/outbound buffers*/ +/* at least NUMREGBYTES*2 are needed for register packets */ +#define BUFMAX 400 + +static char initialized; /* boolean flag. != 0 means we've been initialized */ + +int remote_debug; +/* debug > 0 prints ill-formed commands in valid packets & checksum errors */ + +static const char hexchars[]="0123456789abcdef"; + +/* Number of registers. */ +#define NUMREGS 16 + +/* Number of bytes of registers. */ +#define NUMREGBYTES (NUMREGS * 4) + +enum regnames {EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI, + PC /* also known as eip */, + PS /* also known as eflags */, + CS, SS, DS, ES, FS, GS}; + +/* + * these should not be static cuz they can be used outside this module + */ +int registers[NUMREGS]; + +#ifndef WIN32 //MF + +#define STACKSIZE 10000 +int remcomStack[STACKSIZE/sizeof(int)]; +static int* stackPtr = &remcomStack[STACKSIZE/sizeof(int) - 1]; + +/*************************** ASSEMBLY CODE MACROS *************************/ +/* */ + +extern void +return_to_prog (); + +/* Restore the program's registers (including the stack pointer, which + means we get the right stack and don't have to worry about popping our + return address and any stack frames and so on) and return. */ +asm(".text"); +asm(".globl _return_to_prog"); +asm("_return_to_prog:"); +asm(" movw _registers+44, %ss"); +asm(" movl _registers+16, %esp"); +asm(" movl _registers+4, %ecx"); +asm(" movl _registers+8, %edx"); +asm(" movl _registers+12, %ebx"); +asm(" movl _registers+20, %ebp"); +asm(" movl _registers+24, %esi"); +asm(" movl _registers+28, %edi"); +asm(" movw _registers+48, %ds"); +asm(" movw _registers+52, %es"); +asm(" movw _registers+56, %fs"); +asm(" movw _registers+60, %gs"); +asm(" movl _registers+36, %eax"); +asm(" pushl %eax"); /* saved eflags */ +asm(" movl _registers+40, %eax"); +asm(" pushl %eax"); /* saved cs */ +asm(" movl _registers+32, %eax"); +asm(" pushl %eax"); /* saved eip */ +asm(" movl _registers, %eax"); + +asm("ret"); //MF + +/* use iret to restore pc and flags together so + that trace flag works right. */ +asm(" iret"); + + +#ifdef WIN32 //MF +asm(".data"); //MF +#endif + +/* Put the error code here just in case the user cares. */ +int gdb_i386errcode; +/* Likewise, the vector number here (since GDB only gets the signal + number through the usual means, and that's not very specific). */ +int gdb_i386vector = -1; + +/* GDB stores segment registers in 32-bit words (that's just the way + m-i386v.h is written). So zero the appropriate areas in registers. */ +#define SAVE_REGISTERS1() \ + asm ("movl %eax, _registers"); \ + asm ("movl %ecx, _registers+4"); \ + asm ("movl %edx, _registers+8"); \ + asm ("movl %ebx, _registers+12"); \ + asm ("movl %ebp, _registers+20"); \ + asm ("movl %esi, _registers+24"); \ + asm ("movl %edi, _registers+28"); \ + asm ("movw $0, %ax"); \ + asm ("movw %ds, _registers+48"); \ + asm ("movw %ax, _registers+50"); \ + asm ("movw %es, _registers+52"); \ + asm ("movw %ax, _registers+54"); \ + asm ("movw %fs, _registers+56"); \ + asm ("movw %ax, _registers+58"); \ + asm ("movw %gs, _registers+60"); \ + asm ("movw %ax, _registers+62"); +#define SAVE_ERRCODE() \ + asm ("popl %ebx"); \ + asm ("movl %ebx, _gdb_i386errcode"); +#define SAVE_REGISTERS2() \ + asm ("popl %ebx"); /* old eip */ \ + asm ("movl %ebx, _registers+32"); \ + asm ("popl %ebx"); /* old cs */ \ + asm ("movl %ebx, _registers+40"); \ + asm ("movw %ax, _registers+42"); \ + asm ("popl %ebx"); /* old eflags */ \ + asm ("movl %ebx, _registers+36"); \ + /* Now that we've done the pops, we can save the stack pointer."); */ \ + asm ("movw %ss, _registers+44"); \ + asm ("movw %ax, _registers+46"); \ + asm ("movl %esp, _registers+16"); + +/* See if mem_fault_routine is set, if so just IRET to that address. */ +#define CHECK_FAULT() \ + asm ("cmpl $0, _mem_fault_routine"); \ + asm ("jne mem_fault"); + +asm (".text"); +asm ("mem_fault:"); +/* OK to clobber temp registers; we're just going to end up in set_mem_err. */ +/* Pop error code from the stack and save it. */ +asm (" popl %eax"); +asm (" movl %eax, _gdb_i386errcode"); + +asm (" popl %eax"); /* eip */ +/* We don't want to return there, we want to return to the function + pointed to by mem_fault_routine instead. */ +asm (" movl _mem_fault_routine, %eax"); +asm (" popl %ecx"); /* cs (low 16 bits; junk in hi 16 bits). */ +asm (" popl %edx"); /* eflags */ + +/* Remove this stack frame; when we do the iret, we will be going to + the start of a function, so we want the stack to look just like it + would after a "call" instruction. */ +asm (" leave"); + +/* Push the stuff that iret wants. */ +asm (" pushl %edx"); /* eflags */ +asm (" pushl %ecx"); /* cs */ +asm (" pushl %eax"); /* eip */ + +/* Zero mem_fault_routine. */ +asm (" movl $0, %eax"); +asm (" movl %eax, _mem_fault_routine"); + +asm ("iret"); + + +#define CALL_HOOK() asm("call _remcomHandler"); + +/* This function is called when a i386 exception occurs. It saves + * all the cpu regs in the _registers array, munges the stack a bit, + * and invokes an exception handler (remcom_handler). + * + * stack on entry: stack on exit: + * old eflags vector number + * old cs (zero-filled to 32 bits) + * old eip + * + */ +extern void _catchException3(); +asm(".text"); +asm(".globl __catchException3"); +asm("__catchException3:"); +SAVE_REGISTERS1(); +SAVE_REGISTERS2(); +asm ("pushl $3"); +CALL_HOOK(); + +/* Same thing for exception 1. */ +extern void _catchException1(); +asm(".text"); +asm(".globl __catchException1"); +asm("__catchException1:"); +SAVE_REGISTERS1(); +SAVE_REGISTERS2(); +asm ("pushl $1"); +CALL_HOOK(); + +/* Same thing for exception 0. */ +extern void _catchException0(); +asm(".text"); +asm(".globl __catchException0"); +asm("__catchException0:"); +SAVE_REGISTERS1(); +SAVE_REGISTERS2(); +asm ("pushl $0"); +CALL_HOOK(); + +/* Same thing for exception 4. */ +extern void _catchException4(); +asm(".text"); +asm(".globl __catchException4"); +asm("__catchException4:"); +SAVE_REGISTERS1(); +SAVE_REGISTERS2(); +asm ("pushl $4"); +CALL_HOOK(); + +/* Same thing for exception 5. */ +extern void _catchException5(); +asm(".text"); +asm(".globl __catchException5"); +asm("__catchException5:"); +SAVE_REGISTERS1(); +SAVE_REGISTERS2(); +asm ("pushl $5"); +CALL_HOOK(); + +/* Same thing for exception 6. */ +extern void _catchException6(); +asm(".text"); +asm(".globl __catchException6"); +asm("__catchException6:"); +SAVE_REGISTERS1(); +SAVE_REGISTERS2(); +asm ("pushl $6"); +CALL_HOOK(); + +/* Same thing for exception 7. */ +extern void _catchException7(); +asm(".text"); +asm(".globl __catchException7"); +asm("__catchException7:"); +SAVE_REGISTERS1(); +SAVE_REGISTERS2(); +asm ("pushl $7"); +CALL_HOOK(); + +/* Same thing for exception 8. */ +extern void _catchException8(); +asm(".text"); +asm(".globl __catchException8"); +asm("__catchException8:"); +SAVE_REGISTERS1(); +SAVE_ERRCODE(); +SAVE_REGISTERS2(); +asm ("pushl $8"); +CALL_HOOK(); + +/* Same thing for exception 9. */ +extern void _catchException9(); +asm(".text"); +asm(".globl __catchException9"); +asm("__catchException9:"); +SAVE_REGISTERS1(); +SAVE_REGISTERS2(); +asm ("pushl $9"); +CALL_HOOK(); + +/* Same thing for exception 10. */ +extern void _catchException10(); +asm(".text"); +asm(".globl __catchException10"); +asm("__catchException10:"); +SAVE_REGISTERS1(); +SAVE_ERRCODE(); +SAVE_REGISTERS2(); +asm ("pushl $10"); +CALL_HOOK(); + +/* Same thing for exception 12. */ +extern void _catchException12(); +asm(".text"); +asm(".globl __catchException12"); +asm("__catchException12:"); +SAVE_REGISTERS1(); +SAVE_ERRCODE(); +SAVE_REGISTERS2(); +asm ("pushl $12"); +CALL_HOOK(); + +/* Same thing for exception 16. */ +extern void _catchException16(); +asm(".text"); +asm(".globl __catchException16"); +asm("__catchException16:"); +SAVE_REGISTERS1(); +SAVE_REGISTERS2(); +asm ("pushl $16"); +CALL_HOOK(); + +/* For 13, 11, and 14 we have to deal with the CHECK_FAULT stuff. */ + +/* Same thing for exception 13. */ +extern void _catchException13 (); +asm (".text"); +asm (".globl __catchException13"); +asm ("__catchException13:"); +CHECK_FAULT(); +SAVE_REGISTERS1(); +SAVE_ERRCODE(); +SAVE_REGISTERS2(); +asm ("pushl $13"); +CALL_HOOK(); + +/* Same thing for exception 11. */ +extern void _catchException11 (); +asm (".text"); +asm (".globl __catchException11"); +asm ("__catchException11:"); +CHECK_FAULT(); +SAVE_REGISTERS1(); +SAVE_ERRCODE(); +SAVE_REGISTERS2(); +asm ("pushl $11"); +CALL_HOOK(); + +/* Same thing for exception 14. */ +extern void _catchException14 (); +asm (".text"); +asm (".globl __catchException14"); +asm ("__catchException14:"); +CHECK_FAULT(); +SAVE_REGISTERS1(); +SAVE_ERRCODE(); +SAVE_REGISTERS2(); +asm ("pushl $14"); +CALL_HOOK(); + +/* + * remcomHandler is a front end for handle_exception. It moves the + * stack pointer into an area reserved for debugger use. + */ +asm("_remcomHandler:"); +asm(" popl %eax"); /* pop off return address */ +asm(" popl %eax"); /* get the exception number */ +asm(" movl _stackPtr, %esp"); /* move to remcom stack area */ +asm(" pushl %eax"); /* push exception onto stack */ +asm(" call _handle_exception"); /* this never returns */ + + +void +_returnFromException () +{ + return_to_prog (); +} + +#endif // !WIN32 + + +#ifdef _MSC_VER //MF +#define BREAKPOINT() __asm int 3; +#else +#define BREAKPOINT() asm(" int $3"); +#endif + + +#ifdef WIN32 //MF + +#define WIN32_LEAN_AND_MEAN +#include + +void handle_exception(int exceptionVector); + +void win32_exception_handler(EXCEPTION_POINTERS* exc_info) +{ + PCONTEXT ctx = exc_info->ContextRecord; + + registers[EAX] = ctx->Eax; + registers[ECX] = ctx->Ecx; + registers[EDX] = ctx->Edx; + registers[EBX] = ctx->Ebx; + registers[ESP] = ctx->Esp; + registers[EBP] = ctx->Ebp; + registers[ESI] = ctx->Esi; + registers[EDI] = ctx->Edi; + registers[PC] = ctx->Eip; + registers[PS] = ctx->EFlags; + registers[CS] = ctx->SegCs; + registers[SS] = ctx->SegSs; + registers[DS] = ctx->SegDs; + registers[ES] = ctx->SegEs; + registers[FS] = ctx->SegFs; + registers[GS] = ctx->SegGs; + + handle_exception(exc_info->ExceptionRecord->ExceptionCode & 0xFFFF); + + ctx->Eax = registers[EAX]; + ctx->Ecx = registers[ECX]; + ctx->Edx = registers[EDX]; + ctx->Ebx = registers[EBX]; + ctx->Esp = registers[ESP]; + ctx->Ebp = registers[EBP]; + ctx->Esi = registers[ESI]; + ctx->Edi = registers[EDI]; + ctx->Eip = registers[PC]; + ctx->EFlags = registers[PS]; + ctx->SegCs = registers[CS]; + ctx->SegSs = registers[SS]; + ctx->SegDs = registers[DS]; + ctx->SegEs = registers[ES]; + ctx->SegFs = registers[FS]; + ctx->SegGs = registers[GS]; +} + +#endif // WIN32 + + +int +hex (ch) + char ch; +{ + if ((ch >= 'a') && (ch <= 'f')) + return (ch - 'a' + 10); + if ((ch >= '0') && (ch <= '9')) + return (ch - '0'); + if ((ch >= 'A') && (ch <= 'F')) + return (ch - 'A' + 10); + return (-1); +} + +static char remcomInBuffer[BUFMAX]; +static char remcomOutBuffer[BUFMAX]; + +/* scan for the sequence $# */ + +char * +getpacket (void) +{ + char *buffer = &remcomInBuffer[0]; + unsigned char checksum; + unsigned char xmitcsum; + int count; + char ch; + + while (1) + { + /* wait around for the start character, ignore all other characters */ + while ((ch = getDebugChar ()) != '$') + ; + + retry: + checksum = 0; + xmitcsum = -1; + count = 0; + + /* now, read until a # or end of buffer is found */ + while (count < BUFMAX) + { + ch = getDebugChar (); + if (ch == '$') + goto retry; + if (ch == '#') + break; + checksum = checksum + ch; + buffer[count] = ch; + count = count + 1; + } + buffer[count] = 0; + + if (ch == '#') + { + ch = getDebugChar (); + xmitcsum = hex (ch) << 4; + ch = getDebugChar (); + xmitcsum += hex (ch); + + if (checksum != xmitcsum) + { + if (remote_debug) + { + fprintf (stderr, + "bad checksum. My count = 0x%x, sent=0x%x. buf=%s\n", + checksum, xmitcsum, buffer); + } + putDebugChar ('-'); /* failed checksum */ + } + else + { + putDebugChar ('+'); /* successful transfer */ + + /* if a sequence char is present, reply the sequence ID */ + if (buffer[2] == ':') + { + putDebugChar (buffer[0]); + putDebugChar (buffer[1]); + + return &buffer[3]; + } + + return &buffer[0]; + } + } + } +} + +/* send the packet in buffer. */ + +void +putpacket (char *buffer) +{ + unsigned char checksum; + int count; + char ch; + + /* $#. */ + do + { + putDebugChar ('$'); + checksum = 0; + count = 0; + + while ((ch = buffer[count]) != 0) + { + putDebugChar (ch); + checksum += ch; + count += 1; + } + + putDebugChar ('#'); + putDebugChar (hexchars[checksum >> 4]); + putDebugChar (hexchars[checksum % 16]); + + } + while (getDebugChar () != '+'); +} + +void debug_error (char* format/*, char* parm*/) +{ + if (remote_debug) + fprintf (stderr, format/*, parm*/); +} + +/* Address of a routine to RTE to if we get a memory fault. */ +static void (*volatile mem_fault_routine) () = NULL; + +/* Indicate to caller of mem2hex or hex2mem that there has been an + error. */ +static volatile int mem_err = 0; + +void +set_mem_err (void) +{ + mem_err = 1; +} + +/* These are separate functions so that they are so short and sweet + that the compiler won't save any registers (if there is a fault + to mem_fault, they won't get restored, so there better not be any + saved). */ +int +get_char (char *addr) +{ + return *addr; +} + +void +set_char (char *addr, int val) +{ + *addr = val; +} + +/* convert the memory pointed to by mem into hex, placing result in buf */ +/* return a pointer to the last char put in buf (null) */ +/* If MAY_FAULT is non-zero, then we should set mem_err in response to + a fault; if zero treat a fault like any other fault in the stub. */ +char * +mem2hex (mem, buf, count, may_fault) + char *mem; + char *buf; + int count; + int may_fault; +{ + int i; + unsigned char ch; + +#ifdef WIN32 //MF + if (IsBadReadPtr(mem, count)) + return mem; +#else + if (may_fault) + mem_fault_routine = set_mem_err; +#endif + for (i = 0; i < count; i++) + { + ch = get_char (mem++); + if (may_fault && mem_err) + return (buf); + *buf++ = hexchars[ch >> 4]; + *buf++ = hexchars[ch % 16]; + } + *buf = 0; +#ifndef WIN32 //MF + if (may_fault) + mem_fault_routine = NULL; +#endif + return (buf); +} + +/* convert the hex array pointed to by buf into binary to be placed in mem */ +/* return a pointer to the character AFTER the last byte written */ +char * +hex2mem (buf, mem, count, may_fault) + char *buf; + char *mem; + int count; + int may_fault; +{ + int i; + unsigned char ch; + +#ifdef WIN32 //MF + // MinGW does not support structured exception handling, so let's + // go safe and make memory writable by default + DWORD old_protect; + + VirtualProtect(mem, count, PAGE_EXECUTE_READWRITE, &old_protect); +#else + if (may_fault) + mem_fault_routine = set_mem_err; +#endif + + for (i = 0; i < count; i++) + { + ch = hex (*buf++) << 4; + ch = ch + hex (*buf++); + set_char (mem++, ch); + if (may_fault && mem_err) + return (mem); + } + +#ifndef WIN32 //MF + if (may_fault) + mem_fault_routine = NULL; +#endif + + return (mem); +} + +/* this function takes the 386 exception vector and attempts to + translate this number into a unix compatible signal value */ +int +computeSignal (int exceptionVector) +{ + int sigval; + switch (exceptionVector) + { + case 0: + sigval = 8; + break; /* divide by zero */ + case 1: + sigval = 5; + break; /* debug exception */ + case 3: + sigval = 5; + break; /* breakpoint */ + case 4: + sigval = 16; + break; /* into instruction (overflow) */ + case 5: + sigval = 16; + break; /* bound instruction */ + case 6: + sigval = 4; + break; /* Invalid opcode */ + case 7: + sigval = 8; + break; /* coprocessor not available */ + case 8: + sigval = 7; + break; /* double fault */ + case 9: + sigval = 11; + break; /* coprocessor segment overrun */ + case 10: + sigval = 11; + break; /* Invalid TSS */ + case 11: + sigval = 11; + break; /* Segment not present */ + case 12: + sigval = 11; + break; /* stack exception */ + case 13: + sigval = 11; + break; /* general protection */ + case 14: + sigval = 11; + break; /* page fault */ + case 16: + sigval = 7; + break; /* coprocessor error */ + default: + sigval = 7; /* "software generated" */ + } + return (sigval); +} + +/**********************************************/ +/* WHILE WE FIND NICE HEX CHARS, BUILD AN INT */ +/* RETURN NUMBER OF CHARS PROCESSED */ +/**********************************************/ +int +hexToInt (char **ptr, int *intValue) +{ + int numChars = 0; + int hexValue; + + *intValue = 0; + + while (**ptr) + { + hexValue = hex (**ptr); + if (hexValue >= 0) + { + *intValue = (*intValue << 4) | hexValue; + numChars++; + } + else + break; + + (*ptr)++; + } + + return (numChars); +} + +/* + * This function does all command procesing for interfacing to gdb. + */ +void +handle_exception (int exceptionVector) +{ + int sigval, stepping; + int addr, length; + char *ptr; + int newPC; + +#ifndef WIN32 //MF + gdb_i386vector = exceptionVector; +#endif + + if (remote_debug) + { + printf ("vector=%d, sr=0x%x, pc=0x%x\n", + exceptionVector, registers[PS], registers[PC]); + } + + /* reply to host that an exception has occurred */ + sigval = computeSignal (exceptionVector); + + ptr = remcomOutBuffer; + + *ptr++ = 'T'; /* notify gdb with signo, PC, FP and SP */ + *ptr++ = hexchars[sigval >> 4]; + *ptr++ = hexchars[sigval & 0xf]; + + *ptr++ = hexchars[ESP]; + *ptr++ = ':'; + ptr = mem2hex((char *)®isters[ESP], ptr, 4, 0); /* SP */ + *ptr++ = ';'; + + *ptr++ = hexchars[EBP]; + *ptr++ = ':'; + ptr = mem2hex((char *)®isters[EBP], ptr, 4, 0); /* FP */ + *ptr++ = ';'; + + *ptr++ = hexchars[PC]; + *ptr++ = ':'; + ptr = mem2hex((char *)®isters[PC], ptr, 4, 0); /* PC */ + *ptr++ = ';'; + + *ptr = '\0'; + + putpacket (remcomOutBuffer); + + stepping = 0; + + while (1 == 1) + { + remcomOutBuffer[0] = 0; + ptr = getpacket (); + + switch (*ptr++) + { + case '?': + remcomOutBuffer[0] = 'S'; + remcomOutBuffer[1] = hexchars[sigval >> 4]; + remcomOutBuffer[2] = hexchars[sigval % 16]; + remcomOutBuffer[3] = 0; + break; + case 'd': + remote_debug = !(remote_debug); /* toggle debug flag */ + break; + case 'g': /* return the value of the CPU registers */ + mem2hex ((char *) registers, remcomOutBuffer, NUMREGBYTES, 0); + break; + case 'G': /* set the value of the CPU registers - return OK */ + hex2mem (ptr, (char *) registers, NUMREGBYTES, 0); + strcpy_s(remcomOutBuffer, BUFMAX, "OK"); + break; + case 'P': /* set the value of a single CPU register - return OK */ + { + int regno; + + if (hexToInt (&ptr, ®no) && *ptr++ == '=') + if (regno >= 0 && regno < NUMREGS) + { + hex2mem (ptr, (char *) ®isters[regno], 4, 0); + strcpy_s(remcomOutBuffer, BUFMAX, "OK"); + break; + } + + strcpy_s(remcomOutBuffer, BUFMAX, "E01"); + break; + } + + /* mAA..AA,LLLL Read LLLL bytes at address AA..AA */ + case 'm': + /* TRY TO READ %x,%x. IF SUCCEED, SET PTR = 0 */ + if (hexToInt (&ptr, &addr)) + if (*(ptr++) == ',') + if (hexToInt (&ptr, &length)) + { + ptr = 0; + mem_err = 0; + mem2hex ((char *) addr, remcomOutBuffer, length, 1); + if (mem_err) + { + strcpy_s(remcomOutBuffer, BUFMAX, "E03"); + debug_error ("memory fault"); + } + } + + if (ptr) + { + strcpy_s(remcomOutBuffer, BUFMAX, "E01"); + } + break; + + /* MAA..AA,LLLL: Write LLLL bytes at address AA.AA return OK */ + case 'M': + /* TRY TO READ '%x,%x:'. IF SUCCEED, SET PTR = 0 */ + if (hexToInt (&ptr, &addr)) + if (*(ptr++) == ',') + if (hexToInt (&ptr, &length)) + if (*(ptr++) == ':') + { + mem_err = 0; + hex2mem (ptr, (char *) addr, length, 1); + + if (mem_err) + { + strcpy_s(remcomOutBuffer, BUFMAX, "E03"); + debug_error ("memory fault"); + } + else + { + strcpy_s(remcomOutBuffer, BUFMAX, "OK"); + } + + ptr = 0; + } + if (ptr) + { + strcpy_s(remcomOutBuffer, BUFMAX, "E02"); + } + break; + + /* cAA..AA Continue at address AA..AA(optional) */ + /* sAA..AA Step one instruction from AA..AA(optional) */ + case 's': + stepping = 1; + case 'c': + /* try to read optional parameter, pc unchanged if no parm */ + if (hexToInt (&ptr, &addr)) + registers[PC] = addr; + + newPC = registers[PC]; + + /* clear the trace bit */ + registers[PS] &= 0xfffffeff; + + /* set the trace bit if we're stepping */ + if (stepping) + registers[PS] |= 0x100; + +#ifdef WIN32 //MF + return; +#else + _returnFromException (); /* this is a jump */ +#endif + break; + + /* kill the program */ + case 'k': /* do nothing */ +#if 0 + /* Huh? This doesn't look like "nothing". + m68k-stub.c and sparc-stub.c don't have it. */ + BREAKPOINT (); +#endif + break; + } /* switch */ + + /* reply to the request */ + putpacket (remcomOutBuffer); + } +} + +/* this function is used to set up exception handlers for tracing and + breakpoints */ +void +set_debug_traps (void) +{ +#ifndef WIN32 //MF + stackPtr = &remcomStack[STACKSIZE / sizeof (int) - 1]; + + exceptionHandler (0, _catchException0); + exceptionHandler (1, _catchException1); + exceptionHandler (3, _catchException3); + exceptionHandler (4, _catchException4); + exceptionHandler (5, _catchException5); + exceptionHandler (6, _catchException6); + exceptionHandler (7, _catchException7); + exceptionHandler (8, _catchException8); + exceptionHandler (9, _catchException9); + exceptionHandler (10, _catchException10); + exceptionHandler (11, _catchException11); + exceptionHandler (12, _catchException12); + exceptionHandler (13, _catchException13); + exceptionHandler (14, _catchException14); + exceptionHandler (16, _catchException16); +#endif // WIN32 + + initialized = 1; +} + +/* This function will generate a breakpoint exception. It is used at the + beginning of a program to sync up with a debugger and can be used + otherwise as a quick means to stop program execution and "break" into + the debugger. */ + +void +breakpoint (void) +{ + if (initialized) + BREAKPOINT (); +} + + + + // + // debugger stub implementation for WIN32 applications + // M. Fuchs, 29.11.2003 + // + +#ifdef WIN32 + +#include +#include + +#include "utility/utility.h" + + +int s_initial_breakpoint = 0; + + +#ifdef DEBUG_SERIAL + +FILE* ser_port = NULL; + +int init_gdb_connect() +{ + //TODO: set up connection using serial communication port + + ser_port = fopen("COM1:", "rwb"); + + return 1; +} + +int getDebugChar() +{ + return fgetc(ser_port); +} + +void putDebugChar(int c) +{ + fputc(c, ser_port); +} + + +#else // DEBUG_SERIAL + + +static LPTOP_LEVEL_EXCEPTION_FILTER s_prev_exc_handler = 0; + + +#define I386_EXCEPTION_CNT 17 + +LONG WINAPI exc_protection_handler(EXCEPTION_POINTERS* exc_info) +{ + int exc_nr = exc_info->ExceptionRecord->ExceptionCode & 0xFFFF; + + if (exc_nr < I386_EXCEPTION_CNT) { + //LOG(FmtString(TEXT("exc_protection_handler: Exception %x"), exc_nr)); + + if (exc_nr==11 || exc_nr==13 || exc_nr==14) { + if (mem_fault_routine) + mem_fault_routine(); + } + + ++exc_info->ContextRecord->Eip; + } + + return EXCEPTION_CONTINUE_EXECUTION; +} + +LONG WINAPI exc_handler(EXCEPTION_POINTERS* exc_info) +{ + int exc_nr = exc_info->ExceptionRecord->ExceptionCode & 0xFFFF; + + if (exc_nr < I386_EXCEPTION_CNT) { + //LOG(FmtString("Exception %x", exc_nr)); + //LOG(FmtString("EIP=%08X EFLAGS=%08X", exc_info->ContextRecord->Eip, exc_info->ContextRecord->EFlags)); + + // step over initial breakpoint + if (s_initial_breakpoint) { + s_initial_breakpoint = 0; + ++exc_info->ContextRecord->Eip; + } + + SetUnhandledExceptionFilter(exc_protection_handler); + + win32_exception_handler(exc_info); + //LOG(FmtString("EIP=%08X EFLAGS=%08X", exc_info->ContextRecord->Eip, exc_info->ContextRecord->EFlags)); + + SetUnhandledExceptionFilter(exc_handler); + + return EXCEPTION_CONTINUE_EXECUTION; + } + + return EXCEPTION_CONTINUE_SEARCH; +} + +/* not needed because we use win32_exception_handler() instead of catchExceptionX() +void exceptionHandler(int exc_nr, void* exc_addr) +{ + if (exc_nr>=0 && exc_nr +#ifdef _MSC_VER +#pragma comment(lib, "wsock32") +#endif + +static int s_rem_fd = -1; + +int init_gdb_connect() +{ + SOCKADDR_IN srv_addr = {0}; + SOCKADDR_IN rem_addr; + WSADATA wsa_data; + int srv_socket, rem_len; + + s_prev_exc_handler = SetUnhandledExceptionFilter(exc_handler); + + if (WSAStartup(MAKEWORD(2,2), &wsa_data)) { + fprintf(stderr, "WSAStartup() failed"); + return 0; + } + + srv_addr.sin_family = AF_INET; + srv_addr.sin_addr.s_addr = htonl(INADDR_ANY); + srv_addr.sin_port = htons(9999); + + srv_socket = socket(PF_INET, SOCK_STREAM, 0); + if (srv_socket == -1) { + perror("socket()"); + return 0; + } + + if (bind(srv_socket, (struct sockaddr*) &srv_addr, sizeof(srv_addr)) == -1) { + perror("bind()"); + return 0; + } + + if (listen(srv_socket, 4) == -1) { + perror("listen()"); + return 0; + } + + rem_len = sizeof(rem_addr); + + for(;;) { + s_rem_fd = accept(srv_socket, (struct sockaddr*)&rem_addr, &rem_len); + + if (s_rem_fd < 0) { + if (errno == EINTR) + continue; + + perror("accept()"); + return 0; + } + + break; + } + + return 1; +} + +#endif // DEBUG_SERIAL + + +int getDebugChar() +{ + char buffer[1024]; + int r; + + if (s_rem_fd == -1) + return EOF; + + r = recv(s_rem_fd, buffer, 1, 0); + if (r == -1) { + perror("recv()"); + LOG(TEXT("debugger connection broken")); + s_rem_fd = -1; + return EOF; + } + + if (!r) + return EOF; + + return buffer[0]; +} + +void putDebugChar(int c) +{ + if (s_rem_fd != -1) { + const char buffer[] = {c}; + + if (!send(s_rem_fd, buffer, 1, 0)) { + perror("send()"); + LOG(TEXT("debugger connection broken")); + exit(-1); + } + } +} + + + // start up GDB stub interface + +int initialize_gdb_stub() +{ + if (!init_gdb_connect()) + return 0; + + set_debug_traps(); + + s_initial_breakpoint = 1; + breakpoint(); + + return 1; +} + +#endif // WIN32 diff --git a/reactos/base/shell/explorer/make-docu.sh b/reactos/base/shell/explorer/make-docu.sh new file mode 100755 index 00000000000..7894b44d521 --- /dev/null +++ b/reactos/base/shell/explorer/make-docu.sh @@ -0,0 +1,2 @@ +sed 's/@GEN@/generated on '`date +%d.%m.%Y`/ doxy-footer.html +doxygen Doxyfile diff --git a/reactos/base/shell/explorer/make-full-docu.bat b/reactos/base/shell/explorer/make-full-docu.bat new file mode 100755 index 00000000000..e4a7b41de46 --- /dev/null +++ b/reactos/base/shell/explorer/make-full-docu.bat @@ -0,0 +1,7 @@ +doxygen Doxyfile +cmd /c start /b /low /wait hhc doxy-doc\html\index.hhp +cmd /c move /y doxy-doc\html\index.chm ros-explorer.chm + +doxygen Doxyfile-all +cmd /c start /b /low /wait hhc doxy-doc\html\index.hhp +cmd /c move /y doxy-doc\html\index.chm ros-explorer-full.chm diff --git a/reactos/base/shell/explorer/make_explorer.dsp b/reactos/base/shell/explorer/make_explorer.dsp new file mode 100644 index 00000000000..ad364110d4d --- /dev/null +++ b/reactos/base/shell/explorer/make_explorer.dsp @@ -0,0 +1,205 @@ +# Microsoft Developer Studio Project File - Name="make_explorer" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) External Target" 0x0106 + +CFG=make_explorer - Win32 bjam +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "make_explorer.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "make_explorer.mak" CFG="make_explorer - Win32 bjam" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "make_explorer - Win32 Release" (based on "Win32 (x86) External Target") +!MESSAGE "make_explorer - Win32 Debug" (based on "Win32 (x86) External Target") +!MESSAGE "make_explorer - Win32 Unicode Debug" (based on "Win32 (x86) External Target") +!MESSAGE "make_explorer - Win32 Unicode Release" (based on "Win32 (x86) External Target") +!MESSAGE "make_explorer - Win32 doxy docu" (based on "Win32 (x86) External Target") +!MESSAGE "make_explorer - Win32 bjam" (based on "Win32 (x86) External Target") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" + +!IF "$(CFG)" == "make_explorer - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Cmd_Line "NMAKE /f make_explorer.mak" +# PROP BASE Rebuild_Opt "/a" +# PROP BASE Target_File "make_explorer.exe" +# PROP BASE Bsc_Name "make_explorer.bsc" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Cmd_Line "msdevfilt -gcc -pipe "perl d:\tools\gSTLFilt.pl" make -f Makefile.PCH UNICODE=0" +# PROP Rebuild_Opt "clean all" +# PROP Target_File "explorer.exe" +# PROP Bsc_Name "" +# PROP Target_Dir "" + +!ELSEIF "$(CFG)" == "make_explorer - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Cmd_Line "NMAKE /f make_explorer.mak" +# PROP BASE Rebuild_Opt "/a" +# PROP BASE Target_File "make_explorer.exe" +# PROP BASE Bsc_Name "make_explorer.bsc" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Cmd_Line "msdevfilt -gcc -pipe "perl d:\tools\gSTLFilt.pl" make -f Makefile.PCH UNICODE=0 DEBUG=1" +# PROP Rebuild_Opt "clean all" +# PROP Target_File "explorer.exe" +# PROP Bsc_Name "msdevfilt -gcc -pipe "perl d:\tools\gSTLFilt.pl" make -f Makefile.MinGW UNICODE=0 DEBUG=1" +# PROP Target_Dir "" + +!ELSEIF "$(CFG)" == "make_explorer - Win32 Unicode Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "UDebug" +# PROP BASE Intermediate_Dir "UDebug" +# PROP BASE Cmd_Line "msdevfilt -gcc -pipe "perl d:\tools\gSTLFilt.pl" make -f Makefile.MinGW UNICODE=1 DEBUG=1" +# PROP BASE Rebuild_Opt "clean all" +# PROP BASE Target_File "explorer.exe" +# PROP BASE Bsc_Name "" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "UDebug" +# PROP Intermediate_Dir "UDebug" +# PROP Cmd_Line "msdevfilt -gcc -pipe "perl d:\tools\gSTLFilt.pl" make -f Makefile.MinGW UNICODE=1 DEBUG=1" +# PROP Rebuild_Opt "clean all" +# PROP Target_File "explorer.exe" +# PROP Bsc_Name "" +# PROP Target_Dir "" + +!ELSEIF "$(CFG)" == "make_explorer - Win32 Unicode Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "URelease" +# PROP BASE Intermediate_Dir "URelease" +# PROP BASE Cmd_Line "msdevfilt -gcc -pipe "perl d:\tools\gSTLFilt.pl" make -f Makefile.MinGW UNICODE=1" +# PROP BASE Rebuild_Opt "clean all" +# PROP BASE Target_File "explorer.exe" +# PROP BASE Bsc_Name "" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "URelease" +# PROP Intermediate_Dir "URelease" +# PROP Cmd_Line "msdevfilt -gcc make -f Makefile.PCH UNICODE=1" +# PROP Rebuild_Opt "clean all" +# PROP Target_File "explorer.exe" +# PROP Bsc_Name "" +# PROP Target_Dir "" + +!ELSEIF "$(CFG)" == "make_explorer - Win32 doxy docu" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Cmd_Line "msdevfilt -gcc -pipe "perl d:\tools\gSTLFilt.pl" make -f Makefile.MinGW DEBUG=1" +# PROP BASE Rebuild_Opt "clean all" +# PROP BASE Target_File "explorer.exe" +# PROP BASE Bsc_Name "" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Cmd_Line "msdevfilt -java make docu" +# PROP Rebuild_Opt "full-docu" +# PROP Target_File "explorer.exe" +# PROP Bsc_Name "" +# PROP Target_Dir "" + +!ELSEIF "$(CFG)" == "make_explorer - Win32 bjam" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Cmd_Line "msdevfilt -gcc -pipe "perl d:\tools\gSTLFilt.pl" make -f Makefile.MinGW DEBUG=1" +# PROP BASE Rebuild_Opt "clean all" +# PROP BASE Target_File "explorer.exe" +# PROP BASE Bsc_Name "" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Cmd_Line "msdevfilt -gcc -pipe "perl d:\tools\gSTLFilt.pl" bjam" +# PROP Rebuild_Opt "clean&bjam release" +# PROP Target_File "explorer.exe" +# PROP Bsc_Name "" +# PROP Target_Dir "" + +!ENDIF + +# Begin Target + +# Name "make_explorer - Win32 Release" +# Name "make_explorer - Win32 Debug" +# Name "make_explorer - Win32 Unicode Debug" +# Name "make_explorer - Win32 Unicode Release" +# Name "make_explorer - Win32 doxy docu" +# Name "make_explorer - Win32 bjam" + +!IF "$(CFG)" == "make_explorer - Win32 Release" + +!ELSEIF "$(CFG)" == "make_explorer - Win32 Debug" + +!ELSEIF "$(CFG)" == "make_explorer - Win32 Unicode Debug" + +!ELSEIF "$(CFG)" == "make_explorer - Win32 Unicode Release" + +!ELSEIF "$(CFG)" == "make_explorer - Win32 doxy docu" + +!ELSEIF "$(CFG)" == "make_explorer - Win32 bjam" + +!ENDIF + +# Begin Source File + +SOURCE=.\Jamfile +# End Source File +# Begin Source File + +SOURCE=.\Makefile +# End Source File +# Begin Source File + +SOURCE=.\Makefile.MinGW +# End Source File +# Begin Source File + +SOURCE=.\Makefile.PCH +# End Source File +# Begin Source File + +SOURCE=.\Makefile.Wine +# End Source File +# End Target +# End Project diff --git a/reactos/base/shell/explorer/make_explorer.vcproj b/reactos/base/shell/explorer/make_explorer.vcproj new file mode 100644 index 00000000000..bdb57eb4ae2 --- /dev/null +++ b/reactos/base/shell/explorer/make_explorer.vcproj @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/reactos/base/shell/explorer/make_rosshell.dsp b/reactos/base/shell/explorer/make_rosshell.dsp new file mode 100644 index 00000000000..b6787e30993 --- /dev/null +++ b/reactos/base/shell/explorer/make_rosshell.dsp @@ -0,0 +1,155 @@ +# Microsoft Developer Studio Project File - Name="make_rosshell" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) External Target" 0x0106 + +CFG=make_rosshell - Win32 Release +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "make_rosshell.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "make_rosshell.mak" CFG="make_rosshell - Win32 Release" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "make_rosshell - Win32 Release" (based on "Win32 (x86) External Target") +!MESSAGE "make_rosshell - Win32 Debug" (based on "Win32 (x86) External Target") +!MESSAGE "make_rosshell - Win32 Unicode Debug" (based on "Win32 (x86) External Target") +!MESSAGE "make_rosshell - Win32 Unicode Release" (based on "Win32 (x86) External Target") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" + +!IF "$(CFG)" == "make_rosshell - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Cmd_Line "NMAKE /f make_rosshell.mak" +# PROP BASE Rebuild_Opt "/a" +# PROP BASE Target_File "make_rosshell.exe" +# PROP BASE Bsc_Name "make_rosshell.bsc" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Cmd_Line "msdevfilt -gcc -pipe "perl d:\tools\gSTLFilt.pl" make -f Make-rosshell.MinGW UNICODE=0" +# PROP Rebuild_Opt "clean all" +# PROP Target_File "rosshell.exe" +# PROP Bsc_Name "" +# PROP Target_Dir "" + +!ELSEIF "$(CFG)" == "make_rosshell - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Cmd_Line "NMAKE /f make_rosshell.mak" +# PROP BASE Rebuild_Opt "/a" +# PROP BASE Target_File "make_rosshell.exe" +# PROP BASE Bsc_Name "make_rosshell.bsc" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Cmd_Line "msdevfilt -gcc -pipe "perl d:\tools\gSTLFilt.pl" make -f Make-rosshell.MinGW UNICODE=0 DEBUG=1" +# PROP Rebuild_Opt "clean all" +# PROP Target_File "rosshell.exe" +# PROP Bsc_Name "msdevfilt -gcc -pipe "perl d:\tools\gSTLFilt.pl" make -f Makefile.MinGW UNICODE=0 DEBUG=1" +# PROP Target_Dir "" + +!ELSEIF "$(CFG)" == "make_rosshell - Win32 Unicode Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "UDebug" +# PROP BASE Intermediate_Dir "UDebug" +# PROP BASE Cmd_Line "msdevfilt -gcc -pipe "perl d:\tools\gSTLFilt.pl" make -f Makefile.MinGW UNICODE=1 DEBUG=1" +# PROP BASE Rebuild_Opt "clean all" +# PROP BASE Target_File "rosshell.exe" +# PROP BASE Bsc_Name "" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "UDebug" +# PROP Intermediate_Dir "UDebug" +# PROP Cmd_Line "msdevfilt -gcc -pipe "perl d:\tools\gSTLFilt.pl" make -f Makefile.MinGW UNICODE=1 DEBUG=1" +# PROP Rebuild_Opt "clean all" +# PROP Target_File "rosshell.exe" +# PROP Bsc_Name "" +# PROP Target_Dir "" + +!ELSEIF "$(CFG)" == "make_rosshell - Win32 Unicode Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "URelease" +# PROP BASE Intermediate_Dir "URelease" +# PROP BASE Cmd_Line "msdevfilt -gcc -pipe "perl d:\tools\gSTLFilt.pl" make -f Makefile.MinGW UNICODE=1" +# PROP BASE Rebuild_Opt "clean all" +# PROP BASE Target_File "rosshell.exe" +# PROP BASE Bsc_Name "" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "URelease" +# PROP Intermediate_Dir "URelease" +# PROP Cmd_Line "msdevfilt -gcc make -f Make-rosshell.MinGW UNICODE=1" +# PROP Rebuild_Opt "clean all" +# PROP Target_File "rosshell.exe" +# PROP Bsc_Name "" +# PROP Target_Dir "" + +!ENDIF + +# Begin Target + +# Name "make_rosshell - Win32 Release" +# Name "make_rosshell - Win32 Debug" +# Name "make_rosshell - Win32 Unicode Debug" +# Name "make_rosshell - Win32 Unicode Release" + +!IF "$(CFG)" == "make_rosshell - Win32 Release" + +!ELSEIF "$(CFG)" == "make_rosshell - Win32 Debug" + +!ELSEIF "$(CFG)" == "make_rosshell - Win32 Unicode Debug" + +!ELSEIF "$(CFG)" == "make_rosshell - Win32 Unicode Release" + +!ENDIF + +# Begin Source File + +SOURCE=.\Jamfile +# End Source File +# Begin Source File + +SOURCE=".\Make-rosshell.MinGW" +# End Source File +# Begin Source File + +SOURCE=.\Makefile +# End Source File +# Begin Source File + +SOURCE=.\Makefile.MinGW +# End Source File +# Begin Source File + +SOURCE=.\Makefile.Wine +# End Source File +# End Target +# End Project diff --git a/reactos/base/shell/explorer/notifyhook/notifyhook.c b/reactos/base/shell/explorer/notifyhook/notifyhook.c new file mode 100644 index 00000000000..20267b0ae02 --- /dev/null +++ b/reactos/base/shell/explorer/notifyhook/notifyhook.c @@ -0,0 +1,116 @@ +/* + * Copyright 2004 Martin Fuchs + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + + // + // NotifyHook DLL for ROS Explorer + // + // notifyhook.cpp + // + // Martin Fuchs, 17.03.2004 + // + + +#include "../utility/utility.h" + +#include "notifyhook.h" + + +static HINSTANCE s_hInstance; +static UINT WM_GETMODULEPATH; +static HHOOK s_hNotifyHook; + + +BOOL APIENTRY DllMain(HINSTANCE hInst, DWORD dwReason, LPVOID param) +{ + switch(dwReason) { + case DLL_PROCESS_ATTACH: + s_hInstance = hInst; + DisableThreadLibraryCalls(hInst); + WM_GETMODULEPATH = RegisterWindowMessageA("WM_GETMODULEPATH"); + break; + } + + return TRUE; +} + + +struct COPYDATA_STRUCT { + HWND _hwnd; + int _len; + char _path[MAX_PATH]; +}; + +LRESULT CALLBACK NotifyHookProc(int code, WPARAM wparam, LPARAM lparam) +{ + MSG* pmsg = (MSG*)lparam; + + if (pmsg->message == WM_GETMODULEPATH) { + struct COPYDATA_STRUCT cds; + COPYDATASTRUCT data; + + cds._hwnd = pmsg->hwnd; + cds._len = GetWindowModuleFileNameA(pmsg->hwnd, cds._path, COUNTOF(cds._path)); + + data.dwData = WM_GETMODULEPATH; + data.cbData = sizeof(cds); + data.lpData = &cds; + + SendMessage((HWND)pmsg->wParam, WM_COPYDATA, (WPARAM)pmsg->hwnd, (LPARAM)&data); + + return 0; + } + + return CallNextHookEx(s_hNotifyHook, code, wparam, lparam); +} + + +UINT InstallNotifyHook() +{ + s_hNotifyHook = SetWindowsHookEx(WH_GETMESSAGE, NotifyHookProc, s_hInstance, 0); + + return WM_GETMODULEPATH; +} + +void DeinstallNotifyHook() +{ + UnhookWindowsHookEx(s_hNotifyHook); + s_hNotifyHook = 0; +} + + +void GetWindowModulePath(HWND hwnd) +{ + SendMessage(hwnd, WM_GETMODULEPATH, 0, 0); +} + + // retrieve module path by receiving WM_COPYDATA message +DECL_NOTIFYHOOK int GetWindowModulePathCopyData(LPARAM lparam, HWND* phwnd, LPSTR buffer, int size) +{ + PCOPYDATASTRUCT data = (PCOPYDATASTRUCT) lparam; + + if (data->dwData == WM_GETMODULEPATH) { + struct COPYDATA_STRUCT* cds = (struct COPYDATA_STRUCT*) data->lpData; + + *phwnd = cds->_hwnd; + lstrcpyn(buffer, cds->_path, size); + + return cds->_len; + } else + return 0; +} diff --git a/reactos/base/shell/explorer/notifyhook/notifyhook.def b/reactos/base/shell/explorer/notifyhook/notifyhook.def new file mode 100644 index 00000000000..ffbd2254c38 --- /dev/null +++ b/reactos/base/shell/explorer/notifyhook/notifyhook.def @@ -0,0 +1,5 @@ +EXPORTS +DeinstallNotifyHook +GetWindowModulePath +GetWindowModulePathCopyData +InstallNotifyHook diff --git a/reactos/base/shell/explorer/notifyhook/notifyhook.dsp b/reactos/base/shell/explorer/notifyhook/notifyhook.dsp new file mode 100644 index 00000000000..dac7f27ea31 --- /dev/null +++ b/reactos/base/shell/explorer/notifyhook/notifyhook.dsp @@ -0,0 +1,132 @@ +# Microsoft Developer Studio Project File - Name="notifyhook" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=notifyhook - Win32 +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "notifyhook.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "notifyhook.mak" CFG="notifyhook - Win32" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "notifyhook - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "notifyhook - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "notifyhook - Win32" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "notifyhook - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "shellhook___Win32_Release" +# PROP BASE Intermediate_Dir "shellhook___Win32_Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "..\Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MT /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_NOTIFYHOOK_IMPL" /FD /c +# SUBTRACT CPP /YX +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x407 /d "NDEBUG" +# ADD RSC /l 0x407 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386 +# ADD LINK32 user32.lib /nologo /subsystem:windows /dll /machine:I386 + +!ELSEIF "$(CFG)" == "notifyhook - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Win32" +# PROP BASE Intermediate_Dir "Win32" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "..\Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /GZ /c +# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "_NOTIFYHOOK_IMPL" /FR /FD /GZ /c +# SUBTRACT CPP /YX +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x407 /d "_DEBUG" +# ADD RSC /l 0x407 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept +# ADD LINK32 user32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept + +!ELSEIF "$(CFG)" == "notifyhook - Win32" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Win32" +# PROP BASE Intermediate_Dir "Win32" +# PROP BASE Ignore_Export_Lib 0 +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Win32" +# PROP Intermediate_Dir "Win32" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "_NOTIFYHOOK_IMPL" /FR /FD /GZ /c +# SUBTRACT BASE CPP /YX +# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "_NOTIFYHOOK_IMPL" /FR /FD /GZ /c +# SUBTRACT CPP /YX +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x407 /d "_DEBUG" +# ADD RSC /l 0x407 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 user32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept +# ADD LINK32 user32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept + +!ENDIF + +# Begin Target + +# Name "notifyhook - Win32 Release" +# Name "notifyhook - Win32 Debug" +# Name "notifyhook - Win32" +# Begin Source File + +SOURCE=.\notifyhook.c +# End Source File +# Begin Source File + +SOURCE=.\notifyhook.h +# End Source File +# End Target +# End Project diff --git a/reactos/base/shell/explorer/notifyhook/notifyhook.h b/reactos/base/shell/explorer/notifyhook/notifyhook.h new file mode 100644 index 00000000000..11ebd8c284f --- /dev/null +++ b/reactos/base/shell/explorer/notifyhook/notifyhook.h @@ -0,0 +1,50 @@ +/* + * Copyright 2004 Martin Fuchs + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + + // + // NotifyHook DLL for ROS Explorer + // + // notifyhook.h + // + // Martin Fuchs, 17.03.2004 + // + + +#ifdef _NOTIFYHOOK_IMPL +#define DECL_NOTIFYHOOK __declspec(dllexport) +#else +#define DECL_NOTIFYHOOK __declspec(dllimport) +#ifdef _MSC_VER +#pragma comment(lib, "notifyhook") +#endif +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +DECL_NOTIFYHOOK UINT InstallNotifyHook(); +DECL_NOTIFYHOOK void DeinstallNotifyHook(); + +DECL_NOTIFYHOOK void GetWindowModulePath(HWND hwnd); +DECL_NOTIFYHOOK int GetWindowModulePathCopyData(LPARAM lparam, HWND* phwnd, LPSTR buffer, int size); + +#ifdef __cplusplus +}; +#endif diff --git a/reactos/base/shell/explorer/notifyhook/notifyhook.rc b/reactos/base/shell/explorer/notifyhook/notifyhook.rc new file mode 100644 index 00000000000..096ed22d9fb --- /dev/null +++ b/reactos/base/shell/explorer/notifyhook/notifyhook.rc @@ -0,0 +1,9 @@ +/* $Id$ */ + +#define REACTOS_VERSION_DLL +#define REACTOS_STR_FILE_DESCRIPTION "NotifyHook DLL for ROS Explorer\0" +#define REACTOS_STR_INTERNAL_NAME "notifyhook\0" +#define REACTOS_STR_ORIGINAL_FILENAME "notifyhook.dll\0" +#include + +/* EOF */ diff --git a/reactos/base/shell/explorer/notifyhook/notifyhook.vcproj b/reactos/base/shell/explorer/notifyhook/notifyhook.vcproj new file mode 100644 index 00000000000..2682748dfa0 --- /dev/null +++ b/reactos/base/shell/explorer/notifyhook/notifyhook.vcproj @@ -0,0 +1,237 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/reactos/base/shell/explorer/notifyhook/notifyhook.xml b/reactos/base/shell/explorer/notifyhook/notifyhook.xml new file mode 100644 index 00000000000..db8f81d3ded --- /dev/null +++ b/reactos/base/shell/explorer/notifyhook/notifyhook.xml @@ -0,0 +1,10 @@ + + + . + + 0x0600 + + kernel32 + notifyhook.c + notifyhook.rc + diff --git a/reactos/base/shell/explorer/precomp.cpp b/reactos/base/shell/explorer/precomp.cpp new file mode 100644 index 00000000000..f8e7255fe0e --- /dev/null +++ b/reactos/base/shell/explorer/precomp.cpp @@ -0,0 +1,28 @@ +/* + * Copyright 2004 Martin Fuchs + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + + // + // Explorer clone - precompiled header support + // + // precomp.h + // + // Martin Fuchs, 17.05.2004 + // + +#include "precomp.h" diff --git a/reactos/base/shell/explorer/precomp.h b/reactos/base/shell/explorer/precomp.h new file mode 100644 index 00000000000..8c68b84966f --- /dev/null +++ b/reactos/base/shell/explorer/precomp.h @@ -0,0 +1,37 @@ +/* + * Copyright 2004 Martin Fuchs + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + + // + // Explorer clone - precompiled header support + // + // precomp.h + // + // Martin Fuchs, 17.05.2004 + // + +#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1 +#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT 1 + +#include "utility/utility.h" + +#include "explorer.h" +#include "desktop/desktop.h" + +#include "globals.h" +#include "externals.h" diff --git a/reactos/base/shell/explorer/project-root.jam b/reactos/base/shell/explorer/project-root.jam new file mode 100644 index 00000000000..e69de29bb2d diff --git a/reactos/base/shell/explorer/rc-mingw.jam b/reactos/base/shell/explorer/rc-mingw.jam new file mode 100644 index 00000000000..62f8f96bc58 --- /dev/null +++ b/reactos/base/shell/explorer/rc-mingw.jam @@ -0,0 +1,53 @@ +import type ; +import generators ; +import feature ; + +type.register RC : rc ; + +rule init ( ) +{ +} + +rule resource-compile ( target : sources * : properties * ) +{ +# local OS = [ feature.get-values : $(properties) ] ; + resource-compile-mingw $(target) : $(sources[1]) ; +# switch $(OS) +# { +# case "NT" : +# resource-compile-nt $(target) : $(sources[1]) ; +# case "CYGWIN" : +# resource-compile-cygwin $(target) : $(sources[1]) ; +# case "FREEBSD" : +# create-empty-object $(target) : $(sources[1]) ; +# case "*" : +# errors.error "Cannot process RC files for OS=$(OS)" ; +# } +} + + +actions quietly resource-compile-nt +{ + rc /i "$(>:D)" /fo "$(<)" "$(>)" +} + +actions quietly resource-compile-mingw +{ + windres -D__WINDRES__ -o "$(<)" -i "$(>)" +} + +actions quietly resource-compile-cygwin +{ + windres -D__WINDRES__ --include-dir "$(>:D)" -o "$(<)" -i "$(>)" +} + +actions quietly create-empty-object +{ + as /dev/null -o "$(<)" +} + +# Since it's a common practice to write +# exe hello : hello.cpp hello.rc +# we change the name of object created from RC file, to +# avoid conflict with hello.cpp. +generators.register-standard rc-mingw.resource-compile : RC : OBJ(%_res) ; diff --git a/reactos/base/shell/explorer/res/action.ico b/reactos/base/shell/explorer/res/action.ico new file mode 100644 index 00000000000..233a1379187 Binary files /dev/null and b/reactos/base/shell/explorer/res/action.ico differ diff --git a/reactos/base/shell/explorer/res/administration.ico b/reactos/base/shell/explorer/res/administration.ico new file mode 100644 index 00000000000..9a92baf2ea2 Binary files /dev/null and b/reactos/base/shell/explorer/res/administration.ico differ diff --git a/reactos/base/shell/explorer/res/appicon.ico b/reactos/base/shell/explorer/res/appicon.ico new file mode 100644 index 00000000000..233a1379187 Binary files /dev/null and b/reactos/base/shell/explorer/res/appicon.ico differ diff --git a/reactos/base/shell/explorer/res/apps.ico b/reactos/base/shell/explorer/res/apps.ico new file mode 100644 index 00000000000..4c9cbe135fc Binary files /dev/null and b/reactos/base/shell/explorer/res/apps.ico differ diff --git a/reactos/base/shell/explorer/res/arrow.ico b/reactos/base/shell/explorer/res/arrow.ico new file mode 100644 index 00000000000..f170de0d77e Binary files /dev/null and b/reactos/base/shell/explorer/res/arrow.ico differ diff --git a/reactos/base/shell/explorer/res/arrow_dwn.ico b/reactos/base/shell/explorer/res/arrow_dwn.ico new file mode 100644 index 00000000000..0932f7f3a59 Binary files /dev/null and b/reactos/base/shell/explorer/res/arrow_dwn.ico differ diff --git a/reactos/base/shell/explorer/res/arrow_up.ico b/reactos/base/shell/explorer/res/arrow_up.ico new file mode 100644 index 00000000000..9e2ee4cd376 Binary files /dev/null and b/reactos/base/shell/explorer/res/arrow_up.ico differ diff --git a/reactos/base/shell/explorer/res/arrowsel.ico b/reactos/base/shell/explorer/res/arrowsel.ico new file mode 100644 index 00000000000..4235911bb6b Binary files /dev/null and b/reactos/base/shell/explorer/res/arrowsel.ico differ diff --git a/reactos/base/shell/explorer/res/computer.ico b/reactos/base/shell/explorer/res/computer.ico new file mode 100644 index 00000000000..d62870d0837 Binary files /dev/null and b/reactos/base/shell/explorer/res/computer.ico differ diff --git a/reactos/base/shell/explorer/res/config.ico b/reactos/base/shell/explorer/res/config.ico new file mode 100644 index 00000000000..0a131f10923 Binary files /dev/null and b/reactos/base/shell/explorer/res/config.ico differ diff --git a/reactos/base/shell/explorer/res/control-panel.ico b/reactos/base/shell/explorer/res/control-panel.ico new file mode 100644 index 00000000000..e95d3607365 Binary files /dev/null and b/reactos/base/shell/explorer/res/control-panel.ico differ diff --git a/reactos/base/shell/explorer/res/desktop-settings.ico b/reactos/base/shell/explorer/res/desktop-settings.ico new file mode 100644 index 00000000000..2723c47ff0d Binary files /dev/null and b/reactos/base/shell/explorer/res/desktop-settings.ico differ diff --git a/reactos/base/shell/explorer/res/documents.ico b/reactos/base/shell/explorer/res/documents.ico new file mode 100644 index 00000000000..2902e4b7cdc Binary files /dev/null and b/reactos/base/shell/explorer/res/documents.ico differ diff --git a/reactos/base/shell/explorer/res/dot.ico b/reactos/base/shell/explorer/res/dot.ico new file mode 100644 index 00000000000..9ddbb8a41c7 Binary files /dev/null and b/reactos/base/shell/explorer/res/dot.ico differ diff --git a/reactos/base/shell/explorer/res/dot_red.ico b/reactos/base/shell/explorer/res/dot_red.ico new file mode 100644 index 00000000000..4d176eef1d5 Binary files /dev/null and b/reactos/base/shell/explorer/res/dot_red.ico differ diff --git a/reactos/base/shell/explorer/res/dot_trans.ico b/reactos/base/shell/explorer/res/dot_trans.ico new file mode 100644 index 00000000000..d5ede5a3800 Binary files /dev/null and b/reactos/base/shell/explorer/res/dot_trans.ico differ diff --git a/reactos/base/shell/explorer/res/drivebar.bmp b/reactos/base/shell/explorer/res/drivebar.bmp new file mode 100644 index 00000000000..8fb09722dc0 Binary files /dev/null and b/reactos/base/shell/explorer/res/drivebar.bmp differ diff --git a/reactos/base/shell/explorer/res/explorer.ico b/reactos/base/shell/explorer/res/explorer.ico new file mode 100644 index 00000000000..09e4a52d122 Binary files /dev/null and b/reactos/base/shell/explorer/res/explorer.ico differ diff --git a/reactos/base/shell/explorer/res/favorites.ico b/reactos/base/shell/explorer/res/favorites.ico new file mode 100644 index 00000000000..54ec557b5f0 Binary files /dev/null and b/reactos/base/shell/explorer/res/favorites.ico differ diff --git a/reactos/base/shell/explorer/res/floating.ico b/reactos/base/shell/explorer/res/floating.ico new file mode 100644 index 00000000000..bbb19608d5a Binary files /dev/null and b/reactos/base/shell/explorer/res/floating.ico differ diff --git a/reactos/base/shell/explorer/res/folder.ico b/reactos/base/shell/explorer/res/folder.ico new file mode 100644 index 00000000000..11ac83d299a Binary files /dev/null and b/reactos/base/shell/explorer/res/folder.ico differ diff --git a/reactos/base/shell/explorer/res/icoali10.bmp b/reactos/base/shell/explorer/res/icoali10.bmp new file mode 100644 index 00000000000..eb29b24c6b6 Binary files /dev/null and b/reactos/base/shell/explorer/res/icoali10.bmp differ diff --git a/reactos/base/shell/explorer/res/icoalig0.bmp b/reactos/base/shell/explorer/res/icoalig0.bmp new file mode 100644 index 00000000000..0fb9e324877 Binary files /dev/null and b/reactos/base/shell/explorer/res/icoalig0.bmp differ diff --git a/reactos/base/shell/explorer/res/icoalig1.bmp b/reactos/base/shell/explorer/res/icoalig1.bmp new file mode 100644 index 00000000000..3ae36488cdf Binary files /dev/null and b/reactos/base/shell/explorer/res/icoalig1.bmp differ diff --git a/reactos/base/shell/explorer/res/icoalig2.bmp b/reactos/base/shell/explorer/res/icoalig2.bmp new file mode 100644 index 00000000000..f5064423e5f Binary files /dev/null and b/reactos/base/shell/explorer/res/icoalig2.bmp differ diff --git a/reactos/base/shell/explorer/res/icoalig3.bmp b/reactos/base/shell/explorer/res/icoalig3.bmp new file mode 100644 index 00000000000..34fe98fa8f0 Binary files /dev/null and b/reactos/base/shell/explorer/res/icoalig3.bmp differ diff --git a/reactos/base/shell/explorer/res/icoalig4.bmp b/reactos/base/shell/explorer/res/icoalig4.bmp new file mode 100644 index 00000000000..2ceaf8bfe9d Binary files /dev/null and b/reactos/base/shell/explorer/res/icoalig4.bmp differ diff --git a/reactos/base/shell/explorer/res/icoalig5.bmp b/reactos/base/shell/explorer/res/icoalig5.bmp new file mode 100644 index 00000000000..5d38cd319e8 Binary files /dev/null and b/reactos/base/shell/explorer/res/icoalig5.bmp differ diff --git a/reactos/base/shell/explorer/res/icoalig6.bmp b/reactos/base/shell/explorer/res/icoalig6.bmp new file mode 100644 index 00000000000..654da49cc00 Binary files /dev/null and b/reactos/base/shell/explorer/res/icoalig6.bmp differ diff --git a/reactos/base/shell/explorer/res/icoalig7.bmp b/reactos/base/shell/explorer/res/icoalig7.bmp new file mode 100644 index 00000000000..8e0942009b7 Binary files /dev/null and b/reactos/base/shell/explorer/res/icoalig7.bmp differ diff --git a/reactos/base/shell/explorer/res/icoalig8.bmp b/reactos/base/shell/explorer/res/icoalig8.bmp new file mode 100644 index 00000000000..03c49b0e273 Binary files /dev/null and b/reactos/base/shell/explorer/res/icoalig8.bmp differ diff --git a/reactos/base/shell/explorer/res/icoalig9.bmp b/reactos/base/shell/explorer/res/icoalig9.bmp new file mode 100644 index 00000000000..0e8fb8acfce Binary files /dev/null and b/reactos/base/shell/explorer/res/icoalig9.bmp differ diff --git a/reactos/base/shell/explorer/res/images.bmp b/reactos/base/shell/explorer/res/images.bmp new file mode 100644 index 00000000000..ff9f97a0a7a Binary files /dev/null and b/reactos/base/shell/explorer/res/images.bmp differ diff --git a/reactos/base/shell/explorer/res/info.ico b/reactos/base/shell/explorer/res/info.ico new file mode 100644 index 00000000000..1a3f64276b1 Binary files /dev/null and b/reactos/base/shell/explorer/res/info.ico differ diff --git a/reactos/base/shell/explorer/res/logoff.ico b/reactos/base/shell/explorer/res/logoff.ico new file mode 100644 index 00000000000..dbaefab3b5c Binary files /dev/null and b/reactos/base/shell/explorer/res/logoff.ico differ diff --git a/reactos/base/shell/explorer/res/logov.bmp b/reactos/base/shell/explorer/res/logov.bmp new file mode 100644 index 00000000000..0d251b664b2 Binary files /dev/null and b/reactos/base/shell/explorer/res/logov.bmp differ diff --git a/reactos/base/shell/explorer/res/logov16.bmp b/reactos/base/shell/explorer/res/logov16.bmp new file mode 100644 index 00000000000..1fb37cd8026 Binary files /dev/null and b/reactos/base/shell/explorer/res/logov16.bmp differ diff --git a/reactos/base/shell/explorer/res/logov256.bmp b/reactos/base/shell/explorer/res/logov256.bmp new file mode 100644 index 00000000000..87ad7f214dc Binary files /dev/null and b/reactos/base/shell/explorer/res/logov256.bmp differ diff --git a/reactos/base/shell/explorer/res/mdi.bmp b/reactos/base/shell/explorer/res/mdi.bmp new file mode 100644 index 00000000000..92e550ada9e Binary files /dev/null and b/reactos/base/shell/explorer/res/mdi.bmp differ diff --git a/reactos/base/shell/explorer/res/minimize.ico b/reactos/base/shell/explorer/res/minimize.ico new file mode 100644 index 00000000000..949cf0ce613 Binary files /dev/null and b/reactos/base/shell/explorer/res/minimize.ico differ diff --git a/reactos/base/shell/explorer/res/network-conns.ico b/reactos/base/shell/explorer/res/network-conns.ico new file mode 100644 index 00000000000..300f234b206 Binary files /dev/null and b/reactos/base/shell/explorer/res/network-conns.ico differ diff --git a/reactos/base/shell/explorer/res/network.ico b/reactos/base/shell/explorer/res/network.ico new file mode 100644 index 00000000000..3965e61f86f Binary files /dev/null and b/reactos/base/shell/explorer/res/network.ico differ diff --git a/reactos/base/shell/explorer/res/notify_l.ico b/reactos/base/shell/explorer/res/notify_l.ico new file mode 100644 index 00000000000..b50d1e73b43 Binary files /dev/null and b/reactos/base/shell/explorer/res/notify_l.ico differ diff --git a/reactos/base/shell/explorer/res/notify_r.ico b/reactos/base/shell/explorer/res/notify_r.ico new file mode 100644 index 00000000000..e4900ac69b6 Binary files /dev/null and b/reactos/base/shell/explorer/res/notify_r.ico differ diff --git a/reactos/base/shell/explorer/res/printer.ico b/reactos/base/shell/explorer/res/printer.ico new file mode 100644 index 00000000000..e30b700a799 Binary files /dev/null and b/reactos/base/shell/explorer/res/printer.ico differ diff --git a/reactos/base/shell/explorer/res/reactos.ico b/reactos/base/shell/explorer/res/reactos.ico new file mode 100644 index 00000000000..16cebc5698d Binary files /dev/null and b/reactos/base/shell/explorer/res/reactos.ico differ diff --git a/reactos/base/shell/explorer/res/recent-documents.ico b/reactos/base/shell/explorer/res/recent-documents.ico new file mode 100644 index 00000000000..26d1b253fc4 Binary files /dev/null and b/reactos/base/shell/explorer/res/recent-documents.ico differ diff --git a/reactos/base/shell/explorer/res/ros-big.ico b/reactos/base/shell/explorer/res/ros-big.ico new file mode 100644 index 00000000000..4c9642ee731 Binary files /dev/null and b/reactos/base/shell/explorer/res/ros-big.ico differ diff --git a/reactos/base/shell/explorer/res/sdi.bmp b/reactos/base/shell/explorer/res/sdi.bmp new file mode 100644 index 00000000000..2de2710ba42 Binary files /dev/null and b/reactos/base/shell/explorer/res/sdi.bmp differ diff --git a/reactos/base/shell/explorer/res/search-doc.ico b/reactos/base/shell/explorer/res/search-doc.ico new file mode 100644 index 00000000000..7ae57910362 Binary files /dev/null and b/reactos/base/shell/explorer/res/search-doc.ico differ diff --git a/reactos/base/shell/explorer/res/search.ico b/reactos/base/shell/explorer/res/search.ico new file mode 100644 index 00000000000..36ff3f5a609 Binary files /dev/null and b/reactos/base/shell/explorer/res/search.ico differ diff --git a/reactos/base/shell/explorer/res/shutdown.ico b/reactos/base/shell/explorer/res/shutdown.ico new file mode 100644 index 00000000000..b6831c1a01a Binary files /dev/null and b/reactos/base/shell/explorer/res/shutdown.ico differ diff --git a/reactos/base/shell/explorer/res/speaker.ico b/reactos/base/shell/explorer/res/speaker.ico new file mode 100644 index 00000000000..d7f7cc496ee Binary files /dev/null and b/reactos/base/shell/explorer/res/speaker.ico differ diff --git a/reactos/base/shell/explorer/res/startmenu.ico b/reactos/base/shell/explorer/res/startmenu.ico new file mode 100644 index 00000000000..52411bf87e9 Binary files /dev/null and b/reactos/base/shell/explorer/res/startmenu.ico differ diff --git a/reactos/base/shell/explorer/res/toolbar.bmp b/reactos/base/shell/explorer/res/toolbar.bmp new file mode 100644 index 00000000000..c3001a769c8 Binary files /dev/null and b/reactos/base/shell/explorer/res/toolbar.bmp differ diff --git a/reactos/base/shell/explorer/res/winefile.ico b/reactos/base/shell/explorer/res/winefile.ico new file mode 100644 index 00000000000..51cb8b248ff Binary files /dev/null and b/reactos/base/shell/explorer/res/winefile.ico differ diff --git a/reactos/base/shell/explorer/resource.h b/reactos/base/shell/explorer/resource.h new file mode 100644 index 00000000000..60872988f9f --- /dev/null +++ b/reactos/base/shell/explorer/resource.h @@ -0,0 +1,233 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Developer Studio generated include file. +// Used by explorer_intres.rc +// +#define IDS_TITLE 1 +#define MANIFEST_RESOURCE_ID 1 +#define IDS_START 2 +#define IDS_LOGOFF 3 +#define IDS_SHUTDOWN 4 +#define IDS_LAUNCH 5 +#define IDS_START_HELP 6 +#define IDS_SEARCH_FILES 7 +#define IDS_DOCUMENTS 8 +#define IDS_FAVORITES 9 +#define IDS_PROGRAMS 10 +#define IDS_SETTINGS 11 +#define IDS_EXPLORE 12 +#define IDS_EMPTY 13 +#define IDS_RECENT 14 +#define IDS_ADMIN 15 +#define IDS_NETWORK 16 +#define IDS_CONNECTIONS 17 +#define IDS_DRIVES 18 +#define IDS_SEARCH_COMPUTER 19 +#define IDS_SETTINGS_MENU 20 +#define IDS_CONTROL_PANEL 21 +#define IDS_PRINTERS 22 +#define IDS_BROWSE 23 +#define IDS_SEARCH_PRG 24 +#define IDS_ALL_USERS 25 +#define IDS_SEARCH 26 +#define IDS_ABOUT_EXPLORER 27 +#define IDS_LAUNCH_MANY_PROGRAMS 28 +#define IDS_DESKTOPBAR_SETTINGS 29 +#define IDS_DESKTOP 30 +#define IDS_TASKBAR 31 +#define IDS_STARTMENU 32 +#define IDS_MINIMIZE_ALL 33 +#define IDS_DESKTOP_NUM 34 +#define IDS_VOLUME 35 +#define IDS_ITEMS_CUR 36 +#define IDS_ITEMS_CONFIGURED 37 +#define IDS_ITEMS_VISIBLE 38 +#define IDS_ITEMS_HIDDEN 39 +#define IDS_NOTIFY_SHOW 40 +#define IDS_NOTIFY_HIDE 41 +#define IDS_NOTIFY_AUTOHIDE 42 +#define IDS_SHOW_HIDDEN_ICONS 43 +#define IDS_HIDE_ICONS 44 +#define IDS_TERMINATE 45 +#define IDI_REACTOS 100 +#define IDI_EXPLORER 101 +#define IDI_STARTMENU 102 +#define IDB_TOOLBAR 103 +#define IDA_EXPLORER 104 +#define ID_ACTIVATE 105 +#define IDD_SEARCH_PROGRAM 105 +#define IDB_DRIVEBAR 106 +#define IDD_DESKBAR_DESKTOP 106 +#define IDB_IMAGES 107 +#define IDD_EXECUTE 108 +#define IDR_MAINFRAME 109 +#define IDM_MDIFRAME 110 +#define ID_EXECUTE 111 +#define IDM_SDIFRAME 113 +#define IDI_LOGOFF 124 +#define IDI_FOLDERARROW 125 +#define IDI_ARROW 125 +#define IDI_ARROW_SELECTED 126 +#define IDI_SHUTDOWN 127 +#define IDB_LOGOV 129 +#define IDB_LOGOV256 130 +#define IDA_SEARCH_PROGRAM 133 +#define IDI_APPICON 134 +#define IDA_TRAYNOTIFY 134 +#define IDI_FLOATING 135 +#define IDD_ABOUT_EXPLORER 135 +#define IDI_REACTOS_BIG 137 +#define IDI_DOCUMENTS 138 +#define IDI_CONFIG 139 +#define IDI_FAVORITES 140 +#define IDI_INFO 141 +#define IDI_APPS 142 +#define IDI_SEARCH 143 +#define IDI_ACTION 144 +#define IDI_FOLDER 145 +#define IDI_SEARCH_DOC 146 +#define IDI_PRINTER 147 +#define IDI_NETWORK 148 +#define IDI_COMPUTER 149 +#define IDM_DESKTOPBAR 150 +#define IDM_VOLUME 151 +#define IDM_NOTIFYAREA 152 +#define IDD_DESKBAR_TASKBAR 153 +#define IDB_ICON_ALIGN_0 153 +#define IDD_DESKBAR_STARTMENU 154 +#define IDB_ICON_ALIGN_1 154 +#define IDB_ICON_ALIGN_2 155 +#define IDD_NOTIFYAREA 155 +#define IDB_ICON_ALIGN_3 156 +#define IDD_MDI_SDI 156 +#define IDB_ICON_ALIGN_4 157 +#define IDB_ICON_ALIGN_5 158 +#define IDB_ICON_ALIGN_6 159 +#define IDB_ICON_ALIGN_7 160 +#define IDB_ICON_ALIGN_8 161 +#define IDB_ICON_ALIGN_9 162 +#define IDI_SPEAKER 162 +#define IDB_ICON_ALIGN_10 163 +#define IDI_DOT 163 +#define IDB_LOGOV16 164 +#define IDI_DOT_TRANS 164 +#define IDI_DOT_RED 165 +#define IDI_ARROW_UP 166 +#define IDI_ARROW_DOWN 167 +#define IDI_NOTIFY_L 168 +#define IDI_NOTIFY_R 169 +#define IDB_MDI 170 +#define IDB_SDI 171 +#define IDI_MINIMIZE 172 +#define IDI_CONTROLPAN 173 +#define IDI_DESKSETTING 174 +#define IDI_NETCONNS 175 +#define IDI_ADMIN 176 +#define IDI_RECENT 178 +#define ID_VIEW_NAME 401 +#define ID_VIEW_ALL_ATTRIBUTES 402 +#define ID_VIEW_SELECTED_ATTRIBUTES 403 +#define ID_VIEW_STATUSBAR 503 +#define ID_VIEW_DRIVE_BAR 507 +#define ID_VIEW_TOOL_BAR 508 +#define ID_VIEW_EXTRA_BAR 509 +#define ID_VIEW_SIDE_BAR 510 +#define IDC_ROS_EXPLORER 1000 +#define IDC_ICON_ALIGN_0 1002 +#define IDC_ICON_ALIGN_1 1003 +#define IDC_NOTIFY_ICONS 1003 +#define IDC_ICON_ALIGN_2 1004 +#define IDC_ICON_ALIGN_3 1005 +#define IDC_ICON_ALIGN_4 1006 +#define IDC_NOTIFY_TOOLTIP 1006 +#define IDC_ICON_ALIGN_5 1007 +#define IDC_NOTIFY_TITLE 1007 +#define IDC_ICON_ALIGN_6 1008 +#define IDC_NOTIFY_MODULE 1008 +#define IDC_ICON_ALIGN_7 1009 +#define IDC_LABEL1 1009 +#define IDC_ICON_ALIGN_8 1010 +#define IDC_LABEL2 1010 +#define IDC_ICON_ALIGN_9 1011 +#define IDC_LABEL3 1011 +#define IDC_ICON_ALIGN_10 1012 +#define IDC_WWW 1012 +#define IDC_LABEL6 1012 +#define IDC_ICON_ALIGN_11 1013 +#define IDC_LAST_CHANGE 1013 +#define IDC_FILTER 1017 +#define IDC_PROGRAMS_FOUND 1018 +#define IDC_PICTURE 1019 +#define IDC_NOTIFY_SHOW 1020 +#define IDC_NOTIFY_HIDE 1021 +#define IDC_NOTIFY_AUTOHIDE 1022 +#define IDC_LABEL4 1023 +#define ID_HIDE_INACTIVE_ICONS 1025 +#define ID_SHOW_CLOCK 1026 +#define ID_DESKTOP_VERSION 1027 +#define IDC_BUTTON1 1028 +#define IDC_CHECK_ENTRIES 1028 +#define IDC_VERSION_TXT 1029 +#define IDC_WIN_VERSION 1030 +#define IDC_MDI 1030 +#define IDC_SDI 1031 +#define IDC_SEPARATE_SUBFOLDERS 1034 +#define ID_REFRESH 1704 +#define IDS_VERSION_STR 5000 +#define IDS_EXPLORER_VERSION_STR 5001 +#define IDC_FILETREE 10001 +#define ID_EXPLORER_FAQ 10002 +#define ID_WEB_WINDOW 10003 +#define ID_WINDOW_AUTOSORT 0x8003 +#define ID_VIEW_FULLSCREEN 0x8004 +#define ID_PREFERED_SIZES 0x8005 +#define ID_DRIVE_DESKTOP 0x9000 +#define ID_DRIVE_SHELL_NS 0x9001 +#define ID_DRIVE_UNIX_FS 0x9002 +#define ID_DRIVE_NTOBJ_NS 0x9003 +#define ID_DRIVE_REGISTRY 0x9004 +#define ID_DRIVE_FAT 0x9005 +#define ID_DRIVE_FIRST 0x9006 +#define ID_ABOUT_WINDOWS 40002 +#define ID_ABOUT_EXPLORER 40003 +#define ID_DESKTOPBAR_SETTINGS 40004 +#define ID_GO_BACK 40005 +#define ID_GO_FORWARD 40006 +#define ID_GO_HOME 40007 +#define ID_GO_SEARCH 40008 +#define ID_GO_UP 40009 +#define ID_STOP 40010 +#define ID_MINIMIZE_ALL 40011 +#define ID_EXPLORE 40012 +#define ID_TASKMGR 40013 +#define ID_TRAY_VOLUME 40014 +#define ID_VOLUME_PROPERTIES 40015 +#define ID_SHOW_HIDDEN_ICONS 40016 +#define ID_CONFIG_NOTIFYAREA 40017 +#define ID_CONFIG_TIME 40018 +#define ID_VIEW_MDI 40019 +#define ID_VIEW_SDI 40020 +#define ID_TOOLS_OPTIONS 40021 +#define ID_SHOW_ICON_BUTTON 40023 +#define ID_SWITCH_DESKTOP_1 50000 +#define ID_WINDOW_NEW 0xE130 +#define ID_WINDOW_ARRANGE 0xE131 +#define ID_WINDOW_CASCADE 0xE132 +#define ID_WINDOW_TILE_HORZ 0xE133 +#define ID_WINDOW_TILE_VERT 0xE134 +#define ID_WINDOW_SPLIT 0xE135 +#define ID_EDIT_PROPERTIES 57656 +#define ID_FILE_EXIT 0xE141 +#define ID_HELP_USING 0xE144 +#define ID_HELP 0xE146 +#define IDC_STATIC -1 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 169 +#define _APS_NEXT_COMMAND_VALUE 40024 +#define _APS_NEXT_CONTROL_VALUE 1035 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/reactos/base/shell/explorer/rosshell.dsp b/reactos/base/shell/explorer/rosshell.dsp new file mode 100644 index 00000000000..9130737980b --- /dev/null +++ b/reactos/base/shell/explorer/rosshell.dsp @@ -0,0 +1,608 @@ +# Microsoft Developer Studio Project File - Name="rosshell" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Console Application" 0x0103 + +CFG=rosshell - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "rosshell.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "rosshell.mak" CFG="rosshell - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "rosshell - Win32 Release" (based on "Win32 (x86) Console Application") +!MESSAGE "rosshell - Win32 Debug" (based on "Win32 (x86) Console Application") +!MESSAGE "rosshell - Win32 Debug Release" (based on "Win32 (x86) Console Application") +!MESSAGE "rosshell - Win32 Unicode Release" (based on "Win32 (x86) Console Application") +!MESSAGE "rosshell - Win32 Unicode Debug" (based on "Win32 (x86) Console Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "rosshell - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c +# ADD CPP /nologo /MD /W3 /GR /GX /O1 /D "NDEBUG" /D "WIN32" /D _WIN32_IE=0x0600 /D _WIN32_WINNT=0x0501 /D "ROSSHELL" /Yu"precomp.h" /FD /c +# ADD BASE RSC /l 0x407 /d "NDEBUG" +# ADD RSC /l 0x407 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 +# ADD LINK32 shell32.lib comctl32.lib gdi32.lib user32.lib advapi32.lib ole32.lib delayimp.lib /nologo /subsystem:windows /machine:I386 /libpath:"Release" /delayload:oleaut32.dll /delayload:wsock32.dll +# SUBTRACT LINK32 /pdb:none + +!ELSEIF "$(CFG)" == "rosshell - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /GR /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D _WIN32_IE=0x0600 /D _WIN32_WINNT=0x0501 /D "ROSSHELL" /FR /Yu"precomp.h" /FD /GZ /c +# ADD BASE RSC /l 0x407 /d "_DEBUG" +# ADD RSC /l 0x407 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib shell32.lib comctl32.lib gdi32.lib user32.lib advapi32.lib ole32.lib delayimp.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept /libpath:"Debug" /delayload:oleaut32.dll /delayload:wsock32.dll +# SUBTRACT LINK32 /pdb:none + +!ELSEIF "$(CFG)" == "rosshell - Win32 Debug Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "DRelease" +# PROP BASE Intermediate_Dir "DRelease" +# PROP BASE Ignore_Export_Lib 0 +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "DRelease" +# PROP Intermediate_Dir "DRelease" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_ROS_" /YX /FD /c +# ADD CPP /nologo /MD /W3 /GR /GX /Zi /O2 /D "NDEBUG" /D "WIN32" /D _WIN32_IE=0x0600 /D _WIN32_WINNT=0x0501 /D "ROSSHELL" /FR /Yu"precomp.h" /FD /c +# ADD BASE RSC /l 0x407 /d "NDEBUG" +# ADD RSC /l 0x407 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 user32.lib gdi32.lib advapi32.lib comctl32.lib shell32.lib /nologo /subsystem:console /machine:I386 +# ADD LINK32 shell32.lib comctl32.lib gdi32.lib user32.lib advapi32.lib ole32.lib delayimp.lib /nologo /subsystem:windows /debug /machine:I386 /delayload:oleaut32.dll /delayload:wsock32.dll +# SUBTRACT LINK32 /pdb:none + +!ELSEIF "$(CFG)" == "rosshell - Win32 Unicode Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "URelease" +# PROP BASE Intermediate_Dir "URelease" +# PROP BASE Ignore_Export_Lib 0 +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "URelease" +# PROP Intermediate_Dir "URelease" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "UNICODE" /D "_ROS_" /YX /FD /c +# ADD CPP /nologo /MD /W3 /GR /GX /O2 /D "NDEBUG" /D "UNICODE" /D "WIN32" /D _WIN32_IE=0x0600 /D _WIN32_WINNT=0x0501 /D "ROSSHELL" /Yu"precomp.h" /FD /c +# ADD BASE RSC /l 0x407 /d "NDEBUG" +# ADD RSC /l 0x407 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 user32.lib gdi32.lib advapi32.lib comctl32.lib shell32.lib /nologo /subsystem:console /machine:I386 +# ADD LINK32 shell32.lib comctl32.lib gdi32.lib user32.lib advapi32.lib ole32.lib delayimp.lib /nologo /subsystem:windows /machine:I386 /libpath:"Release" /delayload:oleaut32.dll /delayload:wsock32.dll +# SUBTRACT LINK32 /pdb:none + +!ELSEIF "$(CFG)" == "rosshell - Win32 Unicode Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "UDebug" +# PROP BASE Intermediate_Dir "UDebug" +# PROP BASE Ignore_Export_Lib 0 +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "UDebug" +# PROP Intermediate_Dir "UDebug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "UNICODE" /D "_ROS_" /FR /YX /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /GR /GX /ZI /Od /D "_DEBUG" /D "UNICODE" /D "WIN32" /D _WIN32_IE=0x0600 /D _WIN32_WINNT=0x0501 /D "ROSSHELL" /FR /Yu"precomp.h" /FD /GZ /c +# ADD BASE RSC /l 0x407 /d "_DEBUG" +# ADD RSC /l 0x407 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 user32.lib gdi32.lib advapi32.lib comctl32.lib shell32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept +# ADD LINK32 shell32.lib comctl32.lib gdi32.lib user32.lib advapi32.lib ole32.lib delayimp.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept /libpath:"Debug" /delayload:oleaut32.dll /delayload:wsock32.dll +# SUBTRACT LINK32 /pdb:none + +!ENDIF + +# Begin Target + +# Name "rosshell - Win32 Release" +# Name "rosshell - Win32 Debug" +# Name "rosshell - Win32 Debug Release" +# Name "rosshell - Win32 Unicode Release" +# Name "rosshell - Win32 Unicode Debug" +# Begin Group "utility" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\utility\dragdropimpl.cpp +# End Source File +# Begin Source File + +SOURCE=.\utility\dragdropimpl.h +# End Source File +# Begin Source File + +SOURCE=.\utility\shellbrowserimpl.cpp +# End Source File +# Begin Source File + +SOURCE=.\utility\shellbrowserimpl.h +# End Source File +# Begin Source File + +SOURCE=.\utility\shellclasses.cpp +# End Source File +# Begin Source File + +SOURCE=.\utility\shellclasses.h +# End Source File +# Begin Source File + +SOURCE=.\utility\treedroptarget.h +# End Source File +# Begin Source File + +SOURCE=.\utility\utility.cpp +# End Source File +# Begin Source File + +SOURCE=.\utility\utility.h +# End Source File +# Begin Source File + +SOURCE=.\utility\window.cpp +# End Source File +# Begin Source File + +SOURCE=.\utility\window.h +# End Source File +# Begin Source File + +SOURCE=.\utility\xmlstorage.cpp +# End Source File +# Begin Source File + +SOURCE=.\utility\xmlstorage.h +# End Source File +# End Group +# Begin Group "resources" + +# PROP Default_Filter "bmp,ico" +# Begin Source File + +SOURCE=.\res\action.ico +# End Source File +# Begin Source File + +SOURCE=.\res\appicon.ico +# End Source File +# Begin Source File + +SOURCE=.\res\apps.ico +# End Source File +# Begin Source File + +SOURCE=.\res\arrow.ico +# End Source File +# Begin Source File + +SOURCE=.\res\arrow_dwn.ico +# End Source File +# Begin Source File + +SOURCE=.\res\arrow_up.ico +# End Source File +# Begin Source File + +SOURCE=.\res\arrowsel.ico +# End Source File +# Begin Source File + +SOURCE=.\res\computer.ico +# End Source File +# Begin Source File + +SOURCE=.\res\config.ico +# End Source File +# Begin Source File + +SOURCE=.\res\documents.ico +# End Source File +# Begin Source File + +SOURCE=.\res\dot.ico +# End Source File +# Begin Source File + +SOURCE=.\res\dot_red.ico +# End Source File +# Begin Source File + +SOURCE=.\res\dot_trans.ico +# End Source File +# Begin Source File + +SOURCE=.\res\drivebar.bmp +# End Source File +# Begin Source File + +SOURCE=".\explorer-jp.rc" +# PROP Exclude_From_Build 1 +# End Source File +# Begin Source File + +SOURCE=.\res\explorer.ico +# End Source File +# Begin Source File + +SOURCE=.\resource.h +# End Source File +# Begin Source File + +SOURCE=.\explorer_intres.rc +# End Source File +# Begin Source File + +SOURCE=.\res\favorites.ico +# End Source File +# Begin Source File + +SOURCE=.\res\floating.ico +# End Source File +# Begin Source File + +SOURCE=.\res\folder.ico +# End Source File +# Begin Source File + +SOURCE=.\res\icoali10.bmp +# End Source File +# Begin Source File + +SOURCE=.\res\icoalig0.bmp +# End Source File +# Begin Source File + +SOURCE=.\res\icoalig1.bmp +# End Source File +# Begin Source File + +SOURCE=.\res\icoalig2.bmp +# End Source File +# Begin Source File + +SOURCE=.\res\icoalig3.bmp +# End Source File +# Begin Source File + +SOURCE=.\res\icoalig4.bmp +# End Source File +# Begin Source File + +SOURCE=.\res\icoalig5.bmp +# End Source File +# Begin Source File + +SOURCE=.\res\icoalig6.bmp +# End Source File +# Begin Source File + +SOURCE=.\res\icoalig7.bmp +# End Source File +# Begin Source File + +SOURCE=.\res\icoalig8.bmp +# End Source File +# Begin Source File + +SOURCE=.\res\icoalig9.bmp +# End Source File +# Begin Source File + +SOURCE=.\res\images.bmp +# End Source File +# Begin Source File + +SOURCE=.\res\info.ico +# End Source File +# Begin Source File + +SOURCE=.\res\logoff.ico +# End Source File +# Begin Source File + +SOURCE=.\res\logov.bmp +# End Source File +# Begin Source File + +SOURCE=.\res\logov16.bmp +# End Source File +# Begin Source File + +SOURCE=.\res\logov256.bmp +# End Source File +# Begin Source File + +SOURCE=.\res\network.ico +# End Source File +# Begin Source File + +SOURCE=.\res\notify_l.ico +# End Source File +# Begin Source File + +SOURCE=.\res\notify_r.ico +# End Source File +# Begin Source File + +SOURCE=.\res\printer.ico +# End Source File +# Begin Source File + +SOURCE=.\res\reactos.ico +# End Source File +# Begin Source File + +SOURCE=".\res\ros-big.ico" +# End Source File +# Begin Source File + +SOURCE=".\res\search-doc.ico" +# End Source File +# Begin Source File + +SOURCE=.\res\search.ico +# End Source File +# Begin Source File + +SOURCE=.\res\speaker.ico +# End Source File +# Begin Source File + +SOURCE=.\res\startmenu.ico +# End Source File +# End Group +# Begin Group "taskbar" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\taskbar\desktopbar.cpp +# End Source File +# Begin Source File + +SOURCE=.\taskbar\desktopbar.h +# End Source File +# Begin Source File + +SOURCE=.\taskbar\favorites.cpp +# End Source File +# Begin Source File + +SOURCE=.\taskbar\favorites.h +# End Source File +# Begin Source File + +SOURCE=.\notifyhook\notifyhook.h +# End Source File +# Begin Source File + +SOURCE=.\taskbar\quicklaunch.cpp +# End Source File +# Begin Source File + +SOURCE=.\taskbar\quicklaunch.h +# End Source File +# Begin Source File + +SOURCE=.\taskbar\startmenu.cpp +# End Source File +# Begin Source File + +SOURCE=.\taskbar\startmenu.h +# End Source File +# Begin Source File + +SOURCE=.\taskbar\taskbar.cpp +# End Source File +# Begin Source File + +SOURCE=.\taskbar\taskbar.h +# End Source File +# Begin Source File + +SOURCE=.\taskbar\traynotify.cpp +# End Source File +# Begin Source File + +SOURCE=.\taskbar\traynotify.h +# End Source File +# End Group +# Begin Group "desktop" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\desktop\desktop.cpp +# End Source File +# Begin Source File + +SOURCE=.\desktop\desktop.h +# End Source File +# End Group +# Begin Group "shell" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\shell\entries.cpp +# End Source File +# Begin Source File + +SOURCE=.\shell\entries.h +# End Source File +# Begin Source File + +SOURCE=.\shell\filechild.h +# End Source File +# Begin Source File + +SOURCE=.\shell\pane.cpp +# End Source File +# Begin Source File + +SOURCE=.\shell\pane.h +# End Source File +# Begin Source File + +SOURCE=.\shell\shellbrowser.h +# End Source File +# Begin Source File + +SOURCE=.\shell\shellfs.cpp +# End Source File +# Begin Source File + +SOURCE=.\shell\shellfs.h +# End Source File +# Begin Source File + +SOURCE=.\shell\winfs.cpp +# End Source File +# Begin Source File + +SOURCE=.\shell\winfs.h +# End Source File +# End Group +# Begin Group "dialogs" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\dialogs\searchprogram.cpp +# End Source File +# Begin Source File + +SOURCE=.\dialogs\searchprogram.h +# End Source File +# Begin Source File + +SOURCE=.\dialogs\settings.cpp +# End Source File +# Begin Source File + +SOURCE=.\dialogs\settings.h +# End Source File +# End Group +# Begin Group "main" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\explorer.cpp +# End Source File +# Begin Source File + +SOURCE=.\explorer.h +# End Source File +# Begin Source File + +SOURCE=.\externals.h +# End Source File +# Begin Source File + +SOURCE=.\globals.h +# End Source File +# Begin Source File + +SOURCE=".\i386-stub-win32.c" +# SUBTRACT CPP /YX /Yc /Yu +# End Source File +# Begin Source File + +SOURCE=.\precomp.cpp +# ADD CPP /Yc"precomp.h" +# End Source File +# Begin Source File + +SOURCE=.\precomp.h +# End Source File +# End Group +# Begin Group "services" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\services\shellservices.cpp +# End Source File +# Begin Source File + +SOURCE=.\services\shellservices.h +# End Source File +# Begin Source File + +SOURCE=.\services\startup.c +# SUBTRACT CPP /YX /Yc /Yu +# End Source File +# End Group +# End Target +# End Project diff --git a/reactos/base/shell/explorer/rosshell.dsw b/reactos/base/shell/explorer/rosshell.dsw new file mode 100644 index 00000000000..a4b210436b6 --- /dev/null +++ b/reactos/base/shell/explorer/rosshell.dsw @@ -0,0 +1,56 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "rosshell"=.\rosshell.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name notifyhook + End Project Dependency +}}} + +############################################################################### + +Project: "make_rosshell"=.\make_rosshell.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "notifyhook"=.\notifyhook\notifyhook.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/reactos/base/shell/explorer/services/shellservices.cpp b/reactos/base/shell/explorer/services/shellservices.cpp new file mode 100644 index 00000000000..48b3caa90bb --- /dev/null +++ b/reactos/base/shell/explorer/services/shellservices.cpp @@ -0,0 +1,97 @@ +/* + * Copyright 2005 Martin Fuchs + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + + // + // Explorer clone + // + // shellservices.cpp + // + // Martin Fuchs, 28.03.2005 + // + + +#include + +#include "shellservices.h" + + +int SSOThread::Run() +{ + ComInit usingCOM(COINIT_APARTMENTTHREADED|COINIT_DISABLE_OLE1DDE|COINIT_SPEED_OVER_MEMORY); + + HKEY hkey; + CLSID clsid; + WCHAR name[MAX_PATH], value[MAX_PATH]; + + typedef vector*> SSOVector; + SSOVector sso_ptrs; + + if (!RegOpenKey(HKEY_LOCAL_MACHINE, TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\ShellServiceObjectDelayLoad"), &hkey)) { + for(int idx=0; ; ++idx) { + DWORD name_len = MAX_PATH; + DWORD value_len = sizeof(value); + + if (RegEnumValueW(hkey, idx, name, &name_len, 0, NULL, (LPBYTE)&value, &value_len)) + break; + + if (!_alive) + break; + + SIfacePtr* sso_ptr = new SIfacePtr; + + if (CLSIDFromString(value, &clsid) == NOERROR) { + if (SUCCEEDED(sso_ptr->CreateInstance(clsid, IID_IOleCommandTarget))) { + if (SUCCEEDED((*sso_ptr)->Exec(&CGID_ShellServiceObject, OLECMDID_NEW, OLECMDEXECOPT_DODEFAULT, NULL, NULL))) + sso_ptrs.push_back(sso_ptr); + } + } + } + + RegCloseKey(hkey); + } + + if (!sso_ptrs.empty()) { + MSG msg; + + while(_alive) { + if (MsgWaitForMultipleObjects(1, &_evtFinish, FALSE, INFINITE, QS_ALLINPUT) == WAIT_OBJECT_0+0) + break; // _evtFinish has been set. + + while(_alive) { + if (!PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) + break; + + if (msg.message == WM_QUIT) + break; + + TranslateMessage(&msg); + DispatchMessage(&msg); + } + } + + // shutdown all running Shell Service Objects + for(SSOVector::iterator it=sso_ptrs.begin(); it!=sso_ptrs.end(); ++it) { + SIfacePtr* sso_ptr = *it; + (*sso_ptr)->Exec(&CGID_ShellServiceObject, OLECMDID_SAVE, OLECMDEXECOPT_DODEFAULT, NULL, NULL); + delete sso_ptr; + } + } + + return 0; +} diff --git a/reactos/base/shell/explorer/services/shellservices.h b/reactos/base/shell/explorer/services/shellservices.h new file mode 100644 index 00000000000..ecda2819069 --- /dev/null +++ b/reactos/base/shell/explorer/services/shellservices.h @@ -0,0 +1,36 @@ +/* + * Copyright 2005 Martin Fuchs + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + + // + // Explorer clone + // + // shellservices.h + // + // Martin Fuchs, 28.03.2005 + // + + + // launch start programs +extern "C" int startup(int argc, char *argv[]); + + // load Shell Service Objects (volume control, printer/network icons, ...) +struct SSOThread : public Thread +{ + int Run(); +}; diff --git a/reactos/base/shell/explorer/services/startup.c b/reactos/base/shell/explorer/services/startup.c new file mode 100644 index 00000000000..ec0e4224d80 --- /dev/null +++ b/reactos/base/shell/explorer/services/startup.c @@ -0,0 +1,485 @@ +/* + * Copyright (C) 2002 Andreas Mohr + * Copyright (C) 2002 Shachar Shemesh + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* Based on the Wine "bootup" handler application + * + * This app handles the various "hooks" windows allows for applications to perform + * as part of the bootstrap process. Theses are roughly devided into three types. + * Knowledge base articles that explain this are 137367, 179365, 232487 and 232509. + * Also, 119941 has some info on grpconv.exe + * The operations performed are (by order of execution): + * + * Preboot (prior to fully loading the Windows kernel): + * - wininit.exe (rename operations left in wininit.ini - Win 9x only) + * - PendingRenameOperations (rename operations left in the registry - Win NT+ only) + * + * Startup (before the user logs in) + * - Services (NT, ?semi-synchronous?, not implemented yet) + * - HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServicesOnce (9x, asynch) + * - HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServices (9x, asynch) + * + * After log in + * - HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnce (all, synch) + * - HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run (all, asynch) + * - HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run (all, asynch) + * - Startup folders (all, ?asynch?, no imp) + * - HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce (all, asynch) + * + * Somewhere in there is processing the RunOnceEx entries (also no imp) + * + * Bugs: + * - If a pending rename registry does not start with \??\ the entry is + * processed anyways. I'm not sure that is the Windows behaviour. + * - Need to check what is the windows behaviour when trying to delete files + * and directories that are read-only + * - In the pending rename registry processing - there are no traces of the files + * processed (requires translations from Unicode to Ansi). + */ + +#include +#include +#include + +/** + * Performs the rename operations dictated in %SystemRoot%\Wininit.ini. + * Returns FALSE if there was an error, or otherwise if all is ok. + */ +static BOOL wininit() +{ + return TRUE; +} + +static BOOL pendingRename() +{ + static const WCHAR ValueName[] = {'P','e','n','d','i','n','g', + 'F','i','l','e','R','e','n','a','m','e', + 'O','p','e','r','a','t','i','o','n','s',0}; + static const WCHAR SessionW[] = { 'S','y','s','t','e','m','\\', + 'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\', + 'C','o','n','t','r','o','l','\\', + 'S','e','s','s','i','o','n',' ','M','a','n','a','g','e','r',0}; + WCHAR *buffer=NULL; + const WCHAR *src=NULL, *dst=NULL; + DWORD dataLength=0; + HKEY hSession=NULL; + DWORD res; + + printf("Entered\n"); + + if ((res=RegOpenKeyExW(HKEY_LOCAL_MACHINE, SessionW, 0, KEY_ALL_ACCESS, &hSession)) + !=ERROR_SUCCESS) + { + if (res==ERROR_FILE_NOT_FOUND) + { + printf("The key was not found - skipping\n"); + res=TRUE; + } + else + { + printf("Couldn't open key, error %ld\n", res); + res=FALSE; + } + + goto end; + } + + res=RegQueryValueExW(hSession, ValueName, NULL, NULL /* The value type does not really interest us, as it is not + truely a REG_MULTI_SZ anyways */, + NULL, &dataLength); + if (res==ERROR_FILE_NOT_FOUND) + { + /* No value - nothing to do. Great! */ + printf("Value not present - nothing to rename\n"); + res=TRUE; + goto end; + } + + if (res!=ERROR_SUCCESS) + { + printf("Couldn't query value's length (%ld)\n", res); + res=FALSE; + goto end; + } + + buffer=malloc(dataLength); + if (buffer==NULL) + { + printf("Couldn't allocate %lu bytes for the value\n", dataLength); + res=FALSE; + goto end; + } + + res=RegQueryValueExW(hSession, ValueName, NULL, NULL, (LPBYTE)buffer, &dataLength); + if (res!=ERROR_SUCCESS) + { + printf("Couldn't query value after successfully querying before (%lu),\n" + "please report to wine-devel@winehq.org\n", res); + res=FALSE; + goto end; + } + + /* Make sure that the data is long enough and ends with two NULLs. This + * simplifies the code later on. + */ + if (dataLength<2*sizeof(buffer[0]) || + buffer[dataLength/sizeof(buffer[0])-1]!='\0' || + buffer[dataLength/sizeof(buffer[0])-2]!='\0') + { + printf("Improper value format - doesn't end with NULL\n"); + res=FALSE; + goto end; + } + + for(src=buffer; (src-buffer)*sizeof(src[0])0) + { + DWORD nValLength=nMaxValue, nDataLength=nMaxCmdLine; + DWORD type; + + --i; + + if ((res=RegEnumValueW(hkRun, i, szValue, &nValLength, 0, &type, + (LPBYTE)szCmdLine, &nDataLength))!=ERROR_SUCCESS) + { + printf("Couldn't read in value %ld - %ld\n", i, res); + + continue; + } + + if (bDelete && (res=RegDeleteValueW(hkRun, szValue))!=ERROR_SUCCESS) + { + printf("Couldn't delete value - %ld, %ld. Running command anyways.\n", i, res); + } + + if (type!=REG_SZ) + { + printf("Incorrect type of value #%ld (%ld)\n", i, type); + + continue; + } + + if ((res=runCmd(szCmdLine, NULL, bSynchronous, FALSE))==INVALID_RUNCMD_RETURN) + { + printf("Error running cmd #%ld (%ld)\n", i, GetLastError()); + } + + printf("Done processing cmd #%ld\n", i); + } + + res=ERROR_SUCCESS; + +end: + if (hkRun!=NULL) + RegCloseKey(hkRun); + if (hkWin!=NULL) + RegCloseKey(hkWin); + + printf("done\n"); + + return res==ERROR_SUCCESS?TRUE:FALSE; +} + + /// structure holding startup flags +struct op_mask { + BOOL w9xonly; /* Perform only operations done on Windows 9x */ + BOOL ntonly; /* Perform only operations done on Windows NT */ + BOOL startup; /* Perform the operations that are performed every boot */ + BOOL preboot; /* Perform file renames typically done before the system starts */ + BOOL prelogin; /* Perform the operations typically done before the user logs in */ + BOOL postlogin; /* Operations done after login */ +}; + +static const struct op_mask + SESSION_START = {FALSE, FALSE, TRUE, TRUE, TRUE, TRUE}, + SETUP = {FALSE, FALSE, FALSE, TRUE, TRUE, TRUE}; +#define DEFAULT SESSION_START + +int startup(int argc, char *argv[]) +{ + struct op_mask ops; /* Which of the ops do we want to perform? */ + /* First, set the current directory to SystemRoot */ + TCHAR gen_path[MAX_PATH]; + DWORD res; + + res = GetWindowsDirectory(gen_path, sizeof(gen_path)); + + if (res==0) + { + printf("Couldn't get the windows directory - error %ld\n", + GetLastError()); + + return 100; + } + + if (res>=sizeof(gen_path)) + { + printf("Windows path too long (%ld)\n", res); + + return 100; + } + + if (!SetCurrentDirectory(gen_path)) + { + wprintf(L"Cannot set the dir to %s (%ld)\n", gen_path, GetLastError()); + + return 100; + } + + if (argc>1) + { + switch(argv[1][0]) + { + case 'r': /* Restart */ + ops=SETUP; + break; + case 's': /* Full start */ + ops=SESSION_START; + break; + default: + ops=DEFAULT; + break; + } + } else + ops=DEFAULT; + + /* Perform the ops by order, stopping if one fails, skipping if necessary */ + /* Shachar: Sorry for the perl syntax */ + res=(ops.ntonly || !ops.preboot || wininit()) && + (ops.w9xonly || !ops.preboot || pendingRename()) && + (ops.ntonly || !ops.prelogin || + ProcessRunKeys(HKEY_LOCAL_MACHINE, runkeys_names[RUNKEY_RUNSERVICESONCE], TRUE, FALSE)) && + (ops.ntonly || !ops.prelogin || !ops.startup || + ProcessRunKeys(HKEY_LOCAL_MACHINE, runkeys_names[RUNKEY_RUNSERVICES], FALSE, FALSE)) && + (!ops.postlogin || + ProcessRunKeys(HKEY_LOCAL_MACHINE, runkeys_names[RUNKEY_RUNONCE], TRUE, TRUE)) && + (!ops.postlogin || !ops.startup || + ProcessRunKeys(HKEY_LOCAL_MACHINE, runkeys_names[RUNKEY_RUN], FALSE, FALSE)) && + (!ops.postlogin || !ops.startup || + ProcessRunKeys(HKEY_CURRENT_USER, runkeys_names[RUNKEY_RUN], FALSE, FALSE)); + + printf("Operation done\n"); + + return res?0:101; +} diff --git a/reactos/base/shell/explorer/shell/entries.cpp b/reactos/base/shell/explorer/shell/entries.cpp new file mode 100644 index 00000000000..562eeb7e612 --- /dev/null +++ b/reactos/base/shell/explorer/shell/entries.cpp @@ -0,0 +1,800 @@ +/* + * Copyright 2003, 2004, 2005 Martin Fuchs + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + + // + // Explorer clone + // + // entries.cpp + // + // Martin Fuchs, 23.07.2003 + // + + +#include + +//#include "entries.h" + + + // allocate and initialise a directory entry +Entry::Entry(ENTRY_TYPE etype) + : _etype(etype) +{ + _up = NULL; + _next = NULL; + _down = NULL; + _expanded = false; + _scanned = false; + _bhfi_valid = false; + _level = 0; + _icon_id = ICID_UNKNOWN; + _display_name = _data.cFileName; + _type_name = NULL; + _content = NULL; +} + +Entry::Entry(Entry* parent, ENTRY_TYPE etype) + : _up(parent), + _etype(etype) +{ + _next = NULL; + _down = NULL; + _expanded = false; + _scanned = false; + _bhfi_valid = false; + _level = 0; + _icon_id = ICID_UNKNOWN; + _shell_attribs = 0; + _display_name = _data.cFileName; + _type_name = NULL; + _content = NULL; +} + +Entry::Entry(const Entry& other) +{ + _next = NULL; + _down = NULL; + _up = NULL; + + assert(!other._next); + assert(!other._down); + assert(!other._up); + + _expanded = other._expanded; + _scanned = other._scanned; + _level = other._level; + + _data = other._data; + + _shell_attribs = other._shell_attribs; + _display_name = other._display_name==other._data.cFileName? _data.cFileName: _tcsdup(other._display_name); + _type_name = other._type_name? _tcsdup(other._type_name): NULL; + _content = other._content? _tcsdup(other._content): NULL; + + _etype = other._etype; + _icon_id = other._icon_id; + + _bhfi = other._bhfi; + _bhfi_valid = other._bhfi_valid; +} + + // free a directory entry +Entry::~Entry() +{ + if (_icon_id > ICID_NONE) + g_Globals._icon_cache.free_icon(_icon_id); + + if (_display_name != _data.cFileName) + free(_display_name); + + if (_type_name) + free(_type_name); + + if (_content) + free(_content); +} + + + // read directory tree and expand to the given location +Entry* Entry::read_tree(const void* path, SORT_ORDER sortOrder, int scan_flags) +{ + CONTEXT("Entry::read_tree()"); + + WaitCursor wait; + + Entry* entry = this; + + for(const void*p=path; p && entry; ) { + entry->smart_scan(sortOrder, scan_flags); + + if (entry->_down) + entry->_expanded = true; + + Entry* found = entry->find_entry(p); + p = entry->get_next_path_component(p); + + entry = found; + } + + return entry; +} + + +void Entry::read_directory_base(SORT_ORDER sortOrder, int scan_flags) +{ + CONTEXT("Entry::read_directory_base()"); + + // call into subclass + read_directory(scan_flags); + +#ifndef ROSSHELL + if (g_Globals._prescan_nodes) { //@todo _prescan_nodes should not be used for reading the start menu. + for(Entry*entry=_down; entry; entry=entry->_next) + if (entry->_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { + entry->read_directory(scan_flags); + entry->sort_directory(sortOrder); + } + } +#endif + + sort_directory(sortOrder); +} + + +Root::Root() +{ + memset(this, 0, sizeof(Root)); +} + +Root::~Root() +{ + if (_entry) { + _entry->free_subentries(); + delete _entry; + } +} + + + // sort order for different directory/file types +enum TYPE_ORDER { + TO_DIR, + TO_DOT, + TO_DOTDOT, + TO_OTHER_DIR, + TO_VIRTUAL_FOLDER, + TO_FILE +}; + + // distinguish between ".", ".." and any other directory names +static TYPE_ORDER TypeOrderFromDirname(LPCTSTR name) +{ + if (name[0] == '.') { + if (name[1] == '\0') + return TO_DOT; // "." + + if (name[1]=='.' && name[2]=='\0') + return TO_DOTDOT; // ".." + } + + return TO_OTHER_DIR; // any other directory +} + + // directories first... +static int compareType(const Entry* entry1, const Entry* entry2) +{ + const WIN32_FIND_DATA* fd1 = &entry1->_data; + const WIN32_FIND_DATA* fd2 = &entry2->_data; + + TYPE_ORDER order1 = fd1->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY? TO_DIR: TO_FILE; + TYPE_ORDER order2 = fd2->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY? TO_DIR: TO_FILE; + + // Handle "." and ".." as special case and move them at the very first beginning. + if (order1==TO_DIR && order2==TO_DIR) { + order1 = TypeOrderFromDirname(fd1->cFileName); + order2 = TypeOrderFromDirname(fd2->cFileName); + + // Move virtual folders after physical folders + if (!(entry1->_shell_attribs & SFGAO_FILESYSTEM)) + order1 = TO_VIRTUAL_FOLDER; + + if (!(entry2->_shell_attribs & SFGAO_FILESYSTEM)) + order2 = TO_VIRTUAL_FOLDER; + } + + return order2==order1? 0: order1_data.cFileName, entry2->_data.cFileName); +} + +static int compareExt(const void* arg1, const void* arg2) +{ + const Entry* entry1 = *(const Entry**)arg1; + const Entry* entry2 = *(const Entry**)arg2; + const TCHAR *name1, *name2, *ext1, *ext2; + + int cmp = compareType(entry1, entry2); + if (cmp) + return cmp; + + name1 = entry1->_data.cFileName; + name2 = entry2->_data.cFileName; + + ext1 = _tcsrchr(name1, TEXT('.')); + ext2 = _tcsrchr(name2, TEXT('.')); + + if (ext1) + ++ext1; + else + ext1 = TEXT(""); + + if (ext2) + ++ext2; + else + ext2 = TEXT(""); + + cmp = lstrcmpi(ext1, ext2); + if (cmp) + return cmp; + + return lstrcmpi(name1, name2); +} + +static int compareSize(const void* arg1, const void* arg2) +{ + const Entry* entry1 = *(const Entry**)arg1; + const Entry* entry2 = *(const Entry**)arg2; + + int cmp = compareType(entry1, entry2); + if (cmp) + return cmp; + + cmp = entry2->_data.nFileSizeHigh - entry1->_data.nFileSizeHigh; + + if (cmp < 0) + return -1; + else if (cmp > 0) + return 1; + + cmp = entry2->_data.nFileSizeLow - entry1->_data.nFileSizeLow; + + return cmp<0? -1: cmp>0? 1: 0; +} + +static int compareDate(const void* arg1, const void* arg2) +{ + const Entry* entry1 = *(const Entry**)arg1; + const Entry* entry2 = *(const Entry**)arg2; + + int cmp = compareType(entry1, entry2); + if (cmp) + return cmp; + + return CompareFileTime(&entry2->_data.ftLastWriteTime, &entry1->_data.ftLastWriteTime); +} + + +static int (*sortFunctions[])(const void* arg1, const void* arg2) = { + compareNothing, // SORT_NONE + compareName, // SORT_NAME + compareExt, // SORT_EXT + compareSize, // SORT_SIZE + compareDate // SORT_DATE +}; + + +void Entry::sort_directory(SORT_ORDER sortOrder) +{ + if (sortOrder != SORT_NONE) { + Entry* entry = _down; + Entry** array, **p; + int len; + + len = 0; + for(entry=_down; entry; entry=entry->_next) + ++len; + + if (len) { + array = (Entry**) alloca(len*sizeof(Entry*)); + + p = array; + for(entry=_down; entry; entry=entry->_next) + *p++ = entry; + + // call qsort with the appropriate compare function + qsort(array, len, sizeof(array[0]), sortFunctions[sortOrder]); + + _down = array[0]; + + for(p=array; --len; p++) + (*p)->_next = p[1]; + + (*p)->_next = 0; + } + } +} + + +void Entry::smart_scan(SORT_ORDER sortOrder, int scan_flags) +{ + CONTEXT("Entry::smart_scan()"); + + if (!_scanned) { + free_subentries(); + read_directory_base(sortOrder, scan_flags); ///@todo We could use IShellFolder2::GetDefaultColumn to determine sort order. + } +} + + + +int Entry::extract_icon(ICONCACHE_FLAGS flags) +{ + TCHAR path[MAX_PATH]; + + ICON_ID icon_id = ICID_NONE; + + if (_etype!=ET_SHELL && get_path(path, COUNTOF(path))) // not for ET_SHELL to display the correct desktop icon + if (!(flags & ICF_MIDDLE)) // not for ICF_MIDDLE to extract 24x24 icons because SHGetFileInfo() doesn't support this icon size + icon_id = g_Globals._icon_cache.extract(path, flags); + + if (icon_id == ICID_NONE) { + if (!(flags & ICF_OVERLAYS)) { + IExtractIcon* pExtract; + if (SUCCEEDED(GetUIObjectOf(0, IID_IExtractIcon, (LPVOID*)&pExtract))) { + unsigned gil_flags; + int idx; + + if (flags & ICF_OPEN) + gil_flags |= GIL_OPENICON; + + if (SUCCEEDED(pExtract->GetIconLocation(GIL_FORSHELL, path, COUNTOF(path), &idx, &gil_flags))) { + if (gil_flags & GIL_NOTFILENAME) + icon_id = g_Globals._icon_cache.extract(pExtract, path, idx, flags); + else { + if (idx == -1) + idx = 0; // special case for some control panel applications ("System") + + icon_id = g_Globals._icon_cache.extract(path, idx, flags); + } + + /* using create_absolute_pidl() [see below] results in more correct icons for some control panel applets (NVidia display driver). + if (icon_id == ICID_NONE) { + SHFILEINFO sfi; + + if (SHGetFileInfo(path, 0, &sfi, sizeof(sfi), SHGFI_ICON|SHGFI_SMALLICON)) + icon_id = g_Globals._icon_cache.add(sfi.hIcon)._id; + } */ + /* + if (icon_id == ICID_NONE) { + LPBYTE b = (LPBYTE) alloca(0x10000); + SHFILEINFO sfi; + + FILE* file = fopen(path, "rb"); + if (file) { + int l = fread(b, 1, 0x10000, file); + fclose(file); + + if (l) + icon_id = g_Globals._icon_cache.add(CreateIconFromResourceEx(b, l, TRUE, 0x00030000, 16, 16, LR_DEFAULTCOLOR)); + } + } */ + } + } + } + + if (icon_id == ICID_NONE) { + SHFILEINFO sfi; + + const ShellPath& pidl_abs = create_absolute_pidl(); + LPCITEMIDLIST pidl = pidl_abs; + + int shgfi_flags = SHGFI_PIDL; + + if (!(flags & (ICF_LARGE|ICF_MIDDLE))) + shgfi_flags |= SHGFI_SMALLICON; + + if (flags & ICF_OPEN) + shgfi_flags |= SHGFI_OPENICON; + + if (flags & ICF_SYSCACHE) { + assert(!(flags&ICF_OVERLAYS)); + + HIMAGELIST himlSys = (HIMAGELIST) SHGetFileInfo((LPCTSTR)pidl, 0, &sfi, sizeof(sfi), SHGFI_SYSICONINDEX|shgfi_flags); + if (himlSys) + icon_id = g_Globals._icon_cache.add(sfi.iIcon); + } else { + if (flags & ICF_OVERLAYS) + shgfi_flags |= SHGFI_ADDOVERLAYS; + + if (SHGetFileInfo((LPCTSTR)pidl, 0, &sfi, sizeof(sfi), SHGFI_ICON|shgfi_flags)) + icon_id = g_Globals._icon_cache.add(sfi.hIcon); + } + } + } + + return icon_id; +} + +int Entry::safe_extract_icon(ICONCACHE_FLAGS flags) +{ + try { + return extract_icon(flags); + } catch(COMException&) { + // ignore unexpected exceptions while extracting icons + } + + return ICID_NONE; +} + + +BOOL Entry::launch_entry(HWND hwnd, UINT nCmdShow) +{ + TCHAR cmd[MAX_PATH]; + + if (!get_path(cmd, COUNTOF(cmd))) + return FALSE; + + // add path to the recent file list + SHAddToRecentDocs(SHARD_PATH, cmd); + + // start program, open document... + return launch_file(hwnd, cmd, nCmdShow); +} + + + // local replacement implementation for SHBindToParent() + // (derived from http://www.geocities.com/SiliconValley/2060/articles/shell-helpers.html) +static HRESULT my_SHBindToParent(LPCITEMIDLIST pidl, REFIID riid, VOID** ppv, LPCITEMIDLIST* ppidlLast) +{ + HRESULT hr; + + if (!ppv) + return E_POINTER; + + // There must be at least one item ID. + if (!pidl || !pidl->mkid.cb) + return E_INVALIDARG; + + // Get the desktop folder as root. + ShellFolder desktop; +/* IShellFolderPtr desktop; + hr = SHGetDesktopFolder(&desktop); + if (FAILED(hr)) + return hr; */ + + // Walk to the penultimate item ID. + LPCITEMIDLIST marker = pidl; + for (;;) + { + LPCITEMIDLIST next = reinterpret_cast( + marker->mkid.abID - sizeof(marker->mkid.cb) + marker->mkid.cb); + if (!next->mkid.cb) + break; + marker = next; + } + + if (marker == pidl) + { + // There was only a single item ID, so bind to the root folder. + hr = desktop->QueryInterface(riid, ppv); + } + else + { + // Copy the ID list, truncating the last item. + int length = marker->mkid.abID - pidl->mkid.abID; + if (LPITEMIDLIST parent_id = reinterpret_cast( + malloc(length + sizeof(pidl->mkid.cb)))) + { + LPBYTE raw_data = reinterpret_cast(parent_id); + memcpy(raw_data, pidl, length); + memset(raw_data + length, 0, sizeof(pidl->mkid.cb)); + hr = desktop->BindToObject(parent_id, 0, riid, ppv); + free(parent_id); + } + else + return E_OUTOFMEMORY; + } + + // Return a pointer to the last item ID. + if (ppidlLast) + *ppidlLast = marker; + + return hr; +} +#define USE_MY_SHBINDTOPARENT + +HRESULT Entry::do_context_menu(HWND hwnd, const POINT& pos, CtxMenuInterfaces& cm_ifs) +{ + ShellPath shell_path = create_absolute_pidl(); + LPCITEMIDLIST pidl_abs = shell_path; + + if (!pidl_abs) + return S_FALSE; // no action for registry entries, etc. + +#ifdef USE_MY_SHBINDTOPARENT + IShellFolder* parentFolder; + LPCITEMIDLIST pidlLast; + + // get and use the parent folder to display correct context menu in all cases -> correct "Properties" dialog for directories, ... + HRESULT hr = my_SHBindToParent(pidl_abs, IID_IShellFolder, (LPVOID*)&parentFolder, &pidlLast); + + if (SUCCEEDED(hr)) { + hr = ShellFolderContextMenu(parentFolder, hwnd, 1, &pidlLast, pos.x, pos.y, cm_ifs); + + parentFolder->Release(); + } + + return hr; +#else + static DynamicFct SHBindToParent(TEXT("SHELL32"), "SHBindToParent"); + + if (SHBindToParent) { + IShellFolder* parentFolder; + LPCITEMIDLIST pidlLast; + + // get and use the parent folder to display correct context menu in all cases -> correct "Properties" dialog for directories, ... + HRESULT hr = (*SHBindToParent)(pidl_abs, IID_IShellFolder, (LPVOID*)&parentFolder, &pidlLast); + + if (SUCCEEDED(hr)) { + hr = ShellFolderContextMenu(parentFolder, hwnd, 1, &pidlLast, pos.x, pos.y, cm_ifs); + + parentFolder->Release(); + } + + return hr; + } else { + /**@todo use parent folder instead of desktop folder + Entry* dir = _up; + + ShellPath parent_path; + + if (dir) + parent_path = dir->create_absolute_pidl(); + else + parent_path = DesktopFolderPath(); + + ShellPath shell_path = create_relative_pidl(parent_path); + LPCITEMIDLIST pidl = shell_path; + + ShellFolder parent_folder = parent_path; + return ShellFolderContextMenu(parent_folder, hwnd, 1, &pidl, pos.x, pos.y); + */ + return ShellFolderContextMenu(GetDesktopFolder(), hwnd, 1, &pidl_abs, pos.x, pos.y, cm_ifs); + } +#endif +} + + +HRESULT Entry::GetUIObjectOf(HWND hWnd, REFIID riid, LPVOID* ppvOut) +{ + TCHAR path[MAX_PATH]; +/* + if (!get_path(path, COUNTOF(path))) + return E_FAIL; + + ShellPath shell_path(path); + + IShellFolder* pFolder; + LPCITEMIDLIST pidl_last = NULL; + + static DynamicFct SHBindToParent(TEXT("SHELL32"), "SHBindToParent"); + + if (!SHBindToParent) + return E_NOTIMPL; + + HRESULT hr = (*SHBindToParent)(shell_path, IID_IShellFolder, (LPVOID*)&pFolder, &pidl_last); + if (FAILED(hr)) + return hr; + + ShellFolder shell_folder(pFolder); + + shell_folder->Release(); + + return shell_folder->GetUIObjectOf(hWnd, 1, &pidl_last, riid, NULL, ppvOut); +*/ + if (!_up) + return E_INVALIDARG; + + if (!_up->get_path(path, COUNTOF(path))) + return E_FAIL; + + ShellPath shell_path(path); + ShellFolder shell_folder(shell_path); + +#ifdef UNICODE + LPWSTR wname = _data.cFileName; +#else + WCHAR wname[MAX_PATH]; + MultiByteToWideChar(CP_ACP, 0, _data.cFileName, -1, wname, COUNTOF(wname)); +#endif + + LPITEMIDLIST pidl_last = NULL; + HRESULT hr = shell_folder->ParseDisplayName(hWnd, NULL, wname, NULL, &pidl_last, NULL); + + if (FAILED(hr)) + return hr; + + hr = shell_folder->GetUIObjectOf(hWnd, 1, (LPCITEMIDLIST*)&pidl_last, riid, NULL, ppvOut); + + ShellMalloc()->Free((void*)pidl_last); + + return hr; +} + + + // get full path of specified directory entry +bool Entry::get_path_base ( PTSTR path, size_t path_count, ENTRY_TYPE etype ) const +{ + int level = 0; + size_t len = 0; + size_t l = 0; + LPCTSTR name = NULL; + TCHAR buffer[MAX_PATH]; + + if (!path || path_count==0) + return false; + + const Entry* entry; + if ( path_count > 1 ) + { + for(entry=this; entry; level++) { + l = 0; + + if (entry->_etype == etype) { + name = entry->_data.cFileName; + + for(LPCTSTR s=name; *s && *s!=TEXT('/') && *s!=TEXT('\\'); s++) + ++l; + + if (!entry->_up) + break; + } else { + if (entry->get_path(buffer, COUNTOF(buffer))) { + l = _tcslen(buffer); + name = buffer; + + /* special handling of drive names */ + if (l>0 && buffer[l-1]=='\\' && path[0]=='\\') + --l; + + if ( len+l >= path_count ) + { + if ( l + 1 > path_count ) + len = 0; + else + len = path_count - l - 1; + } + memmove(path+l, path, len*sizeof(TCHAR)); + if ( l+1 >= path_count ) + l = path_count - 1; + memcpy(path, name, l*sizeof(TCHAR)); + len += l; + } + + entry = NULL; + break; + } + + if (l > 0) { + if ( len+l+1 >= path_count ) + { + /* compare to 2 here because of terminator plus the '\\' we prepend */ + if ( l + 2 > path_count ) + len = 0; + else + len = path_count - l - 2; + } + memmove(path+l+1, path, len*sizeof(TCHAR)); + /* compare to 2 here because of terminator plus the '\\' we prepend */ + if ( l+2 >= path_count ) + l = path_count - 2; + memcpy(path+1, name, l*sizeof(TCHAR)); + len += l+1; + +#ifndef _NO_WIN_FS + if (etype == ET_WINDOWS && entry->_up && !(entry->_up->_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) // a NTFS stream? + path[0] = TEXT(':'); + else +#endif + path[0] = TEXT('\\'); + } + + entry = entry->_up; + } + + if (entry) { + if ( len+l >= path_count ) + { + if ( l + 1 > path_count ) + len = 0; + else + len = path_count - l - 1; + } + memmove(path+l, path, len*sizeof(TCHAR)); + if ( l+1 >= path_count ) + l = path_count - 1; + memcpy(path, name, l*sizeof(TCHAR)); + len += l; + } + + if ( !level && (len+1 < path_count) ) + path[len++] = TEXT('\\'); + } + + path[len] = TEXT('\0'); + + return true; +} + + // recursively free all child entries +void Entry::free_subentries() +{ + Entry *entry, *next=_down; + + if (next) { + _down = 0; + + do { + entry = next; + next = entry->_next; + + entry->free_subentries(); + delete entry; + } while(next); + } +} + + +Entry* Root::read_tree(LPCTSTR path, int scan_flags) +{ + Entry* entry; + + if (path && *path) + entry = _entry->read_tree(path, _sort_order); + else { + entry = _entry->read_tree(NULL, _sort_order); + + _entry->smart_scan(); + + if (_entry->_down) + _entry->_expanded = true; + } + + return entry; +} + + +Entry* Root::read_tree(LPCITEMIDLIST pidl, int scan_flags) +{ + return _entry->read_tree(pidl, _sort_order); +} diff --git a/reactos/base/shell/explorer/shell/entries.h b/reactos/base/shell/explorer/shell/entries.h new file mode 100644 index 00000000000..b0f162e334e --- /dev/null +++ b/reactos/base/shell/explorer/shell/entries.h @@ -0,0 +1,162 @@ +/* + * Copyright 2003, 2004 Martin Fuchs + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + + // + // Explorer clone + // + // entries.h + // + // Martin Fuchs, 23.07.2003 + // + + +enum ENTRY_TYPE { + ET_UNKNOWN, +#ifndef _NO_WIN_FS + ET_WINDOWS, +#endif +#ifdef __WINE__ + ET_UNIX, +#endif + ET_SHELL, + ET_NTOBJS, + ET_REGISTRY, + ET_FAT, + ET_WEB +}; + +enum SORT_ORDER { + SORT_NONE, + SORT_NAME, + SORT_EXT, + SORT_SIZE, + SORT_DATE +}; + +enum SCAN_FLAGS { + SCAN_DONT_EXTRACT_ICONS = 1, + SCAN_DONT_ACCESS = 2, + SCAN_NO_FILESYSTEM = 4 +}; + +#ifndef ATTRIBUTE_SYMBOLIC_LINK +#define ATTRIBUTE_LONGNAME 0x08000000 +#define ATTRIBUTE_VOLNAME 0x10000000 +#define ATTRIBUTE_ERASED 0x20000000 +#define ATTRIBUTE_SYMBOLIC_LINK 0x40000000 +#define ATTRIBUTE_EXECUTABLE 0x80000000 +#endif + +enum ICONCACHE_FLAGS { + ICF_NORMAL = 0, + ICF_MIDDLE = 1, + ICF_LARGE = 2, + ICF_OPEN = 4, + ICF_OVERLAYS = 8, + ICF_HICON = 16, + ICF_SYSCACHE = 32 +}; + +#ifndef SHGFI_ADDOVERLAYS // missing in MinGW (as of 28.12.2005) +#define SHGFI_ADDOVERLAYS 0x000000020 +#endif + + + /// base of all file and directory entries +struct Entry +{ +protected: + Entry(ENTRY_TYPE etype); + Entry(Entry* parent, ENTRY_TYPE etype); + Entry(const Entry&); + +public: + virtual ~Entry(); + + Entry* _next; + Entry* _down; + Entry* _up; + + bool _expanded; + bool _scanned; + int _level; + + WIN32_FIND_DATA _data; + + SFGAOF _shell_attribs; + LPTSTR _display_name; + LPTSTR _type_name; + LPTSTR _content; + + ENTRY_TYPE _etype; + int /*ICON_ID*/ _icon_id; + + BY_HANDLE_FILE_INFORMATION _bhfi; + bool _bhfi_valid; + + void free_subentries(); + + void read_directory_base(SORT_ORDER sortOrder=SORT_NAME, int scan_flags=0); + Entry* read_tree(const void* path, SORT_ORDER sortOrder=SORT_NAME, int scan_flags=0); + void sort_directory(SORT_ORDER sortOrder); + void smart_scan(SORT_ORDER sortOrder=SORT_NAME, int scan_flags=0); + int extract_icon(ICONCACHE_FLAGS flags=ICF_NORMAL); + int safe_extract_icon(ICONCACHE_FLAGS flags=ICF_NORMAL); + + virtual void read_directory(int scan_flags=0) {} + virtual const void* get_next_path_component(const void*) const {return NULL;} + virtual Entry* find_entry(const void*) {return NULL;} + virtual bool get_path(PTSTR path, size_t path_count) const = 0; + virtual ShellPath create_absolute_pidl() const {return (LPCITEMIDLIST)NULL;} + virtual HRESULT GetUIObjectOf(HWND hWnd, REFIID riid, LPVOID* ppvOut); + virtual ShellFolder get_shell_folder() const; + virtual BOOL launch_entry(HWND hwnd, UINT nCmdShow=SW_SHOWNORMAL); + virtual HRESULT do_context_menu(HWND hwnd, const POINT& pos, CtxMenuInterfaces& cm_ifs); + +protected: + bool get_path_base(PTSTR path, size_t path_count, ENTRY_TYPE etype) const; +}; + + + /// base for all directory entries +struct Directory { +protected: + Directory() : _path(NULL) {} + virtual ~Directory() {} + + void* _path; +}; + + + /// root entry for file system trees +struct Root { + Root(); + ~Root(); + + Entry* _entry; + TCHAR _path[MAX_PATH]; + TCHAR _volname[_MAX_FNAME]; + TCHAR _fs[_MAX_DIR]; + DWORD _drive_type; + DWORD _fs_flags; + SORT_ORDER _sort_order; + + Entry* read_tree(LPCTSTR path, int scan_flags=0); + Entry* read_tree(LPCITEMIDLIST pidl, int scan_flags=0); +}; diff --git a/reactos/base/shell/explorer/shell/fatfs.cpp b/reactos/base/shell/explorer/shell/fatfs.cpp new file mode 100644 index 00000000000..8750637df9e --- /dev/null +++ b/reactos/base/shell/explorer/shell/fatfs.cpp @@ -0,0 +1,634 @@ +/* + * Copyright 2004 Martin Fuchs + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + + // + // Explorer clone + // + // fatfs.cpp + // + // Martin Fuchs, 01.02.2004 + // + + +#include + +#include "fatfs.h" + + +static union DEntry* link_dir_entries(struct dirent* dir, struct Kette* K, int cnt) +{ + union DEntry* Ent = (union DEntry*) dir; + struct Kette* L = NULL; + + for(; cnt; cnt--) { + K->Rueck = L; + (L=K)->Ent = Ent; + AddP(K, sizeof(struct Kette)); + L->Vorw = K; + AddP(Ent, sizeof(union DEntry)); + } + + L->Vorw = NULL; + + return Ent; +} + +void FATDirectory::read_directory(int scan_flags) +{ + CONTEXT("FATDirectory::read_directory()"); + + read_dir(); + + union DEntry* p = (union DEntry*) _dir; + int i = 0; + + do { +/* if (!IS_LNAME(p->E.attr) && p->E.name[0]!=FAT_DEL_CHAR) + gesBytes += p->E.size; +*/ + + AddP(p, sizeof(union DEntry)); + } while(++i<_ents && p->E.name[0]); + + _alloc = (struct Kette*) malloc((size_t)((_ents=i)+8)*sizeof(struct Kette)); + if (!_alloc) + return; + + link_dir_entries(_dir, _alloc, i); + + Entry* first_entry = NULL; + int level = _level + 1; + + Entry* last = NULL; + + WIN32_FIND_DATA w32fd; + FAT_attribute attr; + String long_name; + + TCHAR buffer[MAX_PATH]; + + _tcscpy(buffer, (LPCTSTR)_path); + LPTSTR pname = buffer + _tcslen(buffer); + int plen = COUNTOF(buffer) - _tcslen(buffer); + + *pname++ = '\\'; + --plen; + + for(Kette*p=_alloc; p; p=p->Vorw) { + memset(&w32fd, 0, sizeof(WIN32_FIND_DATA)); + + DEntry_E& e = p->Ent->E; + + // get file/directory attributes + attr.b = e.attr; + + if (attr.b & (_A_DELETED | _A_ILLEGAL)) + attr.b |= _A_ILLEGAL; + + const char* s = e.name; + LPTSTR d = w32fd.cFileName; + + if (!IS_LNAME(attr.b) || e.name[0]==FAT_DEL_CHAR) { + if (e.name[0] == FAT_DEL_CHAR) + w32fd.dwFileAttributes |= ATTRIBUTE_ERASED; + else if (IS_LNAME(attr.b)) + w32fd.dwFileAttributes |= ATTRIBUTE_LONGNAME; + else if (attr.a.directory) + w32fd.dwFileAttributes |= FILE_ATTRIBUTE_DIRECTORY; + else if (attr.a.volume) + w32fd.dwFileAttributes |= ATTRIBUTE_VOLNAME; //@@ -> in Volume-Name der Root kopieren + + // get file name + *d++ = *s==FAT_DEL_CHAR? '?': *s; + ++s; + + for(i=0; i<7; ++i) + *d++ = *s++; + + while(d>w32fd.cFileName && d[-1]==' ') + --d; + + *d++ = '.'; + + for(; i<10; ++i) + *d++ = *s++; + + while(d>w32fd.cFileName && d[-1]==' ') + --d; + + if (d>w32fd.cFileName && d[-1]=='.') + --d; + + *d = '\0'; + } else { + // read long file name + TCHAR lname[] = {s[1], s[3], s[5], s[7], s[9], s[14], s[16], s[18], s[20], s[22], s[24], s[28], s[30]}; + + long_name = String(lname, 13) + long_name; + } + + if (!IS_LNAME(attr.b) && !attr.a.volume) { + // get file size + w32fd.nFileSizeLow = e.size; + + // convert date/time attribute into FILETIME + const fdate& date = e.date; + const ftime& time = e.time; + SYSTEMTIME stime; + FILETIME ftime; + + stime.wYear = date.year + 1980; + stime.wMonth = date.month; + stime.wDayOfWeek = (WORD)-1; + stime.wDay = date.day; + stime.wHour = time.hour; + stime.wMinute = time.min; + stime.wSecond = time.sec2 * 2; + stime.wMilliseconds = 0; + + if (SystemTimeToFileTime(&stime, &ftime)) + LocalFileTimeToFileTime(&ftime, &w32fd.ftLastWriteTime); + + if (!(w32fd.dwFileAttributes & ATTRIBUTE_ERASED)) { //@@ + Entry* entry; + + if (w32fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { + _tcscpy_s(pname, plen, w32fd.cFileName); + entry = new FATDirectory(_drive, this, buffer, e.fclus); + } else + entry = new FATEntry(this, e.fclus); + + memcpy(&entry->_data, &w32fd, sizeof(WIN32_FIND_DATA)); + + if (!long_name.empty()) { + entry->_content = _tcsdup(long_name); + long_name.erase(); + } + + if (!first_entry) + first_entry = entry; + + if (last) + last->_next = entry; + + entry->_level = level; + + last = entry; + } + } + } + + if (last) + last->_next = NULL; + + _down = first_entry; + _scanned = true; +} + + +const void* FATDirectory::get_next_path_component(const void* p) const +{ + LPCTSTR s = (LPCTSTR) p; + + while(*s && *s!=TEXT('\\') && *s!=TEXT('/')) + ++s; + + while(*s==TEXT('\\') || *s==TEXT('/')) + ++s; + + if (!*s) + return NULL; + + return s; +} + + +Entry* FATDirectory::find_entry(const void* p) +{ + LPCTSTR name = (LPCTSTR)p; + + for(Entry*entry=_down; entry; entry=entry->_next) { + LPCTSTR p = name; + LPCTSTR q = entry->_data.cFileName; + + do { + if (!*p || *p==TEXT('\\') || *p==TEXT('/')) + return entry; + } while(tolower(*p++) == tolower(*q++)); + + p = name; + q = entry->_data.cAlternateFileName; + + do { + if (!*p || *p==TEXT('\\') || *p==TEXT('/')) + return entry; + } while(tolower(*p++) == tolower(*q++)); + } + + return NULL; +} + + + // get full path of specified directory entry +bool FATEntry::get_path(PTSTR path, size_t path_count) const +{ + return get_path_base ( path, path_count, ET_FAT ); +} + +ShellPath FATEntry::create_absolute_pidl() const +{ + CONTEXT("WinEntry::create_absolute_pidl()"); + + return (LPCITEMIDLIST)NULL; +/* prepend root path if the drive is currently actually mounted in the file system -> return working PIDL + TCHAR path[MAX_PATH]; + + if (get_path(path, COUNTOF(path))) + return ShellPath(path); + + return ShellPath(); +*/ +} + + +FATDirectory::FATDirectory(FATDrive& drive, LPCTSTR root_path) + : FATEntry(), + _drive(drive) +{ + _path = _tcsdup(root_path); + + _secarr = NULL; + _cur_bufs = 0; + _ents = 0; + _dir = NULL; + _cluster = 0; +} + +FATDirectory::FATDirectory(FATDrive& drive, Entry* parent, LPCTSTR path, unsigned cluster) + : FATEntry(parent, cluster), + _drive(drive) +{ + _path = _tcsdup(path); + + _secarr = NULL; + _cur_bufs = 0; + _ents = 0; + _dir = NULL; +} + +FATDirectory::~FATDirectory() +{ + free(_path); + _path = NULL; +} + +bool FATDirectory::read_dir() +{ + int i; + + if (_cluster == 0) { + if (!_drive._boot_sector.SectorsPerFAT) { // FAT32? [boot_sector32->reserved0==0] + BootSector32* boot_sector32 = (BootSector32*) &_drive._boot_sector; + DWORD sect = _drive._boot_sector.ReservedSectors + _drive._boot_sector.NumberFATs*boot_sector32->SectorsPerFAT32; // lese Root-Directory ein + int RootEntries = boot_sector32->RootSectors * 32; //@@ + + _secarr = (struct dirsecz*)malloc(sizeof(DWORD) * (_cur_bufs = (int)((_ents=RootEntries)/_drive._bufents))); + + for(i=0; i<_cur_bufs; i++) + _secarr->s[i] = sect+i; + + _dir = (struct dirent*)malloc((size_t)(_ents+16)*sizeof(union DEntry)); + if (!_dir) + return false; + + if (!(_drive.read_sector(*_secarr->s,(Buffer*)_dir,_cur_bufs))) + return false; + } else { + DWORD sect = _drive._boot_sector.ReservedSectors + _drive._boot_sector.NumberFATs*_drive._boot_sector.SectorsPerFAT; // read in root directory + + _secarr = (struct dirsecz*)malloc(sizeof(DWORD) * (_cur_bufs = (int)((_ents=_drive._boot_sector.RootEntries)/_drive._bufents))); + + for(i=0; i<_cur_bufs; i++) + _secarr->s[i] = sect+i; + + _dir = (struct dirent*)malloc((size_t)(_ents+16)*sizeof(union DEntry)); + if (!_dir) + return false; + + if (!_drive.read_sector(*_secarr->s,(Buffer*)_dir,_cur_bufs)) + return false; + } + } else { + Buffer* buf; + bool ok; + + DWORD h = _cluster; + + _cur_bufs = 0; + + do { + h = _drive.read_FAT(h, ok); + + if (!ok) + return false; + + _cur_bufs++; + } while (h<0x0ffffff0 && h); + + _secarr = (struct dirsecz*) malloc(sizeof(DWORD) * _cur_bufs); + + if (!_secarr) + return false; + + _ents = _drive._bufents * (size_t)_cur_bufs * _drive._SClus; + + if ((buf=(Buffer*)(_dir=(struct dirent*)malloc((size_t) (_ents+16)*sizeof(union DEntry)))) == NULL) + return false; + + h = _cluster; + + DWORD fdatsec; + + if (!_drive._boot_sector.SectorsPerFAT) { // FAT32 ? + BootSector32* boot_sector32 = (BootSector32*) &_drive._boot_sector; + //int RootEntries = boot_sector32->RootSectors * 32; //@@ + //fdatsec = _drive._boot_sector.ReservedSectors + _drive._boot_sector.NumberFATs*boot_sector32->SectorsPerFAT32 + RootEntries*sizeof(DEntry)/_drive._boot_sector.BytesPerSector; // dpb.fdirsec + fdatsec = _drive._boot_sector.ReservedSectors + + _drive._boot_sector.NumberFATs*boot_sector32->SectorsPerFAT32 + boot_sector32->RootSectors; + } else + fdatsec = _drive._boot_sector.ReservedSectors + + _drive._boot_sector.NumberFATs*_drive._boot_sector.SectorsPerFAT + + _drive._boot_sector.RootEntries*sizeof(DEntry)/_drive._boot_sector.BytesPerSector; // dpb.fdirsec + + for(i=0; i<_cur_bufs; i++) { + _secarr->s[i] = fdatsec + (DWORD)_drive._SClus*(h-2); + + h = _drive.read_FAT(h, ok); + + if (!ok) + return false; + } + + for(i=0; i<_cur_bufs; i++) { + if ((ok = (_drive.read_sector(_secarr->s[i], buf, _drive._SClus))) == true) + AddP(buf, _drive._bufl*_drive._SClus) + else { + //@@FPara = _secarr->s[i]; + return false; + } + } + + buf->dat[0] = 0; // Endekennzeichen für Rekurs setzen + } + + return true; +} + + +#ifdef _MSC_VER +#pragma warning(disable: 4355) +#endif + +FATDrive::FATDrive(LPCTSTR path) + : FATDirectory(*this, TEXT("\\")) +{ + _bufl = 0; + _bufents = 0; + _SClus = 0; + _FATCache = NULL; + _CacheCount = 0; + _CacheSec = NULL; + _CacheCnt = NULL; + _CacheDty = NULL; + _Caches = 0; + + _hDrive = CreateFile(path, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, 0); + + if (_hDrive != INVALID_HANDLE_VALUE) { + _boot_sector.BytesPerSector = 512; + + if (read_sector(0, (Buffer*)&_boot_sector, 1)) { + _bufl = _boot_sector.BytesPerSector; + _SClus = _boot_sector.SectorsPerCluster; + _bufents = _bufl / sizeof(union DEntry); + } + + small_cache(); + } +} + +FATDrive::~FATDrive() +{ + if (_hDrive != INVALID_HANDLE_VALUE) + CloseHandle(_hDrive); + + free(_path); + _path = NULL; +} + +void FATDrive::small_cache() +{ + if (_FATCache) + free(_FATCache); + + if (_CacheSec) { + free(_CacheSec), _CacheSec = NULL; + free(_CacheCnt); + free(_CacheDty); + } + + _Caches = CACHE_SIZE_LOW; + _FATCache = (struct Cache *) malloc((_Caches+1) * _drive._bufl); + + reset_cache(); +} + +void FATDrive::reset_cache() // mark cache as empty +{ + int i; + + if (!_CacheSec) { + _CacheSec = (DWORD*) malloc(_Caches * sizeof(DWORD)); + _CacheCnt = (int*) malloc(_Caches * sizeof(int)); + _CacheDty = (bool*) malloc(_Caches * sizeof(bool)); + } else { + _CacheSec = (DWORD*) realloc(_CacheSec, _Caches * sizeof(DWORD)); + _CacheCnt = (int*) realloc(_CacheCnt, _Caches * sizeof(int)); + _CacheDty = (bool*) realloc(_CacheDty, _Caches * sizeof(bool)); + } + + for(i=0; i<_Caches; i++) + _CacheSec[i] = 0; + + _read_ahead = (_Caches+1) / 2; +} + +bool FATDrive::read_sector(DWORD sec, Buffer* buf, int len) +{ + sec += 63; //@@ jump to first partition + + if (SetFilePointer(_hDrive, sec*_drive._boot_sector.BytesPerSector, 0, 0) == INVALID_SET_FILE_POINTER) + return false; + + DWORD read; + + if (!ReadFile(_hDrive, buf, len*_drive._boot_sector.BytesPerSector, &read, 0)) + return false; + + return true; +} + +DWORD FATDrive::read_FAT(DWORD cluster, bool& ok) //@@ use exception handling +{ + DWORD nClus; + Buffer* FATBuf; + + DWORD nclus = (_boot_sector.Sectors32? _boot_sector.Sectors32: _boot_sector.Sectors16) / _boot_sector.SectorsPerCluster; ///@todo cache result + + if (cluster > nclus) { + ok = false; + return (DWORD)-1; + } + + if (nclus >= 65536) { // FAT32 + DWORD FATsec = cluster / (_boot_sector.BytesPerSector/4); + DWORD z = (cluster - _boot_sector.BytesPerSector/4 * FATsec)*4; + FATsec += _boot_sector.ReservedSectors; + if (!read_cache(FATsec, &FATBuf)) + ok = false; + nClus = dpeek(&FATBuf->dat[z]); + } else if (nclus >= 4096) { // 16 Bit-FAT + DWORD FATsec = cluster / (_boot_sector.BytesPerSector/2); + DWORD z = (cluster - _boot_sector.BytesPerSector/2 * FATsec)*2; + FATsec += _boot_sector.ReservedSectors; + if (!read_cache(FATsec, &FATBuf)) + ok = false; + nClus = wpeek(&FATBuf->dat[z]); + + if (nClus >= 0xfff0) + nClus |= 0x0fff0000; + } else { // 12 Bit-FAT + DWORD FATsec = cluster*3 / (_boot_sector.BytesPerSector*2); + DWORD z = (cluster*3 - _boot_sector.BytesPerSector*2*FATsec)/2; + FATsec += _boot_sector.ReservedSectors; + if (!read_cache(FATsec,&FATBuf)) + ok = false; + BYTE a = FATBuf->dat[z++]; + + if (z >= _boot_sector.BytesPerSector) + if (!read_cache(FATsec+1,&FATBuf)) + ok = false; + z = 0; + + BYTE b = FATBuf->dat[z]; + + if (cluster & 1) + nClus = (a>>4) | (b<<4); + else + nClus = a | ((b & 0xf)<<8); + + if (nClus >= 0xff0) + nClus |= 0x0ffff000; + } + + return nClus; +} + +bool FATDrive::read_cache(DWORD sec, Buffer** bufptr) +{ + int i, C, anz; + + if (_boot_sector.BytesPerSector != BufLen) // no standard sector size? + return read_sector(sec, *bufptr=(Buffer*)&_FATCache[0], 1); + + _CacheCount++; + + for(i=0; _CacheSec[i]!=sec && i<_Caches; ) + ++i; + + if (i < _Caches) + { + *bufptr = (Buffer*) &_FATCache[i]; // FAT-Sektor schon gepuffert + _CacheCnt[i]++; + return true; + } + + i = get_cache_buffer(); + + if (_cache_empty) // von get_cache_buffer() gesetzt + { + C = _CacheCount-1; + anz = _boot_sector.SectorsPerFAT*_boot_sector.NumberFATs - sec; + + if (anz > _read_ahead) + anz = _read_ahead; + + for(i=0; i