#define UNICODE #include #include #include #include #include #include #include #include #include #include "fs.h" #include "fsp.h" #include "fsutil.h" #include "pipe.h" #define DUMB_CLIENT #define QFS_DO_NOT_UNMAP_WIN32 #include "..\..\..\service\inc\qfs.h" #include "..\..\..\service\init\qfs.c" char msg[] = "Gorik\n"; char buf[1024]; void Dir(LPCWSTR path) { WIN32_FIND_DATA data; QfsHANDLE hdl = QfsFindFirstFile(path, &data); if (!QfsIsHandleValid(hdl)) { printf("Failed to open %ws, error %d\n", path, GetLastError()); } else { printf(" Directory of %ws\n", path); printf(" %ws\n", data.cFileName); while (QfsFindNextFile(hdl, &data)) { printf(" %ws\n", data.cFileName); } if (GetLastError() != ERROR_NO_MORE_FILES) { printf("Strange error returned %d\n", GetLastError()); } QfsFindClose(hdl); } } //#define PREFIX L"\\\\GORN$QFS\\ROOT\\" //#define PREFIX L"\\\\qfs\\root$\\" //#define PREFIX L"\\\\c67c3538-5167-4\\c67c3538-5167-40f0-a1dd-83f8bf41c932$\\" // \\?\UNC\ // #define PREFIX L"\\\\?\\UNC\\c67c3538-5167-4\\c67c3538-5167-40f0-a1dd-83f8bf41c932$\\" //#define PREFIX L"z:\\" // // OPEN_EXISTING, // OPEN_ALWAYS, // #define CREATE_NEW 1 // #define CREATE_ALWAYS 2 // #define OPEN_EXISTING 3 // #define OPEN_ALWAYS 4 // #define TRUNCATE_EXISTING 5 char* dispName[] = {"0 disp", "CREATE_NEW", "CREATE_ALWAYS", "OPEN_EXISTING", "OPEN_ALWAYS", "TRUNCATE_EXISTING" }; //#define FNAME PREFIX L"GOR.txt" #define FNAME L"C:\\GOR.txt" void cf(LPCWSTR Name, DWORD disp, DWORD hardError, DWORD softError) { QfsHANDLE Handle; char buf[128]; DWORD Status; BOOL good; Handle = QfsCreateFile(Name, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, // 0, NULL, disp, // FILE_FLAG_WRITE_THROUGH | FILE_FLAG_NO_BUFFERING | FILE_FLAG_OVERLAPPED, // FILE_FLAG_WRITE_THROUGH | FILE_FLAG_OVERLAPPED, 0, NULL); Status = GetLastError(); if (hardError == 0) { good = QfsIsHandleValid(Handle) && softError == Status; sprintf(buf, "should succeed with gle = %d", softError); } else { good = !QfsIsHandleValid(Handle) && hardError == Status; sprintf(buf, "should fail, status %d", hardError); } printf("%s %s handle %x gle %d (%s)\n", good?"":"****", dispName[disp], Handle, GetLastError(), buf); QfsCloseHandleIfValid(Handle); } DWORD cat(LPCWSTR Name) { PCHAR buf[1024]; DWORD dwBytes; QfsHANDLE hFile = QfsCreateFile(Name, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); if (!QfsIsHandleValid(hFile)) { return FALSE; } while (QfsReadFile(hFile, buf, sizeof(buf), &dwBytes, NULL) && dwBytes) { printf("%.*s", dwBytes, buf); } printf("\n"); QfsCloseHandle(hFile); return TRUE; } void MiniShell() { DWORD len; DWORD err; WCHAR TempDir[1024]; WCHAR HomeDir[1024]; WCHAR CurrentDir[1024]; WCHAR cmd[1024]; QfsLogLevel = 1; len = GetCurrentDirectory(1024, CurrentDir); if (len == 1024 || len == 0) { printf("GetCurrentDir failed, error %d\n", GetLastError()); return; } printf("Quorum Minishell\n(C) Copyright 1985-2001 Microsoft Corp.\n\n"); wcscpy(HomeDir, CurrentDir); for(;;) { printf("%ws>", CurrentDir); if ((_getws(cmd) == NULL) || wcscmp(cmd, L"exit")==0) { break; } if (cmd[0] == 0) continue; if (wcsncmp(cmd, L"cd",2) == 0) { if (cmd[2] == 0) { wcscpy(CurrentDir, HomeDir); continue; } if (cmd[2] != ' ') { goto invalid_command; } if (cmd[3] == '.') { if (cmd[4] == '.') { WCHAR* p = wcsrchr(CurrentDir, '\\'); if (p) *p = 0; } continue; } if (cmd[3] == '\\' || cmd[4] == ':') { wcscpy(CurrentDir, cmd+3); } else { wcscat(CurrentDir, cmd+3); } len = wcslen(CurrentDir); if (len > 0 && CurrentDir[len-1] == '\\') { CurrentDir[len-1] = 0; } continue; } if (wcscmp(cmd, L"dir")==0) { wcscpy(TempDir, CurrentDir); wcscat(TempDir, L"\\*"); Dir(TempDir); continue; } if (wcsncmp(cmd, L"mkdir ", 6)==0) { err = QfsCreateDirectory(cmd + 6, NULL); } else if (wcsncmp(cmd, L"rmdir ", 6) == 0) { err = QfsRemoveDirectory(cmd + 6); } else if (wcsncmp(cmd, L"del ", 4) == 0) { err = QfsDeleteFile(cmd + 4); } else if (wcsncmp(cmd, L"cat ", 4) == 0) { wcscpy(TempDir, CurrentDir); wcscat(TempDir, L"\\"); wcscat(TempDir, cmd + 4); err = cat(TempDir); } continue; invalid_command: printf(" Invalid command \"%ws\"\n", cmd); } printf("Bye\n\n"); } _cdecl main() { MiniShell(); #if 0 QfsHANDLE Handle; DWORD dwSize; DWORD status; int i; // CREATE_NEW Creates a new file. The function fails if the specified file already exists. // CREATE_ALWAYS Creates a new file. If the file exists, the function overwrites the file and clears the existing attributes. // OPEN_EXISTING Opens the file. The function fails if the file does not exist. // OPEN_ALWAYS Opens the file, if it exists. If the file does not exist, the function creates the file as if dwCreationDisposition were CREATE_NEW. // TRUNCATE_EXISTING QfsDeleteFile(FNAME); cf(FNAME, CREATE_NEW, 0,0); cf(FNAME, CREATE_NEW, 80,80); QfsDeleteFile(FNAME); cf(FNAME, CREATE_ALWAYS, 0,0); cf(FNAME, CREATE_ALWAYS, 0,183); cf(FNAME, OPEN_EXISTING, 0,0); QfsDeleteFile(FNAME); cf(FNAME, OPEN_EXISTING, 2,2); QfsDeleteFile(FNAME); cf(FNAME, OPEN_ALWAYS, 0,0); cf(FNAME, OPEN_ALWAYS, 0,183); cf(FNAME, TRUNCATE_EXISTING, 0,0); QfsDeleteFile(FNAME); cf(FNAME, TRUNCATE_EXISTING, 2,2); return 0; QfsDeleteFile(PREFIX L"gor.txt"); for(i = 0; i < 2; ++i) { status = QfsCreateFile(&Handle, PREFIX L"gor.txt", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, // 0, NULL, OPEN_ALWAYS, // FILE_FLAG_WRITE_THROUGH | FILE_FLAG_NO_BUFFERING | FILE_FLAG_OVERLAPPED, // FILE_FLAG_WRITE_THROUGH | FILE_FLAG_OVERLAPPED, 0, NULL); printf("handle %x gle %d\n", Handle, status); QfsCloseHandleIfValid(Handle); } #endif // Dir(PREFIX L"\\*"); #if 0 #if 0 status = QfsCreateFile( &Handle, L"zTest2.txt", GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, 0, NULL); QfsWriteFile( Handle, msg, sizeof(msg), &dwSize, NULL); QfsFlushFileBuffers(Handle); QfsCloseHandle(Handle); #endif status = QfsCreateFile( &Handle, PREFIX L"zTest.txt", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); if (status == ERROR_SUCCESS) { dwSize = QfsGetFileSize(Handle, NULL); #if 1 dwSize = 0; QfsReadFile( Handle, buf, sizeof(buf), &dwSize, NULL); printf("read => %d bytes, %s\n", dwSize, buf); #endif QfsSetEndOfFile(Handle, dwSize + 2); QfsCloseHandle(Handle); } QfsSetFileAttributes(PREFIX L"zTest.txt", FILE_ATTRIBUTE_NORMAL); QfsCopyFile(PREFIX L"zTest.txt", PREFIX L"A.txt", FALSE); #endif // QfsCopyFile(PREFIX L"A.txt", PREFIX L"B.txt", FALSE); #if 0 QfsDeleteFile(L"zTest2.txt"); QfsDeleteFile(L"zbuild.log"); Dir(L"z\\*"); Dir(L"z\\*.tx?"); Dir(L"z\\1st\\*"); QfsCreateDirectory(L"z1st", NULL); Dir(L"z\\1st\\*"); #endif #if 0 { ULARGE_INTEGER FreeBytesAvailable; // bytes available to caller ULARGE_INTEGER TotalNumberOfBytes; // bytes on disk ULARGE_INTEGER TotalNumberOfFreeBytes; // free bytes on disk if (QfsGetDiskFreeSpaceEx(L"z.", &FreeBytesAvailable, &TotalNumberOfBytes, &TotalNumberOfFreeBytes)) { printf("av %u total %u free %u\n", FreeBytesAvailable.LowPart, TotalNumberOfBytes.LowPart, TotalNumberOfFreeBytes.LowPart); } if (QfsGetDiskFreeSpaceEx(L"C:\\drop\\test\\root", &FreeBytesAvailable, &TotalNumberOfBytes, &TotalNumberOfFreeBytes)) { printf("av %u total %u free %u\n", FreeBytesAvailable.LowPart, TotalNumberOfBytes.LowPart, TotalNumberOfFreeBytes.LowPart); } // if (QfsGetDiskFreeSpaceEx(PREFIX L".", &FreeBytesAvailable, &TotalNumberOfBytes, &TotalNumberOfFreeBytes)) { // printf("av %u total %u free %u\n", FreeBytesAvailable.LowPart, TotalNumberOfBytes.LowPart, TotalNumberOfFreeBytes.LowPart); // } } #endif }