int ParseArgs(int nArgc, char *ppArgv[], CommandArgs *pArgs) { char c; ArgsStream stream; memset(pArgs, 0, sizeof(CommandArgs)); stream.Initialize(nArgc, ppArgv); // GetCygpath(); while ((c = stream.PeekChar()) != 0) { if (IsCommandSwitch(c)) { stream.GetChar(); // skip switch char: '-' switch (c = stream.GetChar()) { case 'o': if (pArgs->dwAttribs & Command_o_GenLBO) { CmdError(CommandError_DupSwitch, c); return CommandError_DupSwitch; } pArgs->dwAttribs |= Command_o_GenLBO; if (!IsCommandSwitch(stream.PeekChar())) { GetFileName(&stream, ".lbo", pArgs, &pArgs->pszLBO); } break; case 'u': pArgs->dwAttribs |= Command_u_ListUserFuncs; break; case 'p': pArgs->dwAttribs |= Command_p_Preview; break; case 'I': // if(HasCygpath()){ // pArgs->pszSourcePath = Turn2WinPath(stream.GetWord()); // } else { pArgs->pszSourcePath = stream.GetWord(); // } if (!pArgs->pszSourcePath) { CmdError(CommandError_NoPathStr, c); return CommandError_NoPathStr; } break; case '?': fputs(c_pszCopyright, stdout); fputs(c_pszUsage, stdout); exit(0); default: CmdError(CommandError_UnknownArg, c); return CommandError_UnknownArg; } } else { if (pArgs->pszSource) { CmdError(CommandError_DupSource, c); return CommandError_DupSource; } // if(HasCygpath()){ // pArgs->pszSource = Turn2WinPath(stream.GetWord()); // } else { pArgs->pszSource = stream.GetWord(); // } } } if (pArgs->dwAttribs & Command_u_ListUserFuncs) { ListAllUserFuncs(); if (!pArgs->pszSource) exit(0); } if (!pArgs->pszSource) { CmdError(CommandError_NoSource, c); return CommandError_NoSource; } if ((pArgs->dwAttribs & Command_o_GenLBO) && NULL == pArgs->pszLBO) { pArgs->pszLBO = GenFileName(pArgs->pszSource, ".lbo"); if (NULL == pArgs->pszLBO) { CmdError(CommandError_OutOfMemory, 0); return CommandError_OutOfMemory; } } return 0; }
int ParseArgs(int nArgc, char *ppArgv[], CommandArgs *pArgs) { char c; ArgsStream stream; BOOL bCharSkipped; memset(pArgs, 0, sizeof(CommandArgs)); stream.Initialize(nArgc, ppArgv); if (stream.PeekChar() == 0) { fputs(c_pszCopyright, stdout); fputs(c_pszUsage, stdout); exit(0); } while ((c = stream.PeekChar()) != 0) { if (IsCommandSwitch(c)) { stream.GetChar(); // skip switch char: '-' bCharSkipped = FALSE; c = stream.PeekChar(); if (IsCommandSwitch(c)) { // another '-' stream.GetChar(); // skip switch char: '-' c = stream.PeekChar(); } switch (c) { case 'o': // output stream.GetWord(); // skip char "c" or the rest of "output" bCharSkipped = TRUE; pArgs->pszOutputFile = stream.GetWord(); if (!pArgs->pszOutputFile) { CmdError(CommandError_NoPathStr, c); return CommandError_NoPathStr; } break; case 'i': // interface pArgs->dwAttribs |= Command_r_Interface; break; case 'c': if (stream.PeekCharAt(2) == 'a') { // callback pArgs->dwAttribs |= Command_r_Callback; } else if (stream.PeekCharAt(2) == 'o') { // const pArgs->dwAttribs |= Command_r_Const; } else { pArgs->dwAttribs |= Command_r_Class; } break; case 'b': pArgs->dwAttribs |= Command_r_BaseClass; break; case 'a': if (stream.PeekCharAt(2) == 'l') { // all pArgs->dwAttribs |= Command_r_All; } else { // aspect pArgs->dwAttribs |= Command_r_Aspect; } break; case 'g': // generic pArgs->dwAttribs |= Command_r_Generic; break; case 'h': if (stream.PeekCharAt(2) == 'e') { // help fputs(c_pszCopyright, stdout); fputs(c_pszUsage, stdout); exit(0); } else { // callback handler pArgs->dwAttribs |= Command_r_Callback; } break; case 'n': pArgs->dwAttribs |= Command_r_Const; break; case 'e': // enum pArgs->dwAttribs |= Command_r_Enum; break; case 'r': // regime pArgs->dwAttribs |= Command_r_Regime; break; case 's': // struct pArgs->dwAttribs |= Command_r_Struct; break; case 'm': // method pArgs->dwAttribs |= Command_r_Method; break; case 'f': pArgs->dwAttribs |= Command_r_ForceOverride; break; case '?': fputs(c_pszCopyright, stdout); fputs(c_pszUsage, stdout); exit(0); default: CmdError(CommandError_UnknownArg, c); return CommandError_UnknownArg; } if (!bCharSkipped) { stream.GetWord(); //skip the char and the rest } } else { pArgs->pszInputFile = stream.GetWord(); } } if (!pArgs->pszInputFile) { CmdError(CommandError_NoSource, c); return CommandError_NoSource; } return 0; }
int ParseArgs(int nArgc, char *ppArgv[], CommandArgs *pArgs) { char c; ArgsStream stream; char *pszStr; memset(pArgs, 0, sizeof(CommandArgs)); stream.Initialize(nArgc, ppArgv); #ifdef _win32 GetCygpath(); #endif while ((c = stream.PeekChar()) != 0) { if (IsCommandSwitch(c)) { stream.GetChar(); // skip switch char: '-' switch (c = stream.GetChar()) { case 'B': #ifdef _win32 if(HasCygpath()){ pArgs->pszInputLBO = Turn2WinPath(stream.GetWord()); } else { #endif pArgs->pszInputLBO = stream.GetWord(); #ifdef _win32 } #endif if (!pArgs->pszInputLBO) { CmdError(CommandError_NoFile, c); return CommandError_NoFile; } break; case 'C': pszStr = stream.GetWord(); if (!pszStr) { CmdError(CommandError_NoFile, c); return CommandError_NoFile; } if (ContainsSemicolon(pszStr)) { CmdError(CommandError_InvalidSemicolon, c); return CommandError_InvalidSemicolon; } ConcatCommasStr(&(pArgs->pszInputCLS), pszStr); break; case 'e': pArgs->mAttribs |= Command_e_NoElastos; break; case 'k': pArgs->mAttribs |= Command_k_InKernel; break; case 's': pArgs->mAttribs |= Command_k_InSDK; break; case 'T': pszStr = stream.GetWord(); if (strcmp(pszStr, "foreground") == 0) { pArgs->mAttribs |= Command_r_Foreground; } if (!pszStr) { CmdError(CommandError_NoTemplate, c); return CommandError_NoTemplate; } if (ContainsSemicolon(pszStr)) { CmdError(CommandError_InvalidSemicolon, c); return CommandError_InvalidSemicolon; } ConcatCommasStr(&(pArgs->pszTemplates), pszStr); break; case 'I': pszStr = stream.GetWord(); if (!pszStr) { CmdError(CommandError_NoPathStr, c); return CommandError_NoPathStr; } if (ContainsSemicolon(pszStr)) { CmdError(CommandError_InvalidSemicolon, c); return CommandError_InvalidSemicolon; } #ifdef _win32 if(HasCygpath()){ pszStr = Turn2WinPath(pszStr); } #endif ConcatCommasStr(&(pArgs->pszInputPath), pszStr); #ifdef _win32 if(HasCygpath()){ delete pszStr; } #endif break; case 'p': #ifdef _win32 if(HasCygpath()){ pArgs->pszOutputPath = Turn2WinPath(stream.GetWord()); } else { #endif pArgs->pszOutputPath = stream.GetWord(); #ifdef _win32 } #endif if (!pArgs->pszOutputPath) { CmdError(CommandError_NoPathStr, c); return CommandError_NoPathStr; } break; case 'o': pArgs->pszOutputFile = stream.GetWord(); if (!pArgs->pszOutputFile) { CmdError(CommandError_NoPathStr, c); return CommandError_NoPathStr; } break; case 'l': pArgs->mAttribs |= Command_l_ListTemplates; break; case 'f': pArgs->mAttribs |= Command_r_Overwrite; break; case 'v': pArgs->mAttribs |= Command_r_Redirect; break; case 'z': pArgs->mAttribs |= Command_z_UseCustomClassObject; break; case 'w': pArgs->mAttribs |= Command_w_HaveSandwichMethod; break; case 'n': pArgs->mAttribs |= Command_n_UseNakedMode; break; case 'u': pArgs->mAttribs |= Command_u_WeakRef; break; case '?': fputs(c_pszCopyright, stdout); fputs(c_pszUsage, stdout); exit(0); default: CmdError(CommandError_UnknownArg, c); return CommandError_UnknownArg; } } else { CmdError(CommandError_UnknownArg, c); return CommandError_UnknownArg; } } if (!(pArgs->mAttribs & Command_l_ListTemplates) && (!pArgs->pszTemplates || !pArgs->pszInputCLS)) { CmdError(CommandError_NoSource, c); return CommandError_NoSource; } return 0; }
int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE, LPTSTR, int) { TFileTestData * pData; DWORD dwDesiredAccess = GENERIC_READ; DWORD dwShareAccess = FILE_SHARE_READ; DWORD dwCopyFileFlags = 0; DWORD dwMoveFileFlags = 0; bool bAsynchronousOpen = false; int nFileNameIndex = 0; // Save the instance g_hInst = hInstance; g_hHeap = GetProcessHeap(); InitCommonControls(); // Get the Windows version g_dwWinVer = GetWindowsVersion(); // Allocate and fill our working structure with command line parameters pData = (TFileTestData *)HeapAlloc(g_hHeap, HEAP_ZERO_MEMORY, sizeof(TFileTestData)); // Parse command line arguments for(int i = 1; i < __argc; i++) { // If the argument a file name? if(!IsCommandSwitch(__targv[i])) { switch(nFileNameIndex) { case 0: // The first file name argument StringCchCopy(pData->szFileName1, _countof(pData->szFileName1), __targv[i]); nFileNameIndex++; break; case 1: // The second file name argument StringCchCopy(pData->szFileName2, _countof(pData->szFileName2), __targv[i]); nFileNameIndex++; break; case 2: // The directory file name argument StringCchCopy(pData->szDirName, _countof(pData->szFileName2), __targv[i]); nFileNameIndex++; break; } } else { LPCTSTR szArg = __targv[i] + 1; // Check for default read+write access if(!_tcsnicmp(szArg, _T("DesiredAccess:"), 14)) Text2Hex32(szArg+14, &dwDesiredAccess); // Check for default share read+write if(!_tcsnicmp(szArg, _T("ShareAccess:"), 12)) Text2Hex32(szArg+12, &dwShareAccess); if(!_tcsnicmp(szArg, _T("CopyFileFlags:"), 14)) Text2Hex32(szArg+14, &dwCopyFileFlags); if(!_tcsnicmp(szArg, _T("MoveFileFlags:"), 14)) Text2Hex32(szArg+14, &dwMoveFileFlags); // Check for asynchronous open if(!_tcsnicmp(szArg, _T("AsyncOpen:"), 10)) Text2Bool(szArg+10, &bAsynchronousOpen); } } // Set default file name if(pData->szFileName1[0] == 0) StringCchCopy(pData->szFileName1, _countof(pData->szFileName1), _T("C:\\TestFile.bin")); // // DEVELOPMENT CODE: Build the NT status table from the NTSTATUS.h // // BuildNtStatusTableFromNTSTATUS_H(); // VerifyNtStatusTable(); // // Resolve the dynamic loaded APIs // ResolveDynamicLoadedAPIs(); // // On Vista or newer, set the required integrity level of our token object // to lowest possible value. This will allow us to open our token even if the user // lowers the integrity level. // SetTokenObjectIntegrityLevel(SECURITY_MANDATORY_UNTRUSTED_RID); // // Save the application initial directory // GetCurrentDirectory(_maxchars(g_szInitialDirectory), g_szInitialDirectory); // // Register the data editor window // RegisterDataEditor(hInstance); // // To make handles obtained by NtCreateFile usable for calling ReadFile and WriteFile, // we have to set the FILE_SYNCHRONOUS_IO_NONALERT into CreateOptions // and SYNCHRONIZE into DesiredAccess. // // Allocate default size for the FileInfo. pData->pbNtInfoBuff = (LPBYTE)HeapAlloc(g_hHeap, HEAP_ZERO_MEMORY, INITIAL_FILEINFO_BUFFER_SIZE); pData->cbNtInfoBuff = INITIAL_FILEINFO_BUFFER_SIZE; // Set default values for opening relative file by NtOpenFile pData->dwDesiredAccessRF = FILE_READ_DATA; pData->dwOpenOptionsRF = 0; pData->dwShareAccessRF = FILE_SHARE_READ | FILE_SHARE_WRITE; // Set default values for CreateFile and NtCreateFile pData->dwCreateDisposition1 = OPEN_ALWAYS; pData->dwCreateDisposition2 = FILE_OPEN_IF; pData->dwDesiredAccess = dwDesiredAccess; pData->dwFileAttributes = FILE_ATTRIBUTE_NORMAL; pData->dwShareAccess = dwShareAccess; pData->dwCreateOptions = 0; pData->dwObjAttrFlags = OBJ_CASE_INSENSITIVE; pData->dwMoveFileFlags = MOVEFILE_COPY_ALLOWED; pData->dwOplockLevel = OPLOCK_LEVEL_CACHE_READ | OPLOCK_LEVEL_CACHE_WRITE; pData->dwCopyFileFlags = dwCopyFileFlags; pData->dwMoveFileFlags = dwMoveFileFlags; // Modify for synchronous open, if required if(bAsynchronousOpen == false) { pData->dwCreateOptions |= FILE_SYNCHRONOUS_IO_NONALERT; pData->dwDesiredAccess |= SYNCHRONIZE; } // Set default values for NtCreateSection/NtOpenSection pData->dwSectDesiredAccess = SECTION_MAP_READ; pData->dwSectPageProtection = PAGE_READONLY; pData->dwSectAllocAttributes = SEC_COMMIT; pData->dwSectWin32Protect = PAGE_READONLY; // Call the dialog FileTestDialog(NULL, pData); // Cleanup the TFileTestData structure and exit if(pData->pFileEa != NULL) delete [] pData->pFileEa; if(pData->pbFileData != NULL) VirtualFree(pData->pbFileData, pData->cbFileDataMax, MEM_RELEASE); if(pData->pbNtInfoBuff != NULL) HeapFree(g_hHeap, 0, pData->pbNtInfoBuff); HeapFree(g_hHeap, 0, pData); UnloadDynamicLoadedAPIs(); return 0; }