ua.exe使用方法:
1、将UMDH生成的logcompare.txt改名为1.txt,内容示例:
1 // Debug library initialized ... 2 DBGHELP: moxia_d - private symbols & lines 3 E:\p06\run_client\Bin\moxia_d.pdb 4 DBGHELP: ntdll - export symbols 5 DBGHELP: kernel32 - export symbols 6 DBGHELP: KERNELBASE - export symbols 7 DBGHELP: dbghelp - public symbols 8 D:\Symbols\dbghelp.pdb\4BC9BC6DED254508BF3551E750E992643\dbghelp.pdb 9 DBGHELP: msvcrt - public symbols 10 D:\Symbols\msvcrt.pdb\F1D253F9555C46DF8076400A52B3A9292\msvcrt.pdb 11 DBGHELP: ADVAPI32 - export symbols 12 DBGHELP: sechost - public symbols 13 D:\Symbols\sechost.pdb\7AF14D02D41E4CD6942745FE0E6372B11\sechost.pdb 14 DBGHELP: RPCRT4 - export symbols 15 DBGHELP: WINMM - public symbols 16 D:\Symbols\winmm.pdb\7AFD98FCAAD34F6B8B31A4667C4E2BFC2\winmm.pdb 17 DBGHELP: USER32 - public symbols 18 D:\Symbols\user32.pdb\DD74D86F12624845A42A6A5BAAB4D7A82\user32.pdb 19 DBGHELP: GDI32 - export symbols 20 DBGHELP: LPK - export symbols 21 DBGHELP: USP10 - export symbols 22 DBGHELP: PSAPI - public symbols 23 D:\Symbols\psapi.pdb\A895A052F325481B9E2DA00A29E8D5DF2\psapi.pdb 24 DBGHELP: wke - private symbols & lines 25 E:\p06\run_client\Bin\wke.pdb 26 DBGHELP: ole32 - private symbols & lines 27 D:\Symbols\ole32.pdb\5061F11A9A57433595EA5EA75A156F4B2\ole32.pdb 28 DBGHELP: iphlpapi - public symbols 29 D:\Symbols\iphlpapi.pdb\F162D2E137ED42978BF38C99AEE2DAAB2\iphlpapi.pdb 30 DBGHELP: NSI - public symbols 31 D:\Symbols\nsi.pdb\D15A81679FAE4A7392344B6FD26867942\nsi.pdb 32 DBGHELP: WINNSI - public symbols 33 D:\Symbols\winnsi.pdb\F7A0C25B1B0E4FA6876494D3F6BFD1012\winnsi.pdb 34 DBGHELP: WS2_32 - public symbols 35 D:\Symbols\ws2_32.pdb\18C960B958404C4F80F686EE978A33D42\ws2_32.pdb 36 DBGHELP: SHELL32 - export symbols 37 DBGHELP: SHLWAPI - public symbols 38 D:\Symbols\shlwapi.pdb\E128B1CEE2EB438C8646E6967118F33E2\shlwapi.pdb 39 DBGHELP: VERSION - public symbols 40 D:\Symbols\version.pdb\52234E5C7EC44646B62D56357B2C94872\version.pdb 41 DBGHELP: MSIMG32 - public symbols 42 D:\Symbols\msimg32.pdb\13C89B70614E4E7FB1C677D443D15D182\msimg32.pdb 43 DBGHELP: ijl15 - export symbols 44 DBGHELP: MFC80D - private symbols & lines 45 D:\Symbols\MFC80D.i386.pdb\86AA8DF59ABF432D8650175ACAE12170e\MFC80D.i386.pdb 46 DBGHELP: MSVCR80D - private symbols & lines 47 D:\Symbols\msvcr80d.i386.pdb\5B7548CDAC834BBCB4600BC0177659C61\msvcr80d.i386.pdb 48 DBGHELP: COMCTL32 - export symbols 49 DBGHELP: OLEAUT32 - public symbols 50 D:\Symbols\oleaut32.pdb\68047829A4754E789AC1C8035BA168CD2\oleaut32.pdb 51 DBGHELP: MSVCP80D - private symbols & lines 52 D:\Symbols\msvcp80d.i386.pdb\C9DDCE5461B6402B8832D85B19A8B92F1\msvcp80d.i386.pdb 53 DBGHELP: d3d9 - public symbols 54 D:\Symbols\d3d9.pdb\F55AEB50462B473F9733515DC6532DAF2\d3d9.pdb 55 DBGHELP: d3d8thk - public symbols 56 D:\Symbols\d3d8thk.pdb\D9C3A335615F448EA0B012D76716E6B72\d3d8thk.pdb 57 DBGHELP: dwmapi - public symbols 58 D:\Symbols\dwmapi.pdb\D8D91B3F339A4FDC960FC7121D146DF42\dwmapi.pdb 59 DBGHELP: IMM32 - public symbols 60 D:\Symbols\imm32.pdb\91A0004474E24AA89F185029E31144892\imm32.pdb 61 DBGHELP: MSCTF - public symbols 62 D:\Symbols\msctf.pdb\173DAEF86B2548DBA6134EB74C4D2F232\msctf.pdb 63 DBGHELP: DSOUND - public symbols 64 D:\Symbols\dsound.pdb\F38F478065E247C68EDA699606F56EED2\dsound.pdb 65 DBGHELP: POWRPROF - public symbols 66 D:\Symbols\powrprof.pdb\B1F8F66CCBAD4869BADFD20C1F24AC832\powrprof.pdb 67 DBGHELP: SETUPAPI - public symbols 68 D:\Symbols\setupapi.pdb\C6B7CC380FCD42C29EDB1B61757DFD922\setupapi.pdb 69 DBGHELP: CFGMGR32 - public symbols 70 D:\Symbols\cfgmgr32.pdb\93B1A0A82F114743AF9AABB1A17382462\cfgmgr32.pdb 71 DBGHELP: DEVOBJ - public symbols 72 D:\Symbols\devobj.pdb\5EC40EC65C5045EB96F4CFDCFC6E19062\devobj.pdb 73 DBGHELP: MFC80CHS - no symbols loaded 74 DBGHELP: uxtheme - public symbols 75 D:\Symbols\UxTheme.pdb\5BECAB35E7714835A6BF3DADD891BB3A2\UxTheme.pdb 76 DBGHELP: CRYPTBASE - public symbols 77 D:\Symbols\cryptbase.pdb\E62FEAE559EE4CD995614215B01AC2102\cryptbase.pdb 78 DBGHELP: CLBCatQ - public symbols 79 D:\Symbols\CLBCatQ.pdb\00A720C79BAC402295B6EBDC147257182\CLBCatQ.pdb 80 DBGHELP: mlang - export symbols 81 DBGHELP: nvd3dum - export symbols 82 DBGHELP: MMDevApi - public symbols 83 D:\Symbols\MMDevAPI.pdb\941E45A63E8F457D90CE29CC508C34B92\MMDevAPI.pdb 84 DBGHELP: PROPSYS - public symbols 85 D:\Symbols\propsys.pdb\D0EDA507E53D4579A337F875012D7B482\propsys.pdb 86 DBGHELP: AUDIOSES - public symbols 87 D:\Symbols\AudioSes.pdb\A88FCF91944949A8A1863D1592BB2FD12\AudioSes.pdb 88 DBGHELP: quartz - public symbols 89 D:\Symbols\quartz.pdb\80E345FD1EE54FBAB8211528D99BC28C2\quartz.pdb 90 DBGHELP: dhcpcsvc6 - export symbols 91 DBGHELP: dhcpcsvc - public symbols 92 D:\Symbols\dhcpcsvc.pdb\D3E01A80603143AC83EA5801BEC674D82\dhcpcsvc.pdb 93 DBGHELP: devenum - public symbols 94 D:\Symbols\devenum.pdb\728AEF77CC244D8BADC3F6255CE396B31\devenum.pdb 95 DBGHELP: DShowRdpFilter - public symbols 96 D:\Symbols\DShowRdpFilter.pdb\4722ABE2B47D49B994FE311D5B2097BC1\DShowRdpFilter.pdb 97 DBGHELP: WTSAPI32 - public symbols 98 D:\Symbols\wtsapi32.pdb\1F1D3CBAE8A447E5BF304735F21CB4132\wtsapi32.pdb 99 DBGHELP: WINSTA - public symbols 100 D:\Symbols\winsta.pdb\2A3148024D094FFEB24C3996E47658312\winsta.pdb 101 DBGHELP: slc - export symbols 102 DBGHELP: LAVSplitter - export symbols 103 DBGHELP: COMCTL32 - public symbols 104 D:\Symbols\comctl32.pdb\B4CE90AAB95E4B89A22A7711DFD7E6EF2\comctl32.pdb 105 DBGHELP: avformat-lav-54 - export symbols 106 DBGHELP: avcodec-lav-54 - export symbols 107 DBGHELP: avutil-lav-51 - export symbols 108 DBGHELP: libbluray - export symbols 109 DBGHELP: VSFilter - export symbols 110 DBGHELP: COMDLG32 - public symbols 111 D:\Symbols\comdlg32.pdb\96BC483CDFF04D1AAFE462F093B954EC2\comdlg32.pdb 112 DBGHELP: WINSPOOL - public symbols 113 D:\Symbols\winspool.pdb\B165BBE7CD8C4F39BE373C0D9DFCD77B2\winspool.pdb 114 DBGHELP: WININET - export symbols 115 DBGHELP: urlmon - export symbols 116 DBGHELP: CRYPT32 - export symbols 117 DBGHELP: MSASN1 - public symbols 118 D:\Symbols\msasn1.pdb\003D5F0E24804B20953A7A021B52FC322\msasn1.pdb 119 DBGHELP: iertutil - export symbols 120 DBGHELP: AviSplitter - export symbols 121 DBGHELP: OggSplitter - export symbols 122 DBGHELP: MpegSplitter - export symbols 123 DBGHELP: MpaSplitter - export symbols 124 DBGHELP: ffdshow - export symbols 125 DBGHELP: DINPUT - public symbols 126 D:\Symbols\dinput.pdb\A355C027AC914C65A03AE2C06EBC117C1\dinput.pdb 127 DBGHELP: SspiCli - export symbols 128 DBGHELP: LAVAudio - export symbols 129 DBGHELP: msdmo - public symbols 130 D:\Symbols\msdmo.pdb\7E91458399E34CF99F0C993D9128BB301\msdmo.pdb 131 DBGHELP: qasf - public symbols 132 D:\Symbols\qasf.pdb\9BD26FFA3B5F4FDBA04379D9F92935DD1\qasf.pdb 133 DBGHELP: mp3dmod - public symbols 134 D:\Symbols\MP3DMOD.pdb\54618A168148428DADB4CE0B4628168F2\MP3DMOD.pdb 135 DBGHELP: mfplat - public symbols 136 D:\Symbols\MFPLAT.pdb\F512BAE9BAA14B87A898050CB20C0E3B2\MFPLAT.pdb 137 DBGHELP: AVRT - public symbols 138 D:\Symbols\avrt.pdb\A15E148ACFC74F88A0A6DAF71CC916472\avrt.pdb 139 DBGHELP: ac3filter - export symbols 140 DBGHELP: ac3filter_intl - export symbols 141 DBGHELP: wdmaud - public symbols 142 D:\Symbols\wdmaud.pdb\F232D0B492574D7992D5805BEF84A01E2\wdmaud.pdb 143 DBGHELP: ksuser - public symbols 144 D:\Symbols\ksuser.pdb\7AE6BFAC128C4C57BAAF1C0B79FA95B42\ksuser.pdb 145 DBGHELP: msacm32 - public symbols 146 D:\Symbols\msacm32.pdb\EB29395AE01743DB8C5DCB7F5A1350F91\msacm32.pdb 147 DBGHELP: MSACM32 - public symbols 148 D:\Symbols\msacm32.pdb\3D318D5E38C54502B64578F0710A510F2\msacm32.pdb 149 DBGHELP: midimap - public symbols 150 D:\Symbols\midimap.pdb\49F76FA53B854E54A748A2B4301471B62\midimap.pdb 151 DBGHELP: CRYPTSP - export symbols 152 DBGHELP: rsaenh - export symbols 153 // 154 // Each log entry has the following syntax: 155 // 156 // + BYTES_DELTA (NEW_BYTES - OLD_BYTES) NEW_COUNT allocs BackTrace TRACEID 157 // + COUNT_DELTA (NEW_COUNT - OLD_COUNT) BackTrace TRACEID allocations 158 // ... stack trace ... 159 // 160 // where: 161 // 162 // BYTES_DELTA - increase in bytes between before and after log 163 // NEW_BYTES - bytes in after log 164 // OLD_BYTES - bytes in before log 165 // COUNT_DELTA - increase in allocations between before and after log 166 // NEW_COUNT - number of allocations in after log 167 // OLD_COUNT - number of allocations in before log 168 // TRACEID - decimal index of the stack trace in the trace database 169 // (can be used to search for allocation instances in the original 170 // UMDH logs). 171 // 172 173 174 + 80330496 ( 80330496 - 0) 5382 allocs BackTrace1628EDB8 175 + 5382 ( 5382 - 0) BackTrace1628EDB8 allocations 176 177 ntdll!EtwSetMark+000023ED 178 MSVCR80D!_heap_alloc_base+0000005C (f:\dd\vctools\crt_bld\self_x86\crt\src\malloc.c, 105) 179 MSVCR80D!_heap_alloc_dbg+000001F5 (f:\dd\vctools\crt_bld\self_x86\crt\src\dbgheap.c, 411) 180 MSVCR80D!_nh_malloc_dbg+00000019 (f:\dd\vctools\crt_bld\self_x86\crt\src\dbgheap.c, 268) 181 MSVCR80D!malloc+00000019 (f:\dd\vctools\crt_bld\self_x86\crt\src\dbgheap.c, 154) 182 moxia_d!stRleFrame::Read+0000012D (e:\p06\sources\cache\stframe.cpp, 1331) 183 moxia_d!stRleGroup::Load+0000011E (e:\p06\sources\cache\stframe.cpp, 1521) 184 moxia_d!cResourceRle::LoadAGroup+00000072 (e:\p06\sources\cache\cresourcerle.cpp, 615) 185 moxia_d!Load+0000007A (e:\p06\sources\cache\cresource.cpp, 89) 186 moxia_d!PreloadRes+000000C9 (e:\p06\sources\cache\cresource.cpp, 119) 187 MFC80D!_AfxThreadEntry+000002DC (f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\thrdcore.cpp, 109) 188 MSVCR80D!_callthreadstartex+00000051 (f:\dd\vctools\crt_bld\self_x86\crt\src\threadex.c, 348) 189 MSVCR80D!_threadstartex+00000087 (f:\dd\vctools\crt_bld\self_x86\crt\src\threadex.c, 331) 190 kernel32!BaseThreadInitThunk+00000012 191 ntdll!RtlInitializeExceptionChain+000000EF 192 ntdll!RtlInitializeExceptionChain+000000C2 193 194 + 15728662 ( 15728662 - 0) 1 allocs BackTrace849BAB0 195 + 1 ( 1 - 0) BackTrace849BAB0 allocations 196 197 ntdll!EtwSetMark+000023ED 198 MSVCR80D!_heap_alloc_base+0000005C (f:\dd\vctools\crt_bld\self_x86\crt\src\malloc.c, 105) 199 MSVCR80D!_heap_alloc_dbg+000001F5 (f:\dd\vctools\crt_bld\self_x86\crt\src\dbgheap.c, 411) 200 MSVCR80D!_nh_malloc_dbg+00000019 (f:\dd\vctools\crt_bld\self_x86\crt\src\dbgheap.c, 268) 201 MSVCR80D!malloc+00000019 (f:\dd\vctools\crt_bld\self_x86\crt\src\dbgheap.c, 154) 202 MSVCR80D!operator new+0000000F (f:\dd\vctools\crt_bld\self_x86\crt\src\new.cpp, 59) 203 MSVCP80D!std::_Allocate<char>+00000043 (f:\dd\vctools\crt_bld\self_x86\crt\src\xmemory, 44) 204 MSVCP80D!std::allocator<char>::allocate+00000012 (f:\dd\vctools\crt_bld\self_x86\crt\src\xmemory, 152) 205 moxia_d!std::vector<char,std::allocator<char> >::_Insert_n+00000139 206 moxia_d!std::vector<char,std::allocator<char> >::resize+00000075 207 moxia_d!std::vector<char,std::allocator<char> >::resize+0000001C 208 moxia_d!cBmp::Load+00000176 (e:\p06\sources\cache\cfont.cpp, 346) 209 moxia_d!cFont::Load+000001C0 (e:\p06\sources\cache\cfont.cpp, 91) 210 moxia_d!CMainWnd::OnCreate+000001DE (e:\p06\sources\client\mainwnd.cpp, 910) 211 MFC80D!CWnd::OnWndMsg+000007FE (f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\wincore.cpp, 2000) 212 MFC80D!CWnd::WindowProc+00000030 (f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\wincore.cpp, 1741) 213 moxia_d!CMainWnd::WindowProc+000018C0 (e:\p06\sources\client\mainwndinput.cpp, 3967) 214 MFC80D!AfxCallWndProc+000000EE (f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\wincore.cpp, 240) 215 MFC80D!AfxWndProc+000000A4 (f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\wincore.cpp, 389) 216 MFC80D!AfxWndProcBase+00000059 (f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\afxstate.cpp, 411) 217 USER32!InternalCallWinProc+00000023 218 USER32!UserCallWinProcCheckWow+000000E0 219 USER32!DispatchClientMessage+000000DA 220 USER32!__fnINLPCREATESTRUCT+0000008B 221 ntdll!KiUserCallbackDispatcher+0000002E 222 USER32!_CreateWindowEx+00000201 223 USER32!CreateWindowExA+00000033 224 MFC80D!AfxCtxCreateWindowExA+000000A1 (f:\dd\vctools\vc7libs\ship\atlmfc\include\afxcomctl32.h, 438) 225 MFC80D!CWnd::CreateEx+0000014A (f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\wincore.cpp, 694) 226 MFC80D!CWnd::CreateEx+0000005B (f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\wincore.cpp, 659) 227 moxia_d!CMainWnd::Create+000003B7 (e:\p06\sources\client\mainwnd.cpp, 778) 228 moxia_d!CGameClient::InitInstance+00000984 (e:\p06\sources\client\client.cpp, 558) 229 230 231 / 232 // 后面还有很多 ............
2、使用脚本运行:
1 ua.exe 1.txt -yes:ScriptMgr::LoadFile 2 ua.exe 2.txt -yes:cBmp::Load 3 ua.exe 3.txt -yes:cStatic::RestoreDeviceObjects 4 ua.exe 4.txt -yes:cBackground::LoadFile 5 ua.exe 5.txt -yes:cPropertyTable::Load 6 ua.exe 6.txt -yes:CD3DApplication::Create 7 ua.exe 7.txt -yes:PreloadRes 8 ua.exe 8.txt -yes:LeaderBoardCMgr::Init 9 ua.exe 9.txt -yes:Magic_CreateStatic 10 ua.exe 10.txt -yes:CMainWnd::CreateGui 11 ua.exe 11.txt -yes:cDevice::MDDrawPresent 12 ua.exe 12.txt -yes:cMp3::PlayNext 13 ua.exe 13.txt -yes:e:\p06\sources\tolua\lparser.c 14 ua.exe 14.txt -yes:cWorldClient::CreateTable 15 ua.exe 15.txt -yes:CMainWnd::CreateSoundManager 16 ua.exe 16.txt -yes:CMainWnd::OnCreate 17 ua.exe 17.txt -no:moxia_d! 18 ua.exe 18.txt -yes:CMainWnd::Draw 19 ua.exe 19.txt -whatever
3、生成结果示例:
生成ua.exe的代码:
1 #include <stdafx.h> 2 #include <windows.h> 3 #include <assert.h> 4 #include <string> 5 #include <vector> 6 #include <Psapi.h> 7 using namespace std; 8 9 // void string_MakeSurePathExists2( string path ) 10 // { 11 // assert(path.find('/') == string::npos); 12 // 13 // int index = path.find("\\", 0); 14 // while (index != string::npos) 15 // { 16 // CreateDirectoryA(path.substr(0, index).c_str(), NULL); 17 // index = path.find("\\", index + 1); 18 // } 19 // } 20 #define LINES 64 21 #define BUFS 1024 22 23 typedef char TBUFF[BUFS]; 24 25 bool readline(FILE* fp, TBUFF buf) 26 { 27 int index = 0; 28 while (1) 29 { 30 char& ch = buf[index]; 31 if (0 == fread(&ch, 1, 1, fp)) 32 { 33 if (index > 0) 34 { 35 buf[index + 1] = 0; 36 return true; 37 } 38 39 return false; 40 } 41 if (ch == '\n') 42 { 43 buf[index + 1] = 0; 44 return true; 45 } 46 if (++index >= BUFS - 1) 47 return false; 48 } 49 return false; 50 } 51 52 inline bool isemptychar(char ch) 53 { 54 return (ch == ' ' || ch == '\r' || ch == '\n' || ch == '\t'); 55 } 56 57 bool isemptyline(TBUFF buf) 58 { 59 int i = 0; 60 char ch; 61 while (ch = buf[i++]) 62 { 63 if (!isemptychar(ch)) 64 return false; 65 } 66 return true; 67 } 68 69 bool readblock(FILE* fp, TBUFF bufs[LINES], int& lines) 70 { 71 bool bPlus = false; 72 bool bGTH = false; 73 lines = 0; 74 75 while (1) 76 { 77 TBUFF& pLine = bufs[lines]; 78 if (!readline(fp, pLine)) 79 { 80 return bPlus; 81 } 82 83 bool bFirst = ((pLine[0] == '+' || pLine[0] == '-') && strstr(pLine, "allocs")); 84 if (!bPlus) 85 { 86 if (bFirst) 87 bPlus = true; 88 } 89 else 90 { 91 if (!bGTH) 92 { 93 if (strstr(pLine, "!")) 94 bGTH = true; 95 } 96 else 97 { 98 if (isemptyline(pLine)) 99 { 100 ++lines; 101 return true; 102 } 103 } 104 } 105 106 if (bPlus) 107 ++lines; 108 } 109 } 110 111 int getbytesfromrow(TBUFF buf) 112 { 113 // int positive = (buf[0] == '+'); 114 115 char nums[16] = {0}; 116 int N = 0; 117 118 int B = 0; 119 char ch; 120 121 bool bFound = false; 122 123 while (ch = buf[B++]) 124 { 125 if (!bFound) 126 { 127 if (ch >= '0' && ch <= '9') 128 { 129 bFound = true; 130 nums[N++] = ch; 131 } 132 } 133 else 134 { 135 if (ch >= '0' && ch <= '9') 136 nums[N++] = ch; 137 else 138 break; 139 } 140 } 141 142 if (N == 0) 143 return 0; 144 return atoi(nums); 145 } 146 147 void handleinvalidfilename(char* p) 148 { 149 static const char invalid_ch[] = { '/','\\',':','*','?','<','>','|' }; 150 while (*p) 151 { 152 for (int i = 0; i < sizeof(invalid_ch); i++) 153 { 154 if (*p == invalid_ch[i]) 155 { 156 *p = '_'; 157 break; 158 } 159 } 160 p++; 161 } 162 } 163 164 struct ParamInfo 165 { 166 BOOL bWhatever; // 当这个为TRUE,下面2个无效 167 std::vector<std::string > vecKeyYes; 168 std::vector<std::string > vecKeyNo; 169 }; 170 171 bool matchparam(TBUFF bufs[LINES], int lines, ParamInfo* param) 172 { 173 if (param->bWhatever) 174 return true; 175 176 bool bHaveNo = param->vecKeyNo.size() > 0; 177 bool bHaveYes = param->vecKeyYes.size() > 0; 178 179 if (bHaveNo) 180 { 181 for (int i = 0; i < lines; i++) 182 { 183 TBUFF& buf = bufs[i]; 184 for (int j = 0; j < (int)param->vecKeyNo.size(); j++) 185 { 186 if (strstr(buf, param->vecKeyNo[j].c_str())) 187 return false; 188 } 189 } 190 } 191 192 if (bHaveYes) 193 { 194 for (int i = 0; i < lines; i++) 195 { 196 TBUFF& buf = bufs[i]; 197 for (int j = 0; j < (int)param->vecKeyYes.size(); j++) 198 { 199 if (strstr(buf, param->vecKeyYes[j].c_str())) 200 return true; 201 } 202 } 203 return false; 204 } 205 else 206 { 207 return true; 208 } 209 } 210 211 #define KeyWhatever "-whatever" // 随便什么都算 212 #define KeyYes "-yes:" // 必须某一行包含这个 213 #define KeyNo "-no:" // 所有行不得包含这个 214 215 void parseparam(char* argv, ParamInfo* param) 216 { 217 param->bWhatever = FALSE; 218 char* p; 219 if (strstr(argv, KeyWhatever) == argv) 220 { 221 param->bWhatever = TRUE; 222 } 223 else if (strstr(argv, KeyYes) == argv) 224 { 225 p = argv + strlen(KeyYes); 226 param->vecKeyYes.push_back(p); 227 } 228 else if (strstr(argv, KeyNo) == argv) 229 { 230 p = argv + strlen(KeyNo); 231 param->vecKeyNo.push_back(p); 232 } 233 } 234 235 // 检查参数 236 // 返回 true表示可以继续执行 237 bool checkparam(ParamInfo* param) 238 { 239 if (param->bWhatever) 240 { 241 if (param->vecKeyYes.size() > 0 || param->vecKeyNo.size() > 0) 242 { 243 printf("警告:已指定%s,将忽略其它参数\n", KeyWhatever); 244 } 245 return true; 246 } 247 else 248 { 249 if (param->vecKeyYes.size() > 0 || param->vecKeyNo.size() > 0) 250 { 251 return true; 252 } 253 else 254 { 255 printf("错误:没有指定任何有效参数\n"); 256 return false; 257 } 258 } 259 } 260 261 void printusage() 262 { 263 printf("用法: this.exe TARGETFILE [%s] | [[%sxxx] * N] [[%syyy] * N]" 264 "\nTARGETFILE 请从 1.txt 开始" 265 "\n%s表示所有都匹配" 266 "\n%s表示任何一行带有这个就行" 267 "\n%s表示任何一行都不得带这个" 268 "\n例如:this.exe 1.txt %s" 269 "\n例如:this.exe 1.txt %sScriptMgr::LoadFile %scBmp::Load" 270 "\n例如:this.exe 1.txt %smoxia_d!" 271 "\n", 272 KeyWhatever, KeyYes, KeyNo, 273 KeyWhatever, 274 KeyYes, 275 KeyNo, 276 KeyWhatever, 277 KeyYes, KeyYes, 278 KeyNo 279 ); 280 281 getchar(); 282 } 283 284 void main(int argc, char* argv[]) 285 { 286 if (argc < 3) 287 { 288 printusage(); 289 return; 290 } 291 292 FILE* fpSrc = 0; 293 FILE* fpDst = 0; 294 std::string t1, t2; 295 FILE* fpT1 = 0; 296 FILE* fpT2 = 0; 297 298 int bytesSum = 0; 299 char outputFolderName[MAX_PATH]; 300 char outputFolderNameR[MAX_PATH]; 301 302 do 303 { 304 // src file 305 const char* fileName = argv[1]; 306 fpSrc = fopen(fileName, "r"); 307 if (NULL == fpSrc) 308 { 309 printf("open %s error.\n", fileName); 310 break; 311 } 312 313 // dst file 314 char RfileName[MAX_PATH]; 315 sprintf(RfileName, "%d.txt", atoi(fileName) + 1); 316 fpDst = fopen(RfileName, "w"); 317 if (NULL == fpDst) 318 { 319 printf("open %s error.\n", RfileName); 320 break; 321 } 322 323 // parameters 324 ParamInfo param; 325 for (int i = 2; i < argc; i++) 326 { 327 parseparam(argv[i], ¶m); 328 } 329 if (!checkparam(¶m)) 330 { 331 printusage(); 332 break; 333 } 334 335 // dst folder 336 memset(outputFolderName, 0, MAX_PATH); 337 if (param.bWhatever) 338 sprintf(outputFolderName, "%d %s", atoi(fileName), KeyWhatever); 339 else if (param.vecKeyYes.size() > 0) 340 sprintf(outputFolderName, "%d %s", atoi(fileName), param.vecKeyYes[0].c_str()); 341 else if (param.vecKeyNo.size() > 0) 342 sprintf(outputFolderName, "%d no %s", atoi(fileName), param.vecKeyNo[0].c_str()); 343 else 344 sprintf(outputFolderName, "%d", atoi(fileName)); 345 handleinvalidfilename(outputFolderName); 346 if (!CreateDirectory(outputFolderName, NULL)) 347 { 348 printf("CreateDirectory %s error.\n", outputFolderName); 349 break; 350 } 351 t1 = std::string(outputFolderName) + "\\1.txt"; 352 t2 = std::string(outputFolderName) + "\\2.txt"; 353 fpT1 = fopen(t1.c_str(), "w"); 354 fpT2 = fopen(t2.c_str(), "w"); 355 356 TBUFF bufs[LINES]; 357 int lines; 358 while (1) 359 { 360 if (!readblock(fpSrc, bufs, lines)) 361 { 362 break; 363 } 364 365 // 是否 match 366 bool bMatch = matchparam(bufs, lines, ¶m); 367 if (!bMatch) 368 { 369 // 不匹配就输出到下一个文本中 370 for (int i = 0; i < lines; i++) 371 fprintf(fpDst, bufs[i]); 372 } 373 else 374 { 375 // 匹配就输出到对应的文件夹内 376 int bytes = getbytesfromrow(bufs[0]); 377 if (bufs[0][0] == '-') 378 bytes = -bytes; 379 fprintf(fpT1, "%d\n", bytes); 380 bytesSum += bytes; 381 for (int i = 0; i < lines; i++) 382 fprintf(fpT2, bufs[i]); 383 } 384 } 385 386 fprintf(fpT1, "Total %d\n", bytesSum); 387 388 } while(false); 389 390 if (fpSrc) fclose(fpSrc); 391 if (fpDst) fclose(fpDst); 392 if (fpT1) fclose(fpT1); 393 if (fpT2) fclose(fpT2); 394 395 if (abs(bytesSum) >= 1024 * 1024) 396 sprintf(outputFolderNameR, "%s (%.1f MB)", outputFolderName, (float)bytesSum/1024/1024); 397 else if (abs(bytesSum) >= 1024) 398 sprintf(outputFolderNameR, "%s (%d KB)", outputFolderName, bytesSum/1024); 399 else 400 sprintf(outputFolderNameR, "%s (%d Bytes)", outputFolderName, bytesSum); 401 rename(outputFolderName, outputFolderNameR); 402 }