赞
踩
实时数据库测试-汇编小程序。
hd.asm
.686 .model flat,stdcall option casemap:none include \masm32\include\windows.inc include \masm32\include\kernel32.inc include \masm32\include\user32.inc include \masm32\include\gdi32.inc include \masm32\include\advapi32.inc include \masm32\include\wsock32.inc includelib \masm32\lib\ws2_32.lib includelib \masm32\lib\kernel32.lib includelib \masm32\lib\user32.lib includelib \masm32\lib\gdi32.lib includelib \masm32\lib\advapi32.lib USERNAME_PASSWORD_LEN =16 USER_INFO_LEN =34 USER_NAME_LEN =16 USER_PASSWORD_LEN =16 UDP_PORT =3308 THREAD_CPU_RATIO =4 BUF_MULTI_RATIO =2 MAX_RECORD_SUM =10000h FILE_POINTDIR_SIZE =200000h FILE_USERINFO_SIZE =100000H ENCRYPTION_KEY =0FFH UDP_PACKAGE_SIZE =512 UDP_PACKAGE_HEADER_SIZE =16 RECORDING_INDEX_SIZE =32 SMALLEST_SAMPLE_PERIOD =20 BOOL_PACK_FLAG =2 FLOAT_PACK_FLAG =1 INVALID_POINT_VALUE =0ffffffffh _DLG_CLIENT_SHOWVALUE =1000h _LIST_CLIENT_SHOWVALUE =1001h .data align qword _stSystemInfo SYSTEM_INFO <> _stCriticalUserInfo CRITICAL_SECTION <> _stCriticalPointDir CRITICAL_SECTION <> _stCriticalReadData CRITICAL_SECTION <> _stCriticalRealTime CRITICAL_SECTION <> _stCriticalMemToFile CRITICAL_SECTION <> _stCriticalDcsToMem CRITICAL_SECTION <> _stCriticalTransInfo CRITICAL_SECTION <> ;读文件记录时多线程传递参数 _stRecvAddr sockaddr_in <> szDataBaseFileName db 'DataBase.dat',0 szIndexFileName db 'DataBase.idx',0 szPointDirFileName db 'PointDir.txt',0 szUserInfoFileName db 'UserInfo.txt',0 szJournalFileName db 'Journal.txt',0 szReadMainError db 'Read Main Error!',0dh,0ah,0 szLaunchReadError db 'Launch Read Error!',0dh,0ah,0 szClientShowValue db '%04d年%02d月%02d日%02d时%02d分%02d秒:%08d',0dh,0ah,0 szInit db ' ',0dh,0ah db ' ',0dh,0ah db ' ',0dh,0ah db '****************************************',0dh,0ah db '%s数据库开始启动',0dh,0ah db '****************************************',0dh,0ah,0 szThreadError db '(ERROR)创建线程失败!',0dh,0ah,0 szEventError db '(ERROR)创建事件失败!',0dh,0ah,0 szMemAllocError db '(ERROR)分配内存失败!',0dh,0ah,0 szInputError db '(ERROR)读文件参数错误!',0dh,0ah,0 szSetPriorityClassError db '(ERROR)优先级设置错误!',0dh,0ah,0 szFileMapError db '(ERROR)创建文件内存映射失败!',0dh,0ah,0 szFileNoConfig db '(ERROR)未发现配置文件,初始化失败!',0dh,0ah,0 szAdminLogon db 'admin',11 dup (20h),'123456',10 dup (20h),0dh,0ah szDcsSampleCnt db '检索到的数据记录点数量:%d',0dh,0ah,0 szCreateIndex db '新建索引文件!',0dh,0ah,0 szOpenIndex db '成功打开索引文件!',0dh,0ah,0 szCreateDataBase db '新建数据库文件!',0dh,0ah,0 szOpenDataBase db '成功打开数据库文件!',0dh,0ah,0 szCreateJournal db '新建日志文件!',0dh,0ah,0 szOpenJournal db '成功打开日志文件!',0dh,0ah,0 szCreatePointDir db '新建点目录文件!',0dh,0ah,0 szOpenPointDir db '成功打开点目录文件!',0dh,0ah,0 szCreateUserInfo db '新建用户信息文件',0dh,0ah,0 szOpenUserInfo db '成功打开用户信息文件',0dh,0ah,0 szQuit db '所有线程已退出,数据库即将关闭!',0dh,0ah,0 szSystemTime db '%04d年%02d月%02d日%02d时%02d分%02d秒',0 szPointInsert db '%s在点:%s前成功插入点:%s!',0dh,0ah,0 szPointAdd db '%s成功添加点:%s!',0dh,0ah,0 szPointDelete db '%s成功删除点:%s!',0dh,0ah,0 szPointModify db '%s成功将点:%s修改为点:%s!',0dh,0ah,0 szPointSeek db '%s成功查询点:%s!',0dh,0ah,0 szGetPointTable db '%s成功读取点目录文件!',0dh,0ah,0 szJournalWrite db '%s写入第%d%d条记录,总共耗时%d%d微秒 ' db '包括内存缓冲区在内的总记录数为%d%d条',0dh,0ah,0 szJournalPack db '%s为止共计收到%d%d个UDP数据包,共计解包%d%d个UDP个',0dh,0ah,0 szJournalSeek db '%s二分查找次数:%d,查找记录号计时:%d微秒!',0dh,0ah,0 szJournalRead db '%s读出第%d%d条----第%d%d条记录,总共读出%d条记录,计时:%d微秒!',0dh,0ah,0 szModifyValue db '%s修改从%d%d条开始的%d条记录!',0dh,0ah,0 szEncryptPointDir db '%s点目录文件关闭时已经正确加密!',0dh,0ah,0 szDecryptPointDir db '%s点目录文件打开时已经正确解密!',0dh,0ah,0 szEncryptUserInfo db '%s用户信息文件关闭时已经正确加密!',0dh,0ah,0 szDecryptUserInfo db '%s用户信息文件打开时已经正确解密!',0dh,0ah,0 szSeekUserInfo db '%s查询用户信息:%s!',0dh,0ah,0 szAddUserInfo db '%s增加用户信息:%s!',0dh,0ah,0 szDeleteUserInfo db '%s删除用户信息:%s!',0dh,0ah,0 szSocketError db '%s网络初始化错误!',0dh,0ah,0 szRecvUdpPackError db '%sUDP数据包传送中出现错误,是否因为程序已退出?',0dh,0ah,0 szRecordingWriteError db '%s写入记录过程中发生错误,错误码为:%d',0dh,0ah,0 szUdpUnpackQuit db 'UdpUnpack terminate!',0dh,0ah,0 szRecvUdpPackQuit db 'RecvUdp terminate!',0dh,0ah,0 szStoreRecordingQuit db 'StoreRecord terminate!',0dh,0ah,0 szWaitSamplePeriodQuit db 'WaitPeriod terminate!',0dh,0ah,0 szMsgException db '%s程序发生严重异常,异常地址:%08x,异常错误码:%08x,异常标志位:%08x!',0dh,0ah,0 szGuardPageViolation db '%s缓冲区即将溢出,请迅速找到解决方法-->' db '异常地址:%08x,异常错误码:%08x,异常标志位:%08x!',0dh,0ah,0 szExceptionReadWriteBusy db '数据读写繁忙,备用缓冲区已经准备好,异常处理完毕!',0dh,0ah,0 szExceptionReadWriteNotBusy db '上一次异常处理正确完成,备用缓冲区已经成功关闭!',0dh,0ah,0 szExceptionMemUnroll db '注意:缓冲区地址空间已经不够,指针将回绕,缓冲区数据将会因为被覆盖而丢失',0dh,0ah,0 szDllEntry db 'DllEntry函数加载地址为: %08x',0dh,0ah,0 szProcTerminate db '_ProcTerminate函数加载地址为: %08x',0dh,0ah,0 szProcInit db '_ProcInit函数加载地址为: %08x',0dh,0ah,0 szProcOpenFile db '_ProcOpenFile函数加载地址为: %08x',0dh,0ah,0 szProcModifyData db '_ProcModifyData函数加载地址为: %08x',0dh,0ah,0 szProcReadData db '_ProcReadData函数加载地址为: %08x',0dh,0ah,0 szProcReadInterval db '_ProcReadInterval函数加载地址为: %08x',0dh,0ah,0 szThreadReadData db '_ThreadReadData线程加载地址为: %08x',0dh,0ah,0 szThreadSeekIndex db '_ThreadSeekIndex线程加载地址为: %08x',0dh,0ah,0 szProcOverlappedRead db '_ProcOverlappedRead函数加载地址为: %08x',0dh,0ah,0 szThreadReadSector db '_ThreadReadSector线程加载地址为: %08x',0dh,0ah,0 szThreadWaitSamplePeriod db '_ThreadWaitSamplePeriod线程加载地址为: %08x',0dh,0ah,0 szThreadRecvUdpPack db '_ThreadRecvUdpPack线程加载地址为: %08x',0dh,0ah,0 szThreadUdpUnpack db '_ThreadUdpUnpack线程加载地址为: %08x',0dh,0ah,0 szProcExceptionGuard db '_ProcExceptionGuard函数加载地址为: %08x',0dh,0ah,0 szThreadStoreRecording db '_ThreadStoreRecording线程加载地址为: %08x',0dh,0ah,0 szThreadJournalOfWriteInfo db '_ThreadJournalOfWriteInfo线程加载地址为: %08x',0dh,0ah,0 szThreadRealTimeData db '_ThreadRealTimeData线程加载地址为: %08x',0dh,0ah,0 szProcRegistryInfo db '_ProcRegistryInfo函数加载地址为: %08x',0dh,0ah,0 szProcGetRealTimeData db '_ProcGetRealTimeData函数加载地址为: %08x',0dh,0ah,0 szProcInsertPoint db '_ProcInsertPoint函数加载地址为: %08x',0dh,0ah,0 szProcAddPoint db '_ProcAddPoint函数地加载址为: %08x',0dh,0ah,0 szProcDeletePoint db '_ProcDeletePoint函数加载地址为: %08x',0dh,0ah,0 szProcModifyPoint db '_ProcModifyPoint函数加载地址为: %08x',0dh,0ah,0 szProcSeekPoint db '_ProcSeekPoint函数加载地址为: %08x',0dh,0ah,0 szProcGetPointTable db '_ProcGetPointTable函数加载地址为: %08x',0dh,0ah,0 szProcSeekUser db '_ProcSeekUser函数加载地址为: %08x',0dh,0ah,0 szProcAddUser db '_ProcAddUser函数加载地址为: %08x',0dh,0ah,0 szProcDeleteUser db '_ProcDeleteUser函数加载地址为: %08x',0dh,0ah,0 align qword _dqRecvPackCnt dq 0 _dqUnPackCnt dq 0 _dqRecordingCntSum dq 0 _dqFileTotalRecording dq 0 _hSockRecv dd 0 _dwSamplePeriod dd 200 _dwStoreRecordingPeriod dd 16000 _dwDcsSampleCnt dd 0 _dwFreeRecordCnt dd 0 _dwDataRecordingSize dd 0 _lpUdpPackRecvBuf dd 0 _lpUdpPackRecvBufHead dd 0 _lpUdpPackRecvBufEnd dd 0 _lpUdpPackRecvBufLimit dd 0 _dwUdpPackRecvBufSize dd 0 _lpUdpPackAddrBuf dd 0 _lpUdpPackAddrBufHead dd 0 _lpUdpPackAddrBufEnd dd 0 _lpUdpPackAddrBufLimit dd 0 _dwUdpPackAddrBufSize dd 0 _dwRecordingCntOfBuf dd 0 _dwRecordingLimitOfBuf dd 0 _lpRecordingBuf dd 0 _lpRecordingBufHead dd 0 _lpRecordingBufEnd dd 0 _lpRecordingBufLimit dd 0 _dwRecordingBufSize dd 0 _dwRecordingBackupBufSize dd 0 _lpRecordReservedBuf dd 0 _lpRecordReservedBufHead dd 0 _lpRecordReservedBufLimit dd 0 _lpIndexReservedBuf dd 0 _lpIndexReservedBufHead dd 0 _lpIndexReservedBufLimit dd 0 _lpRecordingIndexBuf dd 0 _lpRecordingIndexBufHead dd 0 _lpRecordingIndexBufEnd dd 0 _lpRecordingIndexBufLimit dd 0 _dwRecordingIndexBufSize dd 0 _dwIndexBackupBufSize dd 0 _lpPointDirBuf dd 0 _dwPointDirBufSize dd 0 _lpUserInfoBuf dd 0 _dwUserInfoBufSize dd 0 _lpReadQueueInfoBuf dd 0 _dwReadQueueInfoBufSize dd 0 _dwRltDataTableBufSize dd 0 _lpRltDataTableBuf dd 0 _hFileDataBase dd 0 _hFileIndex dd 0 _hFilePointDir dd 0 _hFileJournal dd 0 _hFileUserInfo dd 0 _hFileMappingUserInfo dd 0 _hFileMapPointDir dd 0 _hThreadWaitSamplePeriod dd 0 _hThreadRecvUdpPack dd 0 _hThreadUdpUnpack dd 0 _hThreadStoreRecording dd 0 _hThreadRealTimeData dd 0 _lpRealTimeDataBuf dd 0 _hEventRealTimeData dd 0 _hEventStoreRecording dd 0 _hDllInstance dd 0 _hThisProcess dd 0 _dwSecsPerClu dd 0 _dwBytesPerSec dd 0 _dwFreeCluCnt dd 0 _dwCluCnt dd 0 _flWriteBusying dd 0 _flReadWriteBusy dd 0 _flMemoryNotEnough dd 0 _flTerminate dd 0 _dwRunningThreadCnt dd 0 _lpOldExceptionFilter dd 0 _hDlgShowValue dd 0 szOpenScmError db 'scm error',0 szOpenServiceError db 'open Service error',0 szRegistryServiceError db 'Registry error',0 szDispatcherServiceError db 'dispatcher error',0 szServiceName db '清竹公司大数据处理服务',0 szModuleFileName db 'D:\masm32\hddata\hddll\IOCPServerWin32Console.exe',0 .code DllEntry proc,hDllInstance,dwReason,dwReserved mov eax,dwReason .if eax==DLL_PROCESS_ATTACH push hDllInstance pop _hDllInstance mov eax,TRUE leave retn 12 .elseif eax==DLL_THREAD_ATTACH mov eax,TRUE leave retn 12 .elseif eax==DLL_THREAD_DETACH mov eax,TRUE leave retn 12 .elseif eax==DLL_PROCESS_DETACH ;为何此处不能设置为自动退出?因为手动调用了_ProcTerminate,若进程再次调用则发生异常 call _ProcTerminate mov eax,TRUE leave retn 12 .endif DllEntry endp _ProcTerminate proc local @szBuf[200h]:byte local @szBuffer[100h]:byte local @dwCounter push ebx push esi push edi cld invoke EnterCriticalSection,addr _stCriticalPointDir jmp DebugNotEncrypt mov esi,_lpPointDirBuf mov eax,FILE_POINTDIR_SIZE cmp dword ptr [eax+esi-8],1 jz PointDirEncrypted mov dword ptr [eax+esi-8],1 mov esi,_lpPointDirBuf mov edi,_lpPointDirBuf mov ecx,FILE_POINTDIR_SIZE sub ecx,8 EncryptePointDir: lodsb xor al,ENCRYPTION_KEY stosb loop EncryptePointDir PointDirEncrypted: lea eax,@szBuffer push eax call _ProcSysTimeToAsc invoke wsprintf,addr @szBuf,addr szEncryptPointDir,addr @szBuffer mov ecx,eax invoke WriteFile,_hFileJournal,addr @szBuf,ecx,addr @dwCounter,0 DebugNotEncrypt: mov esi,_lpUserInfoBuf mov ebx,FILE_USERINFO_SIZE cmp dword ptr [esi+ebx-8],1 jz FileInfoEncrypt mov dword ptr [esi+ebx-8],1 mov ecx,FILE_USERINFO_SIZE sub ecx,8 mov esi,_lpUserInfoBuf mov edi,esi DecryptUserInfo: lodsb xor al,ENCRYPTION_KEY stosb loop DecryptUserInfo FileInfoEncrypt: lea eax,@szBuffer push eax call _ProcSysTimeToAsc invoke wsprintf,addr @szBuf,addr szEncryptUserInfo,addr @szBuffer mov ecx,eax invoke WriteFile,_hFileJournal,addr @szBuf,ecx,addr @dwCounter,0 invoke closesocket,_hSockRecv invoke WSACleanup mov _flTerminate,1 WaitConsoleThreadRet: cmp _dwRunningThreadCnt,0 jnz WaitConsoleThreadRet invoke WriteFile,_hFileJournal,addr szQuit,sizeof szQuit-1,addr @dwCounter,0 mov esi,_lpRltDataTableBuf mov ecx,_dwRltDataTableBufSize shr ecx,3 CheckPointOrdinal: push ecx push esi lodsd cmp eax,0ffffffffh jnz GetValidService GetNextValidService: pop esi add esi,8 pop ecx loop CheckPointOrdinal jmp NotFoundValidService GetValidService: mov edi,[esi] mov dword ptr [esi],0ffffffffh mov dword ptr [esi-4],0ffffffffh push edi invoke VirtualFree,edi,_stSystemInfo.dwPageSize,MEM_DECOMMIT pop edi invoke VirtualFree,edi,0,MEM_RELEASE jmp GetNextValidService NotFoundValidService: invoke VirtualFree,_lpUdpPackRecvBuf,_dwUdpPackRecvBufSize,MEM_DECOMMIT invoke VirtualFree,_lpUdpPackRecvBuf,0,MEM_RELEASE invoke VirtualFree,_lpUdpPackAddrBuf,_dwUdpPackAddrBufSize,MEM_DECOMMIT invoke VirtualFree,_lpUdpPackAddrBuf,0,MEM_RELEASE invoke VirtualFree,_lpRecordingBuf,_dwRecordingBackupBufSize,MEM_DECOMMIT invoke VirtualFree,_lpRecordingBuf,0,MEM_RELEASE invoke VirtualFree,_lpRecordReservedBuf,_dwRecordingBackupBufSize,MEM_DECOMMIT invoke VirtualFree,_lpRecordReservedBuf,0,MEM_RELEASE invoke VirtualFree,_lpRecordingIndexBuf,_dwIndexBackupBufSize,MEM_DECOMMIT invoke VirtualFree,_lpRecordingIndexBuf,0,MEM_RELEASE invoke VirtualFree,_lpIndexReservedBuf,_dwIndexBackupBufSize,MEM_DECOMMIT invoke VirtualFree,_lpIndexReservedBuf,0,MEM_RELEASE invoke VirtualFree,_lpRltDataTableBuf,_dwRltDataTableBufSize,MEM_DECOMMIT invoke VirtualFree,_lpRltDataTableBuf,0,MEM_RELEASE invoke VirtualFree,_lpReadQueueInfoBuf,_dwReadQueueInfoBufSize,MEM_DECOMMIT invoke VirtualFree,_lpReadQueueInfoBuf,0,MEM_RELEASE invoke UnmapViewOfFile,_lpPointDirBuf invoke CloseHandle,_hFileMapPointDir invoke CloseHandle,_hFilePointDir invoke UnmapViewOfFile,_lpUserInfoBuf invoke CloseHandle,_hFileMappingUserInfo invoke CloseHandle,_hFileUserInfo invoke CloseHandle,_hEventStoreRecording invoke CloseHandle,_hEventRealTimeData invoke CloseHandle,_hThreadWaitSamplePeriod invoke CloseHandle,_hThreadRealTimeData invoke CloseHandle,_hThreadUdpUnpack invoke CloseHandle,_hThreadStoreRecording invoke CloseHandle,_hThreadRecvUdpPack invoke CloseHandle,_hFileDataBase invoke CloseHandle,_hFileIndex invoke CloseHandle,_hFileJournal invoke LeaveCriticalSection,addr _stCriticalPointDir invoke DeleteCriticalSection,addr _stCriticalUserInfo invoke DeleteCriticalSection,addr _stCriticalPointDir invoke DeleteCriticalSection,addr _stCriticalDcsToMem invoke DeleteCriticalSection,addr _stCriticalMemToFile invoke DeleteCriticalSection,addr _stCriticalRealTime invoke DeleteCriticalSection,addr _stCriticalReadData invoke DeleteCriticalSection,addr _stCriticalTransInfo invoke SetUnhandledExceptionFilter,_lpOldExceptionFilter invoke ExitProcess,0 pop edi pop esi pop ebx mov eax,1 mov edx,0 leave retn 0 _ProcTerminate endp _ProcInit proc local @stWsaData:WSADATA local @dwCounter local @flOldProtect local @szBuffer[100h]:byte local @szBuf[200h]:byte push ebx push esi push edi call _ProcOpenFile invoke WSAStartup,0202h,addr @stWsaData .if eax!=ERROR_SUCCESS jmp WsaStartupError .endif invoke socket,AF_INET,SOCK_DGRAM,IPPROTO_UDP .if eax==SOCKET_ERROR jmp SocketError .endif mov _hSockRecv,eax mov _stRecvAddr.sin_family,AF_INET invoke htons,UDP_PORT mov _stRecvAddr.sin_port,ax mov _stRecvAddr.sin_addr,INADDR_ANY invoke bind,_hSockRecv,addr _stRecvAddr,sizeof sockaddr_in .if eax==SOCKET_ERROR invoke closesocket,_hSockRecv SocketError: invoke WSACleanup WsaStartupError: lea eax,@szBuffer push eax call _ProcSysTimeToAsc invoke wsprintf,addr @szBuf,addr szSocketError,addr @szBuffer mov ecx,eax invoke WriteFile,_hFileJournal,addr @szBuf,ecx,addr @dwCounter,0 call _ProcTerminate invoke ExitProcess,0 .endif lea ebx,_ProcNewExceptionFilter invoke SetUnhandledExceptionFilter,ebx mov _lpOldExceptionFilter,eax invoke InitializeCriticalSection,addr _stCriticalUserInfo invoke InitializeCriticalSection,addr _stCriticalPointDir invoke InitializeCriticalSection,addr _stCriticalDcsToMem invoke InitializeCriticalSection,addr _stCriticalMemToFile invoke InitializeCriticalSection,addr _stCriticalRealTime invoke InitializeCriticalSection,addr _stCriticalReadData invoke InitializeCriticalSection,addr _stCriticalTransInfo mov ebx,_stSystemInfo.dwPageSize mov ecx,ebx shl ecx,BUF_MULTI_RATIO mov eax,_dwDcsSampleCnt shl eax,2 add eax,sizeof SYSTEMTIME push eax push ebx dec ebx and eax,ebx pop ebx sub ebx,eax add ecx,ebx pop eax add eax,ecx mov _dwDataRecordingSize,eax shr ecx,2 mov _dwFreeRecordCnt,ecx mov eax,_dwStoreRecordingPeriod mov edx,0 mov ebx,_dwSamplePeriod div ebx mov _dwRecordingLimitOfBuf,eax mov ebx,_dwDataRecordingSize mul ebx shl eax,BUF_MULTI_RATIO mov _dwRecordingBufSize,eax shl eax,2 mov _dwRecordingBackupBufSize,eax invoke VirtualAlloc,NULL,_dwRecordingBackupBufSize,MEM_RESERVE,PAGE_NOACCESS .if eax==0 invoke WriteFile,_hFileJournal,addr szMemAllocError,sizeof szMemAllocError-1,addr @dwCounter,0 call _ProcTerminate .endif mov _lpRecordingBuf,eax invoke VirtualAlloc,_lpRecordingBuf,_dwRecordingBufSize,MEM_COMMIT,PAGE_READWRITE .if eax==0 invoke WriteFile,_hFileJournal,addr szMemAllocError,sizeof szMemAllocError-1,addr @dwCounter,0 call _ProcTerminate .endif mov _lpRecordingBuf,eax mov _lpRecordingBufHead,eax mov _lpRecordingBufEnd,eax mov ecx,_dwRecordingBufSize shr ecx,BUF_MULTI_RATIO add eax,ecx mov _lpRecordingBufLimit,eax mov ebx,_lpRecordingBuf add ebx,_dwRecordingBufSize sub ebx,ecx invoke VirtualProtect,ebx,ecx,PAGE_READWRITE OR PAGE_GUARD,addr @flOldProtect invoke VirtualAlloc,NULL,_dwRecordingBackupBufSize,MEM_RESERVE,PAGE_NOACCESS .if eax==0 invoke WriteFile,_hFileJournal,addr szMemAllocError,sizeof szMemAllocError-1,addr @dwCounter,0 call _ProcTerminate .endif mov _lpRecordReservedBuf,eax invoke VirtualAlloc,_lpRecordReservedBuf,_dwRecordingBufSize,MEM_COMMIT,PAGE_READWRITE .if eax==0 invoke WriteFile,_hFileJournal,addr szMemAllocError,sizeof szMemAllocError-1,addr @dwCounter,0 call _ProcTerminate .endif mov _lpRecordReservedBuf,eax mov _lpRecordReservedBufHead,eax mov ecx,_dwRecordingBufSize shr ecx,BUF_MULTI_RATIO add eax,ecx mov _lpRecordReservedBufLimit,eax mov ebx,_lpRecordReservedBuf add ebx,_dwRecordingBufSize sub ebx,ecx invoke VirtualProtect,ebx,ecx,PAGE_READWRITE OR PAGE_GUARD,addr @flOldProtect mov eax,_dwRecordingLimitOfBuf mov ebx,RECORDING_INDEX_SIZE mul ebx shl eax,BUF_MULTI_RATIO mov _dwRecordingIndexBufSize,eax shl eax,2 mov _dwIndexBackupBufSize,eax invoke VirtualAlloc,NULL,_dwIndexBackupBufSize,MEM_RESERVE,PAGE_NOACCESS .if eax==0 invoke WriteFile,_hFileJournal,addr szMemAllocError,sizeof szMemAllocError-1,addr @dwCounter,0 call _ProcTerminate .endif mov _lpRecordingIndexBuf,eax invoke VirtualAlloc,_lpRecordingIndexBuf,_dwRecordingIndexBufSize,MEM_COMMIT,PAGE_READWRITE .if eax==0 invoke WriteFile,_hFileJournal,addr szMemAllocError,sizeof szMemAllocError-1,addr @dwCounter,0 call _ProcTerminate .endif mov _lpRecordingIndexBuf,eax mov _lpRecordingIndexBufHead,eax mov _lpRecordingIndexBufEnd,eax mov ecx,_dwRecordingIndexBufSize shr ecx,BUF_MULTI_RATIO add eax,ecx mov _lpRecordingIndexBufLimit,eax mov ebx,_lpRecordingIndexBuf add ebx,_dwRecordingIndexBufSize sub ebx,ecx invoke VirtualProtect,ebx,ecx,PAGE_READWRITE OR PAGE_GUARD,addr @flOldProtect invoke VirtualAlloc,NULL,_dwIndexBackupBufSize,MEM_RESERVE,PAGE_NOACCESS .if eax==0 invoke WriteFile,_hFileJournal,addr szMemAllocError,sizeof szMemAllocError-1,addr @dwCounter,0 call _ProcTerminate .endif mov _lpIndexReservedBuf,eax invoke VirtualAlloc,_lpIndexReservedBuf,_dwRecordingIndexBufSize,MEM_COMMIT,PAGE_READWRITE .if eax==0 invoke WriteFile,_hFileJournal,addr szMemAllocError,sizeof szMemAllocError-1,addr @dwCounter,0 call _ProcTerminate .endif mov _lpIndexReservedBuf,eax mov _lpIndexReservedBufHead,eax mov ecx,_dwRecordingIndexBufSize shr ecx,BUF_MULTI_RATIO add eax,ecx mov _lpIndexReservedBufLimit,eax mov ebx,_lpIndexReservedBuf add ebx,_dwRecordingIndexBufSize sub ebx,ecx invoke VirtualProtect,ebx,ecx,PAGE_READWRITE OR PAGE_GUARD,addr @flOldProtect mov eax,_dwRecordingBufSize mov _dwUdpPackRecvBufSize,eax invoke VirtualAlloc,NULL,_dwUdpPackRecvBufSize,MEM_COMMIT,PAGE_READWRITE .if eax==0 invoke WriteFile,_hFileJournal,addr szMemAllocError,sizeof szMemAllocError-1,addr @dwCounter,0 call _ProcTerminate .endif mov _lpUdpPackRecvBuf,eax mov _lpUdpPackRecvBufHead,eax mov _lpUdpPackRecvBufEnd,eax add eax,_dwUdpPackRecvBufSize mov _lpUdpPackRecvBufLimit,eax mov eax,_dwUdpPackRecvBufSize mov edx,0 mov ebx,UDP_PACKAGE_SIZE div ebx mov _dwUdpPackAddrBufSize,eax invoke VirtualAlloc,NULL,_dwUdpPackAddrBufSize,MEM_COMMIT,PAGE_READWRITE .if eax==0 invoke WriteFile,_hFileJournal,addr szMemAllocError,sizeof szMemAllocError-1,addr @dwCounter,0 call _ProcTerminate .endif mov _lpUdpPackAddrBuf,eax mov _lpUdpPackAddrBufHead,eax mov _lpUdpPackAddrBufEnd,eax add eax,_dwUdpPackAddrBufSize mov _lpUdpPackAddrBufLimit,eax mov eax,_stSystemInfo.dwPageSize mov _dwRltDataTableBufSize,eax invoke VirtualAlloc,NULL,_dwRltDataTableBufSize,MEM_COMMIT,PAGE_READWRITE .if eax==0 invoke WriteFile,_hFileJournal,addr szMemAllocError,sizeof szMemAllocError-1,addr @dwCounter,0 call _ProcTerminate .endif mov _lpRltDataTableBuf,eax mov edi,eax mov ecx,_dwRltDataTableBufSize shr ecx,2 mov eax,0ffffffffh cld rep stosd mov eax,_stSystemInfo.dwPageSize mov _dwReadQueueInfoBufSize,eax invoke VirtualAlloc,NULL,_dwReadQueueInfoBufSize,MEM_COMMIT,PAGE_READWRITE .if eax==0 invoke WriteFile,_hFileJournal,addr szMemAllocError,sizeof szMemAllocError-1,addr @dwCounter,0 call _ProcTerminate .endif mov _lpReadQueueInfoBuf,eax invoke CreateEvent,NULL,TRUE,FALSE,NULL .if eax==0 invoke WriteFile,_hFileJournal,addr szEventError,sizeof szEventError-1,addr @dwCounter,0 call _ProcTerminate .endif mov _hEventStoreRecording,eax invoke CreateEvent,NULL,TRUE,FALSE,NULL .if eax==0 invoke WriteFile,_hFileJournal,addr szEventError,sizeof szEventError-1,addr @dwCounter,0 call _ProcTerminate .endif mov _hEventRealTimeData,eax ;自动事件会丢失数据,为什么??? lea ebx, _ThreadRecvUdpPack invoke CreateThread,0,0,ebx,0,CREATE_SUSPENDED,0 .if eax==0 invoke WriteFile,_hFileJournal,addr szThreadError,sizeof szThreadError-1,addr @dwCounter,0 call _ProcTerminate .endif mov _hThreadRecvUdpPack,eax invoke SetThreadPriority,_hThreadRecvUdpPack,THREAD_PRIORITY_HIGHEST invoke ResumeThread,_hThreadRecvUdpPack lea ebx,_ThreadWaitSamplePeriod invoke CreateThread,0,0,ebx,0,CREATE_SUSPENDED,0 .if eax==0 invoke WriteFile,_hFileJournal,addr szThreadError,sizeof szThreadError-1,addr @dwCounter,0 call _ProcTerminate .endif mov _hThreadWaitSamplePeriod,eax invoke SetThreadPriority,_hThreadWaitSamplePeriod,THREAD_PRIORITY_HIGHEST invoke ResumeThread,_hThreadWaitSamplePeriod lea ebx,_ThreadRealTimeData invoke CreateThread,0,0,ebx,0,CREATE_SUSPENDED,0 .if eax==0 invoke WriteFile,_hFileJournal,addr szThreadError,sizeof szThreadError-1,addr @dwCounter,0 call _ProcTerminate .endif mov _hThreadRealTimeData,eax invoke SetThreadPriority,_hThreadRealTimeData,THREAD_PRIORITY_HIGHEST invoke ResumeThread,_hThreadRealTimeData lea ebx,_ThreadStoreRecording invoke CreateThread,0,0,ebx,0,0,0 .if eax==0 invoke WriteFile,_hFileJournal,addr szThreadError,sizeof szThreadError-1,addr @dwCounter,0 call _ProcTerminate .endif mov _hThreadStoreRecording,eax lea ebx,_ThreadUdpUnpack invoke CreateThread,0,0,ebx,0,0,0 .if eax==0 invoke WriteFile,_hFileJournal,addr szThreadError,sizeof szThreadError-1,addr @dwCounter,0 call _ProcTerminate .endif mov _hThreadUdpUnpack,eax pop edi pop esi pop ebx mov eax,1 mov edx,0 leave retn 0 ; 为何不能用RET指令:RET是宏指令,RETN是机器码 _ProcInit endp _ProcOpenFile proc local @stOverlappedRead:OVERLAPPED local @dwCounter local @dqFileSize:qword local @lpFileBuf local @lpPointDirEnd local @dwPointDirOrdinal local @lpCurrentPointHead local @dwPointIdLen local @szBuffer[100h]:byte local @szBuf[400h]:byte push ebx push esi push edi invoke GetDiskFreeSpace,0,offset _dwSecsPerClu,offset _dwBytesPerSec,offset _dwFreeCluCnt,offset _dwCluCnt invoke GetSystemInfo,addr _stSystemInfo invoke CreateFile,offset szJournalFileName,GENERIC_READ OR GENERIC_WRITE,FILE_SHARE_READ,0,OPEN_EXISTING,\ FILE_ATTRIBUTE_NORMAL or FILE_FLAG_RANDOM_ACCESS ,NULL .if eax==INVALID_HANDLE_VALUE invoke CreateFile,offset szJournalFileName,GENERIC_READ OR GENERIC_WRITE,FILE_SHARE_READ,0,CREATE_ALWAYS,\ FILE_ATTRIBUTE_NORMAL or FILE_FLAG_RANDOM_ACCESS,NULL mov _hFileJournal,eax lea eax,@szBuffer push eax call _ProcSysTimeToAsc invoke wsprintf,addr @szBuf,addr szInit,addr @szBuffer mov ecx,eax invoke WriteFile,_hFileJournal,addr @szBuf,ecx,addr @dwCounter,0 invoke WriteFile,_hFileJournal,addr szCreateJournal,sizeof szCreateJournal-1,addr @dwCounter,0 .else mov _hFileJournal,eax invoke SetFilePointerEx,_hFileJournal,0,0,0,FILE_END lea eax,@szBuffer push eax call _ProcSysTimeToAsc invoke wsprintf,addr @szBuf,addr szInit,addr @szBuffer mov ecx,eax invoke WriteFile,_hFileJournal,addr @szBuf,ecx,addr @dwCounter,0 invoke WriteFile,_hFileJournal,addr szOpenJournal,sizeof szOpenJournal-1,addr @dwCounter,0 .endif lea ebx,DllEntry invoke wsprintf,addr @szBuf,addr szDllEntry,ebx mov ecx,eax invoke WriteFile,_hFileJournal,addr @szBuf,ecx,addr @dwCounter,0 lea ebx,_ProcTerminate invoke wsprintf,addr @szBuf,addr szProcTerminate,ebx mov ecx,eax invoke WriteFile,_hFileJournal,addr @szBuf,ecx,addr @dwCounter,0 lea ebx,_ProcInit invoke wsprintf,addr @szBuf,addr szProcInit,ebx mov ecx,eax invoke WriteFile,_hFileJournal,addr @szBuf,ecx,addr @dwCounter,0 lea ebx,_ProcOpenFile invoke wsprintf,addr @szBuf,addr szProcOpenFile,ebx mov ecx,eax invoke WriteFile,_hFileJournal,addr @szBuf,ecx,addr @dwCounter,0 lea ebx,_ProcModifyData invoke wsprintf,addr @szBuf,addr szProcModifyData,ebx mov ecx,eax invoke WriteFile,_hFileJournal,addr @szBuf,ecx,addr @dwCounter,0 lea ebx,_ProcReadData invoke wsprintf,addr @szBuf,addr szProcReadData,ebx mov ecx,eax invoke WriteFile,_hFileJournal,addr @szBuf,ecx,addr @dwCounter,0 lea ebx,_ThreadReadData invoke wsprintf,addr @szBuf,addr szThreadReadData,ebx mov ecx,eax invoke WriteFile,_hFileJournal,addr @szBuf,ecx,addr @dwCounter,0 lea ebx,_ThreadSeekIndex invoke wsprintf,addr @szBuf,addr szThreadSeekIndex,ebx mov ecx,eax invoke WriteFile,_hFileJournal,addr @szBuf,ecx,addr @dwCounter,0 lea ebx,_ProcOverlappedRead invoke wsprintf,addr @szBuf,addr szProcOverlappedRead,ebx mov ecx,eax invoke WriteFile,_hFileJournal,addr @szBuf,ecx,addr @dwCounter,0 lea ebx,_ThreadReadSector invoke wsprintf,addr @szBuf,addr szThreadReadSector,ebx mov ecx,eax invoke WriteFile,_hFileJournal,addr @szBuf,ecx,addr @dwCounter,0 lea ebx,_ProcReadInterval invoke wsprintf,addr @szBuf,addr szProcReadInterval,ebx mov ecx,eax invoke WriteFile,_hFileJournal,addr @szBuf,ecx,addr @dwCounter,0 lea ebx,_ThreadWaitSamplePeriod invoke wsprintf,addr @szBuf,addr szThreadWaitSamplePeriod,ebx mov ecx,eax invoke WriteFile,_hFileJournal,addr @szBuf,ecx,addr @dwCounter,0 lea ebx,_ThreadRecvUdpPack invoke wsprintf,addr @szBuf,addr szThreadRecvUdpPack,ebx mov ecx,eax invoke WriteFile,_hFileJournal,addr @szBuf,ecx,addr @dwCounter,0 lea ebx,_ThreadUdpUnpack invoke wsprintf,addr @szBuf,addr szThreadUdpUnpack,ebx mov ecx,eax invoke WriteFile,_hFileJournal,addr @szBuf,ecx,addr @dwCounter,0 lea ebx,_ProcExceptionGuard invoke wsprintf,addr @szBuf,addr szProcExceptionGuard,ebx mov ecx,eax invoke WriteFile,_hFileJournal,addr @szBuf,ecx,addr @dwCounter,0 lea ebx,_ThreadStoreRecording invoke wsprintf,addr @szBuf,addr szThreadStoreRecording,ebx mov ecx,eax invoke WriteFile,_hFileJournal,addr @szBuf,ecx,addr @dwCounter,0 lea ebx,_ThreadJournalOfWriteInfo invoke wsprintf,addr @szBuf,addr szThreadJournalOfWriteInfo,ebx mov ecx,eax invoke WriteFile,_hFileJournal,addr @szBuf,ecx,addr @dwCounter,0 lea ebx,_ThreadRealTimeData invoke wsprintf,addr @szBuf,addr szThreadRealTimeData,ebx mov ecx,eax invoke WriteFile,_hFileJournal,addr @szBuf,ecx,addr @dwCounter,0 lea ebx,_ProcRegistryInfo invoke wsprintf,addr @szBuf,addr szProcRegistryInfo,ebx mov ecx,eax invoke WriteFile,_hFileJournal,addr @szBuf,ecx,addr @dwCounter,0 lea ebx,_ProcGetRealTimeData invoke wsprintf,addr @szBuf,addr szProcGetRealTimeData,ebx mov ecx,eax invoke WriteFile,_hFileJournal,addr @szBuf,ecx,addr @dwCounter,0 lea ebx,_ProcInsertPoint invoke wsprintf,addr @szBuf,addr szProcInsertPoint,ebx mov ecx,eax invoke WriteFile,_hFileJournal,addr @szBuf,ecx,addr @dwCounter,0 lea ebx,_ProcAddPoint invoke wsprintf,addr @szBuf,addr szProcAddPoint,ebx mov ecx,eax invoke WriteFile,_hFileJournal,addr @szBuf,ecx,addr @dwCounter,0 lea ebx,_ProcDeletePoint invoke wsprintf,addr @szBuf,addr szProcDeletePoint,ebx mov ecx,eax invoke WriteFile,_hFileJournal,addr @szBuf,ecx,addr @dwCounter,0 lea ebx,_ProcModifyPoint invoke wsprintf,addr @szBuf,addr szProcModifyPoint,ebx mov ecx,eax invoke WriteFile,_hFileJournal,addr @szBuf,ecx,addr @dwCounter,0 lea ebx,_ProcSeekPoint invoke wsprintf,addr @szBuf,addr szProcSeekPoint,ebx mov ecx,eax invoke WriteFile,_hFileJournal,addr @szBuf,ecx,addr @dwCounter,0 lea ebx,_ProcGetPointTable invoke wsprintf,addr @szBuf,addr szProcGetPointTable,ebx mov ecx,eax invoke WriteFile,_hFileJournal,addr @szBuf,ecx,addr @dwCounter,0 lea ebx,_ProcSeekUser invoke wsprintf,addr @szBuf,addr szProcSeekUser,ebx mov ecx,eax invoke WriteFile,_hFileJournal,addr @szBuf,ecx,addr @dwCounter,0 lea ebx,_ProcAddUser invoke wsprintf,addr @szBuf,addr szProcAddUser,ebx mov ecx,eax invoke WriteFile,_hFileJournal,addr @szBuf,ecx,addr @dwCounter,0 lea ebx,_ProcDeleteUser invoke wsprintf,addr @szBuf,addr szProcDeleteUser,ebx mov ecx,eax invoke WriteFile,_hFileJournal,addr @szBuf,ecx,addr @dwCounter,0 invoke CreateFile,offset szDataBaseFileName,GENERIC_READ or GENERIC_WRITE,FILE_SHARE_READ,0,OPEN_EXISTING,\ FILE_ATTRIBUTE_NORMAL or FILE_FLAG_OVERLAPPED or FILE_FLAG_NO_BUFFERING or FILE_FLAG_WRITE_THROUGH or \ FILE_FLAG_SEQUENTIAL_SCAN,NULL .if eax==INVALID_HANDLE_VALUE invoke CreateFile,offset szDataBaseFileName,GENERIC_READ or GENERIC_WRITE,FILE_SHARE_READ,0,CREATE_ALWAYS,\ FILE_ATTRIBUTE_NORMAL or FILE_FLAG_OVERLAPPED or FILE_FLAG_NO_BUFFERING or FILE_FLAG_WRITE_THROUGH or \ FILE_FLAG_SEQUENTIAL_SCAN,NULL mov _hFileDataBase,eax invoke WriteFile,_hFileJournal,addr szCreateDataBase,sizeof szCreateDataBase-1,addr @dwCounter,0 .else mov _hFileDataBase,eax invoke WriteFile,_hFileJournal,addr szOpenDataBase,sizeof szOpenDataBase-1,addr @dwCounter,0 .endif invoke VirtualAlloc,0,dword ptr _stSystemInfo.dwPageSize,MEM_COMMIT,PAGE_READWRITE .if eax==0 invoke WriteFile,_hFileJournal,addr szMemAllocError,sizeof szMemAllocError-1,addr @dwCounter,0 call _ProcTerminate .endif mov @lpFileBuf,eax invoke CreateFile,offset szIndexFileName,GENERIC_READ or GENERIC_WRITE,FILE_SHARE_READ,0,OPEN_EXISTING,\ FILE_ATTRIBUTE_NORMAL or FILE_FLAG_OVERLAPPED or FILE_FLAG_NO_BUFFERING or FILE_FLAG_WRITE_THROUGH or \ FILE_FLAG_SEQUENTIAL_SCAN,NULL .if eax!=INVALID_HANDLE_VALUE mov _hFileIndex,eax invoke GetFileSizeEx,_hFileIndex,addr @dqFileSize mov eax,dword ptr [@dqFileSize] mov edx,dword ptr [@dqFileSize+4] sub eax,_dwBytesPerSec sbb edx,0 lea esi,@stOverlappedRead mov dword ptr [esi+8],eax mov dword ptr [esi+12],edx mov dword ptr [esi],0 mov dword ptr [esi+4],0 invoke CreateEvent,0,TRUE,0,0 mov @stOverlappedRead.hEvent,eax invoke ReadFile,_hFileIndex,@lpFileBuf,_dwBytesPerSec,addr @dwCounter,addr @stOverlappedRead .if eax==0 invoke GetLastError .if eax==ERROR_IO_PENDING invoke WaitForSingleObject,@stOverlappedRead.hEvent,INFINITE invoke GetOverlappedResult,_hFileIndex,addr @stOverlappedRead,addr @dwCounter,TRUE mov eax,@dwCounter .if eax==_dwBytesPerSec jmp ToGetRecordCntSum .else jmp ToCreateNewIndexFile .endif .elseif eax==ERROR_HANDLE_EOF jmp ToCreateNewIndexFile .else jmp ToCreateNewIndexFile .endif .else mov eax,@dwCounter .if eax==_dwBytesPerSec ToGetRecordCntSum: sub eax,16 mov esi,@lpFileBuf mov edx,[eax+esi] mov dword ptr [_dqRecordingCntSum],edx mov edx,[eax+esi+4] mov dword ptr [_dqRecordingCntSum+4],edx invoke WriteFile,_hFileJournal,addr szOpenIndex,sizeof szOpenIndex-1,addr @dwCounter,0 .else jmp ToCreateNewIndexFile .endif .endif .else ToCreateNewIndexFile: invoke CreateFile,offset szIndexFileName,GENERIC_READ or GENERIC_WRITE,FILE_SHARE_READ,0,CREATE_ALWAYS,\ FILE_ATTRIBUTE_NORMAL or FILE_FLAG_OVERLAPPED or FILE_FLAG_NO_BUFFERING or FILE_FLAG_WRITE_THROUGH or \ FILE_FLAG_SEQUENTIAL_SCAN,NULL mov _hFileIndex,eax mov dword ptr _dqRecordingCntSum,0 mov dword ptr [_dqRecordingCntSum+4],0 invoke WriteFile,_hFileJournal,addr szCreateIndex,sizeof szCreateIndex-1,addr @dwCounter,0 .endif invoke CloseHandle,@stOverlappedRead.hEvent invoke VirtualFree,@lpFileBuf,_stSystemInfo.dwPageSize,MEM_DECOMMIT invoke VirtualFree,@lpFileBuf,0,MEM_RELEASE invoke CreateFile,offset szPointDirFileName,GENERIC_READ OR GENERIC_WRITE,0,0,OPEN_EXISTING,\ FILE_ATTRIBUTE_NORMAL or FILE_FLAG_RANDOM_ACCESS,NULL .if eax!=INVALID_HANDLE_VALUE mov _hFilePointDir,eax invoke WriteFile,_hFileJournal,addr szOpenPointDir,sizeof szOpenPointDir-1,addr @dwCounter,0 ToMemMapping: invoke GetFileSizeEx,_hFilePointDir,addr @dqFileSize invoke CreateFileMapping,_hFilePointDir,0,PAGE_READWRITE,0,FILE_POINTDIR_SIZE,0 ;计算方式比例大约为每条记录128B .if eax==0 invoke WriteFile,_hFileJournal,addr szFileMapError,sizeof szFileMapError-1,addr @dwCounter,0 call _ProcTerminate .endif mov _hFileMapPointDir,eax invoke MapViewOfFile,_hFileMapPointDir,FILE_MAP_READ or FILE_MAP_WRITE,0,0,0 .if eax==0 invoke WriteFile,_hFileJournal,addr szFileMapError,sizeof szFileMapError-1,addr @dwCounter,0 call _ProcTerminate .endif mov _lpPointDirBuf,eax mov esi,FILE_POINTDIR_SIZE cmp dword ptr [eax+esi-4],0 jnz NotFirstOpen mov ecx,dword ptr [@dqFileSize] mov _dwPointDirBufSize,ecx mov dword ptr [eax+esi-4],ecx jmp CheckEncrypted NotFirstOpen: mov ecx,dword ptr [eax+esi-4] mov _dwPointDirBufSize,ecx CheckEncrypted: cmp dword ptr [eax+esi-8],0 jz NotEncrypted mov dword ptr [eax+esi-8],0 mov esi,_lpPointDirBuf mov edi,_lpPointDirBuf mov ecx,FILE_POINTDIR_SIZE sub ecx,8 cld Decrypted: lodsb xor al,ENCRYPTION_KEY stosb loop Decrypted lea eax,@szBuffer push eax call _ProcSysTimeToAsc invoke wsprintf,addr @szBuf,addr szDecryptPointDir,addr @szBuffer mov ecx,eax invoke WriteFile,_hFileJournal,addr @szBuf,ecx,addr @dwCounter,0 .else invoke CreateFile,offset szPointDirFileName,GENERIC_READ OR GENERIC_WRITE,FILE_SHARE_READ,0,CREATE_ALWAYS,\ FILE_ATTRIBUTE_NORMAL or FILE_FLAG_RANDOM_ACCESS,NULL mov _hFilePointDir,eax invoke WriteFile,_hFileJournal,addr szCreatePointDir,sizeof szCreatePointDir-1,addr @dwCounter,0 jmp ToMemMapping .endif NotEncrypted: mov @dwPointDirOrdinal,0 mov ebx,_dwPointDirBufSize mov esi,_lpPointDirBuf add ebx,esi mov @lpPointDirEnd,ebx GetFirstDot: cmp esi,@lpPointDirEnd jae ReachFileEnd lodsb cmp al,2ch jnz GetFirstDot GetSecondDot: lodsb cmp al,2ch jnz GetSecondDot mov @dwPointIdLen,0 GetPointIdLen: lodsb cmp al,2ch jz CheckPointIdLen inc @dwPointIdLen jmp GetPointIdLen CheckPointIdLen: cmp @dwPointIdLen,0 jz ReachFileEnd GetPointInfoEnd: lodsb cmp esi,@lpPointDirEnd jae ReachFileEnd cmp al,0ah jnz GetPointInfoEnd inc @dwPointDirOrdinal jmp GetFirstDot ReachFileEnd: inc @dwPointDirOrdinal mov eax,@dwPointDirOrdinal cmp eax,1 jnz NotEmptyPointDir invoke WriteFile,_hFileJournal,addr szFileNoConfig,sizeof szFileNoConfig-1,addr @dwCounter,0 call _ProcTerminate NotEmptyPointDir: mov _dwDcsSampleCnt,eax invoke wsprintf,addr @szBuf,addr szDcsSampleCnt,dword ptr _dwDcsSampleCnt mov ecx,eax invoke WriteFile,_hFileJournal,addr @szBuf,ecx,addr @dwCounter,0 invoke CreateFile,offset szUserInfoFileName,GENERIC_READ OR GENERIC_WRITE,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0 cmp eax,INVALID_HANDLE_VALUE jz FirstOpenService mov _hFileUserInfo,eax jmp NextOperation FirstOpenService: invoke CreateFile,offset szUserInfoFileName,GENERIC_READ OR GENERIC_WRITE,FILE_SHARE_READ,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0 mov _hFileUserInfo,eax invoke WriteFile,_hFileUserInfo,addr szAdminLogon,sizeof szAdminLogon,addr @dwCounter,0 NextOperation: invoke GetFileSizeEx,_hFileUserInfo,addr @dqFileSize invoke CreateFileMapping,_hFileUserInfo,0,PAGE_READWRITE,0,FILE_USERINFO_SIZE,0 mov _hFileMappingUserInfo,eax invoke MapViewOfFile,_hFileMappingUserInfo,FILE_MAP_READ OR FILE_MAP_WRITE,0,0,0 mov _lpUserInfoBuf,eax mov esi,eax mov ebx,FILE_USERINFO_SIZE cmp dword ptr [esi+ebx-4],0 jnz ToGetUserInfoSize mov eax,dword ptr [@dqFileSize] mov dword ptr [esi+ebx-4],eax mov _dwUserInfoBufSize,eax jmp ToDecryptUserInfo ToGetUserInfoSize: mov eax,dword ptr [esi+ebx-4] mov _dwUserInfoBufSize,eax ToDecryptUserInfo: cmp dword ptr [esi+ebx-8],0 jz FileInfoDecrypt mov dword ptr [esi+ebx-8],0 mov ecx,FILE_USERINFO_SIZE sub ecx,8 mov esi,_lpUserInfoBuf mov edi,esi DecryptUserInfo: lodsb xor al,ENCRYPTION_KEY stosb loop DecryptUserInfo FileInfoDecrypt: lea eax,@szBuffer push eax call _ProcSysTimeToAsc invoke wsprintf,addr @szBuf,addr szDecryptUserInfo,addr @szBuffer mov ecx,eax invoke WriteFile,_hFileJournal,addr @szBuf,ecx,addr @dwCounter,0 pop edi pop esi pop ebx leave ;对于函数(不包括线程),若有调用参数或局部变量之一,则编译器默认加ENTER指令,因此要用LEAVE指令清空堆栈 retn 0 ;RET指令是宏指令,而RETN是机器码 _ProcOpenFile endp _ProcModifyData proc,lpszPointId,lpQueryTimeHead,lpModifyValue local @dwRecordHeadNum:qword local @dwSeekHeadOver local @dwSeekHeadFoundCnt local @lpRecordHeadPointer local @lpRecordHeadDateTime local @dwQueryDataBufSize local @lpQueryDataBuf local @dwQueryPointOrdinal local @lpModifyValuePointer local @dwModifyValueCnt local @dwSectorDetail local @dwBytesCnt local @dwPointIdLen local @lpFileEnd local @dqRecordHeadPointer:qword local @stQueryTimeHead:SYSTEMTIME local @stOverlapped:OVERLAPPED local @szBuf[100h]:byte local @szBuffer[80h]:byte push ebx push esi push edi lock inc dword ptr [_dwRunningThreadCnt] cld mov esi,lpszPointId GetPointIdLen: lodsb cmp al,0 jnz GetPointIdLen dec esi sub esi,lpszPointId cmp esi,0 jz ModifyFault mov @dwPointIdLen,esi mov @dwModifyValueCnt,0 mov esi,lpModifyValue mov @lpModifyValuePointer,esi GetValueCnt: lodsd cmp eax,0 jz GetValueCntOk inc dword ptr @dwModifyValueCnt jmp GetValueCnt GetValueCntOk: cmp dword ptr @dwModifyValueCnt,0 jz ModifyFault invoke EnterCriticalSection,addr _stCriticalPointDir mov ebx,_dwPointDirBufSize add ebx,_lpPointDirBuf mov @lpFileEnd,ebx mov @dwQueryPointOrdinal,0 mov esi,_lpPointDirBuf SeekFirstDot: lodsb cmp al,2ch jnz SeekFirstDot SeekSecondDot: lodsb cmp al,2ch jnz SeekSecondDot SeekPointId: mov edi,lpszPointId mov ecx,@dwPointIdLen repz cmpsb jz CheckLastChar GetEnterSymbol: lodsb cmp esi,@lpFileEnd jae NotFoundId cmp al,0ah jnz GetEnterSymbol inc @dwQueryPointOrdinal jmp SeekFirstDot NotFoundId: invoke LeaveCriticalSection,addr _stCriticalPointDir jmp ModifyFault CheckLastChar: lodsb cmp al,2ch jnz NotFoundId invoke LeaveCriticalSection,addr _stCriticalPointDir mov esi,lpQueryTimeHead mov eax,[esi] mov @stQueryTimeHead.wYear,ax mov eax,[esi+4] mov @stQueryTimeHead.wMonth,ax mov eax,[esi+8] mov @stQueryTimeHead.wDay,ax mov eax,[esi+12] mov @stQueryTimeHead.wHour,ax mov eax,[esi+16] mov @stQueryTimeHead.wMinute,ax mov eax,[esi+20] mov @stQueryTimeHead.wSecond,ax mov @stQueryTimeHead.wDayOfWeek,0 mov @stQueryTimeHead.wMilliseconds,0 mov @dwSeekHeadOver,0 mov @dwSeekHeadFoundCnt,0 lea esi,@dqRecordHeadPointer mov @lpRecordHeadPointer,esi lea esi,@stQueryTimeHead mov @lpRecordHeadDateTime,esi lea ebx,_ThreadSeekIndex lea esi,@lpRecordHeadDateTime invoke CreateThread,0,0,ebx,esi,0,0 invoke CloseHandle,eax WaitSeekHeadOver: mov eax,@dwSeekHeadOver test eax,1 jz WaitSeekHeadOver mov eax,@dwSeekHeadFoundCnt test eax,1 jz ModifyFault mov eax,@dwQueryPointOrdinal shl eax,2 add eax,sizeof SYSTEMTIME add dword ptr [@dqRecordHeadPointer],eax adc dword ptr [@dqRecordHeadPointer+4],0 mov eax,dword ptr [@dqRecordHeadPointer] mov ebx,_dwBytesPerSec dec ebx and eax,ebx mov @dwSectorDetail,eax not ebx and dword ptr [@dqRecordHeadPointer],ebx mov eax,_stSystemInfo.dwPageSize mov @dwQueryDataBufSize,eax invoke VirtualAlloc,NULL,@dwQueryDataBufSize,MEM_COMMIT,PAGE_READWRITE mov @lpQueryDataBuf,eax invoke CreateEvent,0,TRUE,0,0 mov @stOverlapped.hEvent,eax lea esi,@stOverlapped mov dword ptr [esi],0 mov dword ptr [esi+4],0 mov eax,dword ptr [@dqRecordHeadPointer] mov dword ptr [esi+8],eax mov eax,dword ptr [@dqRecordHeadPointer+4] mov dword ptr [esi+12],eax ToReadData: lea esi,@stOverlapped mov dword ptr [esi],0 mov dword ptr [esi+4],0 invoke ReadFile,_hFileDataBase,@lpQueryDataBuf,_dwBytesPerSec,addr @dwBytesCnt,addr @stOverlapped .if eax==0 invoke GetLastError .if eax==ERROR_IO_PENDING invoke GetOverlappedResult,_hFileDataBase,addr @stOverlapped,addr @dwBytesCnt,TRUE mov eax,@dwBytesCnt .if eax==_dwBytesPerSec jmp WriteData .else ToModifyError: jmp ModifyError .endif .elseif eax==ERROR_INVALID_USER_BUFFER invoke Sleep,0 jmp ToReadData .elseif eax==ERROR_NOT_ENOUGH_MEMORY invoke Sleep,0 jmp ToReadData .elseif eax==ERROR_HANDLE_EOF jmp ModifyComplete .else jmp ToModifyError .endif .else mov eax,@dwBytesCnt .if eax==_dwBytesPerSec jmp WriteData .else jmp ToModifyError .endif .endif WriteData: mov esi,@lpModifyValuePointer mov edi,@lpQueryDataBuf add edi,@dwSectorDetail movsd RewriteData: lea esi,@stOverlapped mov dword ptr [esi],0 mov dword ptr [esi+4],0 invoke WriteFile,_hFileDataBase,@lpQueryDataBuf,_dwBytesPerSec,addr @dwBytesCnt,addr @stOverlapped .if eax==0 invoke GetLastError .if eax==ERROR_IO_PENDING invoke GetOverlappedResult,_hFileDataBase,addr @stOverlapped,addr @dwBytesCnt,TRUE mov eax,@dwBytesCnt .if eax==_dwBytesPerSec jmp WriteDataOk .else jmp ToModifyError .endif .elseif eax==ERROR_INVALID_USER_BUFFER invoke Sleep,0 jmp RewriteData .elseif eax==ERROR_NOT_ENOUGH_MEMORY invoke Sleep,0 jmp RewriteData .elseif eax==ERROR_HANDLE_EOF jmp ModifyComplete .else jmp ToModifyError .endif .else mov eax,@dwBytesCnt .if eax==_dwBytesPerSec jmp WriteDataOk .else jmp ToModifyError .endif .endif WriteDataOk: dec dword ptr @dwModifyValueCnt cmp dword ptr @dwModifyValueCnt,0 jz ModifyComplete add dword ptr @lpModifyValuePointer,4 mov eax,_dwDataRecordingSize lea esi,@stOverlapped add dword ptr [esi+8],eax adc dword ptr [esi+12],0 jmp ToReadData ModifyComplete: invoke VirtualFree,@lpQueryDataBuf,@dwQueryDataBufSize,MEM_DECOMMIT invoke VirtualFree,@lpQueryDataBuf,0,MEM_RELEASE invoke CloseHandle,@stOverlapped.hEvent lea eax,@szBuffer push eax call _ProcSysTimeToAsc mov esi,@lpModifyValuePointer add esi,4 sub esi,lpModifyValue shr esi,2 invoke wsprintf,addr @szBuf,addr szModifyValue,addr @szBuffer,dword ptr [@dwRecordHeadNum+4],dword ptr [@dwRecordHeadNum],esi mov ecx,eax invoke WriteFile,_hFileJournal,addr @szBuf,ecx,addr @dwModifyValueCnt,0 lock dec dword ptr [_dwRunningThreadCnt] pop edi pop esi pop ebx mov eax,1 mov edx,0 leave retn 12 ModifyError: invoke VirtualFree,@lpQueryDataBuf,@dwQueryDataBufSize,MEM_DECOMMIT invoke VirtualFree,@lpQueryDataBuf,0,MEM_RELEASE invoke CloseHandle,@stOverlapped.hEvent ModifyFault: lock dec dword ptr [_dwRunningThreadCnt] pop edi pop esi pop ebx mov eax,0 mov edx,0 leave retn 12 ;注意RETN 与RET 指令编译器会翻译成不同的指令,在这里只能用RETN指令而不能用RET指令 _ProcModifyData endp _ProcReadData proc,lpszPointId,lpQueryTimeHead,lpQueryTimeEnd push ebx push esi push edi lock inc dword ptr [_dwRunningThreadCnt] invoke EnterCriticalSection,addr _stCriticalReadData mov esi,_lpReadQueueInfoBuf mov ebx,esi add ebx,_dwReadQueueInfoBufSize cld CheckValidPos: lodsd cmp eax,0 jz GetValidPos add esi,28 ;32B ervery struct cmp esi,ebx jb CheckValidPos invoke LeaveCriticalSection,addr _stCriticalReadData lock dec dword ptr [_dwRunningThreadCnt] pop edi pop esi pop ebx mov eax,0 mov edx,0 leave retn 12 GetValidPos: sub esi,4 mov eax,lpszPointId mov [esi],eax mov eax,lpQueryTimeHead mov [esi+4],eax mov eax,lpQueryTimeEnd mov [esi+8],eax push esi push esi push esi push esi invoke CreateEvent,0,TRUE,0,0 pop esi mov [esi+12],eax lea ebx,_ThreadReadData invoke CreateThread,0,0,ebx,esi,0,0 invoke CloseHandle,eax invoke LeaveCriticalSection,addr _stCriticalReadData pop esi invoke WaitForSingleObject,dword ptr [esi+12],INFINITE pop esi invoke CloseHandle,dword ptr [esi+12] pop esi mov eax,[esi+16] mov edx,[esi+20] pop edi pop esi pop ebx lock dec dword ptr [_dwRunningThreadCnt] leave ;调用参数或局部变量都需要恢复ESP,EBP retn 12 _ProcReadData endp ;这里传入的参数为年月日时分秒格式的6个整形变量 _ThreadReadData proc,lpReadInfo align qword local @dqBeginCnt:qword local @dqEndCnt:qword local @dqCntPerSec:qword local @dwTimeConst local @dwReadTimeCost local @szBuffer[100h]:byte local @szBuf[200h]:byte local @dwCounter local @dwSeekTimeCost local @dwFirstSeekTimes local @dqFirstSeekEndCnt:qword local @dqRecordHeadNum:qword local @dwSeekHeadOver local @dwSeekHeadFoundCnt local @lpRecordHeadPointer local @lpRecordHeadDateTime local @dwSecondSeekTimes local @dqSecondSeekEndCnt:qword local @dqRecordEndNum:qword local @dwSeekEndOver local @dwSeekEndFoundCnt local @lpRecordEndPointer local @lpRecordEndDateTime local @dwQueryDataBufSize local @dwReadSectorBufSize local @dwReadSectorErrorCnt local @dwSectorDetail local @dwQueryPointCnt ;local @dwReadRecordSum local @lpQueryDataBuf align qword local @dqDataPointer:qword local @dqRecordHeadPointer:qword local @dqRecordEndPointer:qword local @dwQueryPointOrdinal local @dwPointIdLen local @lpFileEnd local @stQueryTimeHead:SYSTEMTIME local @stQueryTimeEnd:SYSTEMTIME local @lpszPointId local @lpQueryTimeHead local @lpQueryTimeEnd invoke QueryPerformanceCounter,addr @dqBeginCnt cld mov esi,lpReadInfo lodsd mov @lpszPointId,eax lodsd mov @lpQueryTimeHead,eax lodsd mov @lpQueryTimeEnd,eax mov esi,@lpszPointId GetPointIdLen: lodsb cmp al,0 jnz GetPointIdLen dec esi sub esi,@lpszPointId cmp esi,0 jz ReadDataFault mov @dwPointIdLen,esi invoke EnterCriticalSection,addr _stCriticalPointDir mov ebx,_dwPointDirBufSize add ebx,_lpPointDirBuf mov @lpFileEnd,ebx mov @dwQueryPointOrdinal,0 mov esi,_lpPointDirBuf SeekFirstDot: lodsb cmp al,2ch jnz SeekFirstDot SeekSecondDot: lodsb cmp al,2ch jnz SeekSecondDot SeekPointId: mov edi,@lpszPointId mov ecx,@dwPointIdLen repz cmpsb jz CheckLastChar GetEnterSymbol: lodsb cmp esi,@lpFileEnd jae NotFoundId cmp al,0ah jnz GetEnterSymbol inc @dwQueryPointOrdinal jmp SeekFirstDot NotFoundId: invoke LeaveCriticalSection,addr _stCriticalPointDir jmp ReadDataFault CheckLastChar: lodsb cmp al,2ch jnz NotFoundId invoke LeaveCriticalSection,addr _stCriticalPointDir mov esi,@lpQueryTimeHead mov edi,@lpQueryTimeEnd mov ecx,6 repz cmpsd jae ReadDataFault mov esi,@lpQueryTimeHead mov eax,[esi] mov @stQueryTimeHead.wYear,ax mov ebx,[esi+4] mov @stQueryTimeHead.wMonth,bx mov ecx,[esi+8] mov @stQueryTimeHead.wDay,cx mov edx,[esi+12] mov @stQueryTimeHead.wHour,dx mov edi,[esi+16] mov @stQueryTimeHead.wMinute,di mov esi,[esi+20] mov @stQueryTimeHead.wSecond,si mov @stQueryTimeHead.wDayOfWeek,0 mov @stQueryTimeHead.wMilliseconds,0 mov esi,@lpQueryTimeEnd mov eax,[esi] mov @stQueryTimeEnd.wYear,ax mov ebx,[esi+4] mov @stQueryTimeEnd.wMonth,bx mov ecx,[esi+8] mov @stQueryTimeEnd.wDay,cx mov edx,[esi+12] mov @stQueryTimeEnd.wHour,dx mov edi,[esi+16] mov @stQueryTimeEnd.wMinute,di mov esi,[esi+20] mov @stQueryTimeEnd.wSecond,si mov @stQueryTimeEnd.wDayOfWeek,0 mov @stQueryTimeEnd.wMilliseconds,0 mov @dwSeekHeadOver,0 mov @dwSeekHeadFoundCnt,0 lea esi,@dqRecordHeadPointer mov @lpRecordHeadPointer,esi lea esi,@stQueryTimeHead mov @lpRecordHeadDateTime,esi lea ebx,_ThreadSeekIndex lea esi,@lpRecordHeadDateTime invoke CreateThread,0,0,ebx,esi,0,0 cmp eax,0 jnz CreateEventFirstOk mov dword ptr @dwSeekEndOver,1 mov dword ptr @dwSeekHeadOver,1 mov dword ptr @dwSeekHeadFoundCnt,0 mov dword ptr @dwSeekEndFoundCnt,0 jmp WaitSeekHeadOver CreateEventFirstOk: invoke CloseHandle,eax mov @dwSeekEndOver,0 mov @dwSeekEndFoundCnt,0 lea esi,@dqRecordEndPointer mov @lpRecordEndPointer,esi lea esi,@stQueryTimeEnd mov @lpRecordEndDateTime,esi lea ebx,_ThreadSeekIndex lea esi,@lpRecordEndDateTime invoke CreateThread,0,0,ebx,esi,0,0 cmp eax,0 jnz CreateEventSecondOk mov dword ptr @dwSeekEndOver,1 mov dword ptr @dwSeekEndFoundCnt,0 jmp WaitSeekHeadOver CreateEventSecondOk: invoke CloseHandle,eax WaitSeekHeadOver: invoke Sleep,SMALLEST_SAMPLE_PERIOD mov eax,@dwSeekHeadOver test eax,@dwSeekEndOver jz WaitSeekHeadOver mov eax,@dwSeekHeadFoundCnt test eax,@dwSeekEndFoundCnt jz ReadDataFault mov eax,dword ptr [@dqRecordEndPointer] mov edx,dword ptr [@dqRecordEndPointer+4] mov ebx,dword ptr [@dqRecordHeadPointer] mov ecx,dword ptr [@dqRecordHeadPointer+4] mov dword ptr [@dqDataPointer],ebx mov dword ptr [@dqDataPointer+4],ecx sub eax,ebx sbb edx,ecx mov ebx,_dwDataRecordingSize div ebx cmp eax,0 jz ReadDataFault mov @dwQueryPointCnt,eax mov eax,@dwQueryPointOrdinal shl eax,2 add eax,sizeof SYSTEMTIME add dword ptr [@dqDataPointer],eax adc dword ptr [@dqDataPointer+4],0 mov eax,dword ptr [@dqDataPointer] mov ebx,_dwBytesPerSec dec ebx and eax,ebx mov @dwSectorDetail,eax not ebx and dword ptr [@dqDataPointer],ebx mov eax,@dwQueryPointCnt mov ebx,4 add ebx,sizeof SYSTEMTIME mul ebx mov ebx,_stSystemInfo.dwPageSize dec ebx not ebx and eax,ebx add eax,_stSystemInfo.dwPageSize ;为何此处这样处理??防止内存越界????? add eax,_stSystemInfo.dwPageSize mov @dwQueryDataBufSize,eax invoke VirtualAlloc,NULL,@dwQueryDataBufSize,MEM_COMMIT,PAGE_READWRITE cmp eax,0 jz ReadDataFault mov @lpQueryDataBuf,eax mov edi,eax mov eax,@dwQueryDataBufSize mov dword ptr [edi],eax mov eax,@dwQueryPointCnt mov dword ptr [edi+4],eax add @lpQueryDataBuf,8 mov @dwReadSectorErrorCnt,0 lea eax,@dqRecordHeadPointer push eax call _ProcOverlappedRead cmp dword ptr @dwReadSectorErrorCnt,0 jnz ReadDataError mov esi,lpReadInfo mov edi,esi mov ecx,3 mov eax,0 rep stosd mov eax,@lpQueryDataBuf sub eax,8 mov [esi+16],eax mov edx,0 mov [esi+20],edx invoke SetEvent,dword ptr [esi+12] mov dword ptr [@dwTimeConst],1000000 invoke QueryPerformanceCounter,addr @dqEndCnt invoke QueryPerformanceFrequency,addr @dqCntPerSec finit ;DLL可以正常运行浮点指令 fild qword ptr @dqBeginCnt fild qword ptr @dqEndCnt fsub st(0),st(1) fild dword ptr @dwTimeConst fmul st(0),st(1) fild qword ptr @dqCntPerSec fdivp st(1),st(0) fist dword ptr @dwReadTimeCost finit ;DLL可以正常运行浮点指令 fild qword ptr @dqBeginCnt fild qword ptr @dqSecondSeekEndCnt fsub st(0),st(1) fild dword ptr @dwTimeConst fmul st(0),st(1) fild qword ptr @dqCntPerSec fdivp st(1),st(0) fist dword ptr @dwSeekTimeCost lea eax,@szBuffer push eax call _ProcSysTimeToAsc invoke wsprintf,addr @szBuf,addr szJournalSeek,addr @szBuffer,dword ptr @dwSecondSeekTimes,dword ptr @dwSeekTimeCost mov ecx,eax invoke WriteFile,_hFileJournal,addr @szBuf,ecx,addr @dwCounter,0 invoke wsprintf,addr @szBuf,addr szJournalRead,addr @szBuffer,dword ptr [@dqRecordHeadNum+4],dword ptr [@dqRecordHeadNum],\ dword ptr [@dqRecordEndNum+4],dword ptr [@dqRecordEndNum],dword ptr [@dwQueryPointCnt],dword ptr [@dwReadTimeCost] mov ecx,eax invoke WriteFile,_hFileJournal,addr @szBuf,ecx,addr @dwCounter,0 leave retn 4 ReadDataError: invoke VirtualFree,@lpQueryDataBuf,@dwQueryDataBufSize,MEM_DECOMMIT invoke VirtualFree,@lpQueryDataBuf,0,MEM_RELEASE ReadDataFault: mov esi,lpReadInfo mov edi,esi mov ecx,3 mov eax,0 rep stosd mov dword ptr [esi+16],0 mov dword ptr [esi+20],0 invoke SetEvent,dword ptr [esi+12] invoke WriteFile,_hFileJournal,addr szInputError,sizeof szInputError-1,addr @dwReadSectorErrorCnt,0 ErrorInputParam: leave retn 4 _ThreadReadData endp ;多个线程同时调用同一个函数有什么影响? ;上述所有线程存在于同一个进程中,共享相同的地址空间,共享函数同样存在于该共享地址空间中。 ;因为各个线程的SS:ESP不同,因此返回地址和入口参数不会混淆,若是在共享函数中存在中间性的暂时的局部变量, ;则所有线程都可能有机会改变这些局部变量,局部变量可能会在线程切换中发生改变,但是各个线程堆栈不同,共享函数不改变各个线程局部变量 ;sizeof计算数据(包括数组、变量、类型、结构体等)所占内存空间,用字节数表示。 _ThreadSeekIndex proc,lpSeekIndexInfo local @stOverlappedRead:OVERLAPPED local @dwReadCnt local @lpReadIndexBuf local @dwReadIndexBufSize local @dwBigBlockSize local @dwSeekTimes local @dqSeekingPtr:qword local @dqHeadOffset:qword local @dqEndOffset:qword cld invoke CreateEvent,0,TRUE,0,0 cmp eax,0 jz CreateEventFailure mov @stOverlappedRead.hEvent,eax mov eax,_dwBytesPerSec shl eax,4 mov @dwReadIndexBufSize,eax invoke VirtualAlloc,NULL,@dwReadIndexBufSize,MEM_COMMIT,PAGE_READWRITE cmp eax,0 jnz MemoryAllocOk invoke CloseHandle,@stOverlappedRead.hEvent CreateEventFailure: mov esi,lpSeekIndexInfo mov dword ptr [esi+8],0 mov dword ptr [esi+12],1 leave retn 4 MemoryAllocOk: mov @lpReadIndexBuf,eax mov dword ptr [@dqHeadOffset],0 mov dword ptr [@dqHeadOffset+4],0 mov edx,dword ptr [_dqRecordingCntSum+4] mov eax,dword ptr [_dqRecordingCntSum] mov ebx,_dwRecordingLimitOfBuf ;注意此处指令的作用是保证不会达到文件末尾而发生错误 dec ebx not ebx and eax,ebx shld edx,eax,5 shl eax,5 mov dword ptr [@dqEndOffset],eax mov dword ptr [@dqEndOffset+4],edx shrd eax,edx,1 shr edx,1 mov ebx,_dwBytesPerSec dec ebx not ebx and eax,ebx mov dword ptr [@dqSeekingPtr],eax mov dword ptr [@dqSeekingPtr+4],edx mov @dwSeekTimes,0 ToSearchRecording: mov eax,dword ptr [@dqEndOffset] mov edx,dword ptr [@dqEndOffset+4] sub eax,dword ptr [@dqHeadOffset] sbb edx,dword ptr [@dqHeadOffset+4] cmp edx,0 jg HalfSearch jl ReadError mov @dwBigBlockSize,eax cmp eax,0 jl ReadError cmp eax,@dwReadIndexBufSize jbe LastMiniBlock HalfSearch: inc @dwSeekTimes lea esi,@stOverlappedRead mov dword ptr [esi],0 mov dword ptr [esi+4],0 push dword ptr [@dqSeekingPtr] pop dword ptr [esi+8] push dword ptr [@dqSeekingPtr+4] pop dword ptr [esi+12] invoke ReadFile,_hFileIndex,@lpReadIndexBuf,_dwBytesPerSec,addr @dwReadCnt,addr @stOverlappedRead .if eax==NULL invoke GetLastError .if eax==ERROR_IO_PENDING invoke GetOverlappedResult,_hFileIndex,addr @stOverlappedRead,addr @dwReadCnt,TRUE mov eax,@dwReadCnt .if eax==_dwBytesPerSec jmp HalfCheckDateTime .else jmp ReadError .endif .elseif eax==ERROR_INVALID_USER_BUFFER invoke Sleep,0 jmp HalfSearch .elseif eax==ERROR_NOT_ENOUGH_MEMORY invoke Sleep,0 jmp HalfSearch .elseif eax==ERROR_HANDLE_EOF jmp ReadError .else jmp ReadError .endif .else mov eax,@dwReadCnt .if eax==_dwBytesPerSec jmp HalfCheckDateTime .else jmp ReadError .endif .endif ;local @dwRecordHeadNum ;local @dwSeekEndOver ;local @dwSeekEndFoundCnt ;local @lpRecordEndPointer ;local @lpRecordEndDateTime HalfCheckDateTime: mov esi,lpSeekIndexInfo mov esi,[esi] mov edi,@lpReadIndexBuf mov word ptr [edi+4],0 mov ecx,7 repe cmpsw ;此处可以改进,只需要比较7个 jz HalfSearchFind ja ToFileEnd jb ToFileHead ToFileEnd: mov eax,dword ptr [@dqSeekingPtr] mov edx,dword ptr [@dqSeekingPtr+4] mov dword ptr [@dqHeadOffset],eax mov dword ptr [@dqHeadOffset+4],edx mov ebx,dword ptr [@dqEndOffset] mov ecx,dword ptr [@dqEndOffset+4] sub ebx,eax sbb ecx,edx shrd ebx,ecx,1 shr ecx,1 mov eax,_dwBytesPerSec dec eax not eax and ebx,eax add dword ptr [@dqSeekingPtr],ebx adc dword ptr [@dqSeekingPtr+4],ecx jmp ToSearchRecording ToFileHead: mov eax,dword ptr [@dqSeekingPtr] mov edx,dword ptr [@dqSeekingPtr+4] mov dword ptr [@dqEndOffset],eax mov dword ptr [@dqEndOffset+4],edx sub eax,dword ptr [@dqHeadOffset] sbb edx,dword ptr [@dqHeadOffset+4] shrd eax,edx,1 shr edx,1 mov ebx,_dwBytesPerSec dec ebx not ebx and eax,ebx sub dword ptr [@dqSeekingPtr],eax sbb dword ptr [@dqSeekingPtr+4],edx jmp ToSearchRecording LastMiniBlock: inc @dwSeekTimes lea esi,@stOverlappedRead mov dword ptr [esi],0 mov dword ptr [esi+4],0 push dword ptr [@dqHeadOffset] pop dword ptr [esi+8] push dword ptr [@dqHeadOffset+4] pop dword ptr [esi+12] invoke ReadFile,_hFileIndex,@lpReadIndexBuf,@dwBigBlockSize,addr @dwReadCnt,addr @stOverlappedRead .if eax==0 ;MSDN说异步读写dwReadCount参数必须为0,但实际证明是错误的?到底怎么回事? invoke GetLastError .if eax==ERROR_IO_PENDING invoke GetOverlappedResult,_hFileIndex,addr @stOverlappedRead,addr @dwReadCnt,TRUE mov eax,@dwReadCnt .if eax==@dwBigBlockSize jmp LastCheckDateTime .else ReadError: mov esi,lpSeekIndexInfo mov dword ptr [esi+8],0 mov dword ptr [esi+12],1 invoke VirtualFree,@lpReadIndexBuf,@dwReadIndexBufSize,MEM_DECOMMIT invoke VirtualFree,@lpReadIndexBuf,0,MEM_RELEASE invoke CloseHandle,@stOverlappedRead.hEvent leave retn 4 .endif .elseif eax==ERROR_INVALID_USER_BUFFER invoke Sleep,0 jmp LastMiniBlock .elseif eax==ERROR_NOT_ENOUGH_MEMORY invoke Sleep,0 jmp LastMiniBlock .elseif eax==ERROR_HANDLE_EOF jmp ReadError .else jmp ReadError .endif .else mov eax,@dwReadCnt .if eax==@dwBigBlockSize jmp LastCheckDateTime .else jmp ReadError .endif .endif LastCheckDateTime: mov ecx,@dwReadCnt shr ecx,5 mov esi,lpSeekIndexInfo mov esi,[esi] mov edi,@lpReadIndexBuf Check: push ecx push esi push edi mov word ptr [edi+4],0 mov ecx,7 repz cmpsw jz LastBlockFind pop edi add edi,32 pop esi pop ecx loop Check jmp ReadError LastBlockFind: pop edi pop esi pop ecx add edi,14 HalfSearchFind: add edi,2 mov eax,[edi] ;此处不要忘记减1,最多45亿条记录 若一秒最多20条,最少可用8年 若一秒5条,最少30年 mov edx,[edi+4] sub eax,1 ;索引号从1开始 sbb edx,0 mov esi,lpSeekIndexInfo mov dword ptr [esi+16],eax mov dword ptr [esi+20],edx mov ebx,_dwDataRecordingSize ;此处由于32位运算限制了记录条数,以后将改为64位运算,取消这一限制 mul ebx mov edi,[esi+4] mov dword ptr [edi],eax mov dword ptr [edi+4],edx mov dword ptr [esi+8],1 ;先置找到标志,再置结束标志,为什么?????????? mov dword ptr [esi+12],1 ;注意结束查找标志应在取得记录偏移后才能置位,否则可能主线程已经被通知结束,而在读记录时发生错误 add esi,24 push esi invoke QueryPerformanceCounter,esi pop esi push @dwSeekTimes pop dword ptr [esi+8] invoke VirtualFree,@lpReadIndexBuf,@dwReadIndexBufSize,MEM_DECOMMIT invoke VirtualFree,@lpReadIndexBuf,0,MEM_RELEASE invoke CloseHandle,@stOverlappedRead.hEvent leave retn 4 _ThreadSeekIndex endp ;1个点2个OVERLAPPED结构,每个OVERLAPPED结构32字节,以1024个采样点为单位 ;开辟64k字节内存存放OVERLAPPED结构,每个OVERLAPPED结构32字节,共2048个OVERLAPPED结构 _ProcOverlappedRead proc,lpThreadParam local @dqRecordTimePtr:qword local @dqRecordValuePtr:qword local @lpOverlappedInfo local @dwOverlappedInfoSize local @lpOverlappedInfoPtr local @lpOverlappedInfoLimit local @lpQueryBuf local @lpQueryDataBufPointer local @lpQueryTimeBufPointer local @lpReadBuf local @dwReadBufSize local @dwSectorDetail local @dwReadRecordSum local @dwReadTimeSectorCnt local @dwReadValueSectorCnt local @dwCounter local @dwElementCnt local @dwOutStandingCnt local @dwReadSuccessCnt local @dwResendCnt ;local @dwReadSectorErrorCnt ;local @dwSectorDetail ;local @dwReadRecordSum ;local @lpQueryDataBuf ;local @dqDataPointer:qword ;local @dqRecordHeadPointer:qword ;<---参数入口指针 mov esi,lpThreadParam mov eax,[esi] mov edx,[esi+4] mov dword ptr [@dqRecordTimePtr],eax mov dword ptr [@dqRecordTimePtr+4],edx mov eax,[esi+8] mov edx,[esi+12] mov dword ptr [@dqRecordValuePtr],eax mov dword ptr [@dqRecordValuePtr+4],edx mov eax,[esi+16] mov @lpQueryBuf,eax mov eax,[esi+20] mov @dwReadRecordSum,eax mov eax,[esi+24] mov @dwSectorDetail,eax mov @dwOverlappedInfoSize,4000h invoke VirtualAlloc,0,@dwOverlappedInfoSize,MEM_COMMIT,PAGE_READWRITE mov @lpOverlappedInfo,eax mov @lpOverlappedInfoPtr,eax mov ecx,dword ptr @dwReadRecordSum cmp ecx,256 jb ReadCntMinor mov ecx,256 ReadCntMinor: mov @dwElementCnt,ecx mov eax,32 shl eax,1 mul ecx add eax,@lpOverlappedInfo mov @lpOverlappedInfoLimit,eax mov @dwReadBufSize,40000h invoke VirtualAlloc,0,@dwReadBufSize,MEM_COMMIT,PAGE_READWRITE mov @lpReadBuf,eax mov @lpQueryDataBufPointer,0 mov esi,@lpReadBuf mov edi,@lpOverlappedInfo mov ecx,@dwElementCnt InitOverlapped: push ecx push esi push edi mov [edi+20],esi mov eax,dword ptr [@dqRecordTimePtr] mov edx,dword ptr [@dqRecordTimePtr+4] mov [edi+8],eax mov [edi+12],edx add eax,_dwDataRecordingSize adc edx,0 mov dword ptr [@dqRecordTimePtr],eax mov dword ptr [@dqRecordTimePtr+4],edx push edi invoke CreateEvent,0,TRUE,0,0 pop edi mov [edi+16],eax mov eax,@lpQueryDataBufPointer add eax,@lpQueryBuf mov [edi+24],eax add dword ptr @lpQueryDataBufPointer,sizeof SYSTEMTIME ;这里目的指针分别加 pop edi add edi,32 pop esi add esi,_dwBytesPerSec push esi push edi mov [edi+20],esi mov eax,dword ptr [@dqRecordValuePtr] mov edx,dword ptr [@dqRecordValuePtr+4] mov [edi+8],eax mov [edi+12],edx add eax,_dwDataRecordingSize adc edx,0 mov dword ptr [@dqRecordValuePtr],eax mov dword ptr [@dqRecordValuePtr+4],edx push edi invoke CreateEvent,0,TRUE,0,0 pop edi mov [edi+16],eax mov eax,@lpQueryDataBufPointer add eax,@lpQueryBuf mov [edi+24],eax add dword ptr @lpQueryDataBufPointer,4 pop edi add edi,32 pop esi add esi,_dwBytesPerSec pop ecx dec ecx cmp ecx,0 jnz InitOverlapped mov ecx,@dwElementCnt shl ecx,1 mov esi,@lpOverlappedInfo LaunchRead: push ecx OverlappedReread: push esi invoke ReadFile,_hFileDataBase,dword ptr [esi+20],_dwBytesPerSec,addr @dwCounter,esi ;地址怎样寻址?实际上参数入栈已经寻址完毕 cmp eax,0 jnz CheckDirectRead invoke GetLastError cmp eax,ERROR_IO_PENDING jz SuccessLaunch cmp eax,ERROR_INVALID_USER_BUFFER jz BusyReading cmp eax,ERROR_NOT_ENOUGH_MEMORY jz BusyReading pop esi pop ecx jmp ReadSectorError CheckDirectRead: ;若是直接读完了,OVERLAPPED内部状态字节不变 mov eax,@dwCounter cmp eax,_dwBytesPerSec jz SuccessLaunch pop esi pop ecx jmp ReadSectorError BusyReading: pop esi mov dword ptr [esi],0 mov dword ptr [esi+4],0 invoke Sleep,0 jmp OverlappedReread SuccessLaunch: pop esi add esi,32 pop ecx loop LaunchRead mov eax,_dwDataRecordingSize mov ebx,64 mul ebx push eax push edx mov esi,lpThreadParam add eax,dword ptr [esi] adc edx,dword ptr [esi+4] mov dword ptr [@dqRecordTimePtr],eax mov dword ptr [@dqRecordTimePtr+4],edx pop edx pop eax add eax,dword ptr [esi+8] adc edx,dword ptr [esi+12] mov dword ptr [@dqRecordValuePtr],eax mov dword ptr [@dqRecordValuePtr+4],edx mov eax,sizeof SYSTEMTIME add eax,4 mov ebx,64 mul ebx add eax,@lpQueryBuf mov @lpQueryTimeBufPointer,eax add eax,sizeof SYSTEMTIME mov @lpQueryDataBufPointer,eax mov @dwReadTimeSectorCnt,0 mov @dwReadValueSectorCnt,0 mov @dwOutStandingCnt,0 mov @dwReadSuccessCnt,0 mov @dwResendCnt,0 ;检测OVERLAPPED状态,如果读完则取出放到缓冲区并发送下一个读请求,如果错误退出,如果没读完检测下一个 CheckTimeOverlappedStatus: mov eax,@dwReadTimeSectorCnt cmp eax,@dwReadRecordSum jnz TimeCntLess mov eax,@dwReadValueSectorCnt cmp eax,@dwReadRecordSum jz ReadOverlappedEnd jmp CheckValueOverlappedStaus TimeCntLess: mov esi,@lpOverlappedInfoPtr lodsd cmp eax,STATUS_PENDING ;每次发送都确保内核成功接收读请求,不会有别的值,只有等待和成功 jnz SendTimeRequestOk inc @dwOutStandingCnt jmp CheckTimeOverlappedEnd SendTimeRequestOk: cmp eax,STATUS_SUCCESS jnz ReadSectorError lodsd cmp eax,_dwBytesPerSec jnz ReadSectorError inc @dwReadSuccessCnt push esi mov edi,[esi+16] mov esi,[esi+12] mov ecx,4 rep movsd pop esi inc dword ptr @dwReadTimeSectorCnt mov dword ptr [esi-8],0 mov dword ptr [esi-4],0 mov eax,dword ptr [@dqRecordTimePtr] mov edx,dword ptr [@dqRecordTimePtr+4] mov dword ptr [esi],eax mov dword ptr [esi+4],edx add eax,_dwDataRecordingSize adc edx,0 mov dword ptr [@dqRecordTimePtr],eax mov dword ptr [@dqRecordTimePtr+4],edx mov eax,@lpQueryTimeBufPointer mov [esi+16],eax add eax,sizeof SYSTEMTIME add eax,4 mov @lpQueryTimeBufPointer,eax sub esi,8 SendReadTimeOverlapped: invoke ReadFile,_hFileDataBase,dword ptr [esi+20],_dwBytesPerSec,addr @dwCounter,esi cmp eax,0 jnz CheckReadTimeDirect invoke GetLastError cmp eax,ERROR_IO_PENDING jz CheckTimeOverlappedEnd cmp eax,ERROR_INVALID_USER_BUFFER jz ReadTimeBusying cmp eax,ERROR_NOT_ENOUGH_MEMORY jz ReadTimeBusying jmp ReadSectorError CheckReadTimeDirect: mov eax,@dwCounter cmp eax,_dwBytesPerSec jz CheckTimeOverlappedEnd jmp ReadSectorError ReadTimeBusying: inc @dwResendCnt ;cmp @dwResendCnt,4 ;invoke Sleep,128 TimeRequestNotVeryBusy: invoke SwitchToThread cmp eax,0 jz TimeRequestNotVeryBusy mov esi,@lpOverlappedInfoPtr mov dword ptr [esi],0 mov dword ptr [esi+4],0 jmp SendReadTimeOverlapped CheckTimeOverlappedEnd: add @lpOverlappedInfoPtr,32 CheckValueOverlappedStaus: mov eax,@dwReadValueSectorCnt cmp eax,@dwReadRecordSum jnz ValueCntLess mov eax,@dwReadTimeSectorCnt cmp eax,@dwReadRecordSum jz ReadOverlappedEnd jmp CheckTimeOverlappedStatus ValueCntLess: mov esi,@lpOverlappedInfoPtr lodsd cmp eax,STATUS_PENDING jnz SendValueRequestOk inc @dwOutStandingCnt jmp CheckValueOverlappedEnd SendValueRequestOk: cmp eax,STATUS_SUCCESS jnz ReadSectorError lodsd cmp eax,_dwBytesPerSec jnz ReadSectorError push esi mov edi,[esi+16] mov esi,[esi+12] add esi,@dwSectorDetail movsd pop esi inc dword ptr @dwReadValueSectorCnt mov dword ptr [esi-8],0 mov dword ptr [esi-4],0 mov eax,dword ptr [@dqRecordValuePtr] mov edx,dword ptr [@dqRecordValuePtr+4] mov dword ptr [esi],eax mov dword ptr [esi+4],edx add eax,_dwDataRecordingSize adc edx,0 mov dword ptr [@dqRecordValuePtr],eax mov dword ptr [@dqRecordValuePtr+4],edx mov eax,@lpQueryDataBufPointer mov [esi+16],eax add eax,sizeof SYSTEMTIME add eax,4 mov @lpQueryDataBufPointer,eax sub esi,8 SendReadValueOverlapped: invoke ReadFile,_hFileDataBase,dword ptr [esi+20],_dwBytesPerSec,addr @dwCounter,esi cmp eax,0 jnz CheckReadValueDirect invoke GetLastError cmp eax,ERROR_IO_PENDING jz CheckValueOverlappedEnd cmp eax,ERROR_INVALID_USER_BUFFER jz ReadValueBusying cmp eax,ERROR_NOT_ENOUGH_MEMORY jz ReadValueBusying jmp ReadSectorError CheckReadValueDirect: mov eax,@dwCounter cmp eax,_dwBytesPerSec jz CheckValueOverlappedEnd jmp ReadSectorError ReadValueBusying: inc @dwResendCnt ;cmp @dwResendCnt,16 ;invoke Sleep,128 ValueRequestNotVeryBusy: invoke SwitchToThread cmp eax,0 jz ValueRequestNotVeryBusy mov esi,@lpOverlappedInfoPtr mov dword ptr [esi],0 mov dword ptr [esi+4],0 jmp SendReadValueOverlapped CheckValueOverlappedEnd: add @lpOverlappedInfoPtr,32 mov esi,@lpOverlappedInfoPtr cmp esi,@lpOverlappedInfoLimit jnz CheckTimeOverlappedStatus mov esi,@lpOverlappedInfo mov @lpOverlappedInfoPtr,esi mov eax,@dwOutStandingCnt mov ebx,@dwElementCnt shr ebx,1 cmp eax,ebx jbe ContinueExcution ;AllRequestNotVeryBusy: ;invoke SwitchToThread ;cmp eax,0 ;jz AllRequestNotVeryBusy invoke Sleep,128 ContinueExcution: mov @dwOutStandingCnt,0 mov @dwReadSuccessCnt,0 mov @dwResendCnt,0 jmp CheckTimeOverlappedStatus ReadOverlappedEnd: invoke VirtualFree,@lpReadBuf,@dwReadBufSize,MEM_DECOMMIT invoke VirtualFree,@lpReadBuf,0,MEM_RELEASE mov esi,@lpOverlappedInfo mov ecx,@dwElementCnt FreeOverlappedEvent: push ecx push esi invoke CloseHandle,dword ptr [esi+16] pop esi add esi,32 pop ecx loop FreeOverlappedEvent invoke VirtualFree,@lpReadBuf,@dwReadBufSize,MEM_DECOMMIT invoke VirtualFree,@lpReadBuf,0,MEM_RELEASE mov esi,lpThreadParam mov dword ptr [esi+28],0 leave retn 4 ReadSectorError: invoke VirtualFree,@lpReadBuf,@dwReadBufSize,MEM_DECOMMIT invoke VirtualFree,@lpReadBuf,0,MEM_RELEASE mov esi,@lpOverlappedInfo mov ecx,@dwElementCnt FreeOverlapped: push ecx push esi invoke CloseHandle,dword ptr [esi+16] pop esi add esi,32 pop ecx loop FreeOverlapped invoke VirtualFree,@lpOverlappedInfo,@dwOverlappedInfoSize,MEM_DECOMMIT invoke VirtualFree,@lpOverlappedInfo,0,MEM_RELEASE mov esi,lpThreadParam mov dword ptr [esi+28],1 leave retn 4 _ProcOverlappedRead endp ;local @dwReadSliceErrorCnt ;local @dwSectorDetail ;local @dqDataPointer:qword ;local @lpQueryDataBuf ;local @lpReadSliceBuf ;local @dwThreadReadSliceCnt ;<---参数入口指针 ;local @dqRecordHeadPointer:qword ;local @dwSeekCntPerThread _ThreadReadSector proc,lpThreadParam local @stOverlappedData:OVERLAPPED local @stOverlappedTime:OVERLAPPED local @dwTimeReadCnt local @dwDataReadCnt local @dwSectorDetail local @lpQueryDataPointer local @lpReadValueBufPointer local @lpReadTimeBufPointer local @dwSeekCntPerThread invoke EnterCriticalSection,addr _stCriticalTransInfo ;加上该函数出错!!!!!为什么 cld mov esi,lpThreadParam mov eax,dword ptr [esi] mov ebx,4 add ebx,sizeof SYSTEMTIME mul ebx add eax,dword ptr [esi+8] mov @lpQueryDataPointer,eax mov eax,dword ptr [esi] ;注意:为何不能改变数据段地址?因为主程序还要释放该内存,若是改变了改地址,释放时出错 shl eax,1 mov ebx,_stSystemInfo.dwPageSize mul ebx add eax,dword ptr [esi+4] mov @lpReadTimeBufPointer,eax add eax,_stSystemInfo.dwPageSize mov @lpReadValueBufPointer,eax lock inc dword ptr [esi] ;lock 指令只能用于运算指令 lea edi,@stOverlappedTime mov dword ptr [edi],0 mov dword ptr [edi+4],0 mov eax,[esi-8] mov edx,[esi-4] mov dword ptr [edi+8],eax mov dword ptr [edi+12],edx mov eax,_dwDataRecordingSize lock add dword ptr [esi-8],eax lock adc dword ptr [esi-4],0 lea edi,@stOverlappedData mov dword ptr [edi],0 mov dword ptr [edi+4],0 mov eax,[esi+12] mov edx,[esi+16] mov dword ptr [edi+8],eax mov dword ptr [edi+12],edx mov eax,_dwDataRecordingSize lock add dword ptr [esi+12],eax lock adc dword ptr [esi+16],0 invoke LeaveCriticalSection,addr _stCriticalTransInfo mov eax,[esi+20] mov @dwSectorDetail,eax mov @dwSeekCntPerThread,0 invoke CreateEvent,0,TRUE,0,0 cmp eax,0 jz CreateEventFirstFailure mov @stOverlappedTime.hEvent,eax invoke CreateEvent,0,TRUE,0,0 cmp eax,0 jnz CreateEventAllOk invoke CloseHandle,@stOverlappedTime.hEvent CreateEventFirstFailure: mov esi,lpThreadParam lock dec dword ptr [esi] leave retn 4 CreateEventAllOk: mov @stOverlappedData.hEvent,eax mov eax,[esi+12] mov edx,[esi+16] sub eax,dword ptr [esi-8] sbb edx,dword ptr [esi-4] cmp eax,_dwBytesPerSec jae ReadAllSector ReadTimeSector: invoke ReadFile,_hFileDataBase,@lpReadTimeBufPointer,_dwBytesPerSec,addr @dwTimeReadCnt,addr @stOverlappedTime .if eax==0 invoke GetLastError .if eax==ERROR_IO_PENDING invoke WaitForSingleObject,@stOverlappedTime.hEvent,INFINITE invoke GetOverlappedResult,_hFileDataBase,addr @stOverlappedTime,addr @dwTimeReadCnt,TRUE mov eax,@dwTimeReadCnt .if eax==_dwBytesPerSec GetQueryInfo: mov esi,@lpReadTimeBufPointer mov edi,@lpQueryDataPointer mov ecx,4 rep movsd mov esi,@lpReadTimeBufPointer add esi,@dwSectorDetail movsd CheckReadTimeSectorEnd: inc @dwSeekCntPerThread mov eax,@dwSeekCntPerThread mov esi,lpThreadParam cmp eax,[esi-12] jae ThreadWorkEnd mov eax,4 add eax,sizeof SYSTEMTIME mov ebx,_stSystemInfo.dwNumberOfProcessors shl ebx,THREAD_CPU_RATIO mul ebx add @lpQueryDataPointer,eax lea esi,@stOverlappedTime mov dword ptr [esi],0 mov dword ptr [esi+4],0 mov eax,_dwDataRecordingSize mov ebx,_stSystemInfo.dwNumberOfProcessors shl ebx,THREAD_CPU_RATIO mul ebx add dword ptr [esi+8],eax adc dword ptr [esi+12],edx jmp ReadTimeSector .else ReadTimeSectorError: mov esi,lpThreadParam lock dec dword ptr [esi] lock inc dword ptr [esi+24] invoke CloseHandle,@stOverlappedTime.hEvent invoke CloseHandle,@stOverlappedData.hEvent leave retn 4 .endif .elseif eax==ERROR_INVALID_USER_BUFFER invoke Sleep,0 lea esi,@stOverlappedTime mov dword ptr [esi],0 mov dword ptr [esi+4],0 jmp ReadTimeSector .elseif eax==ERROR_NOT_ENOUGH_MEMORY invoke Sleep,0 lea esi,@stOverlappedTime mov dword ptr [esi],0 mov dword ptr [esi+4],0 jmp ReadTimeSector .elseif eax==ERROR_HANDLE_EOF jmp ThreadWorkEnd .else jmp ReadTimeSectorError .endif .else mov eax,@dwTimeReadCnt .if eax==_dwBytesPerSec jmp GetQueryInfo .else jmp ReadTimeSectorError .endif .endif ReadAllSector: invoke ReadFile,_hFileDataBase,@lpReadTimeBufPointer,_dwBytesPerSec,addr @dwTimeReadCnt,addr @stOverlappedTime .if eax==0 invoke GetLastError .if eax==ERROR_IO_PENDING ReadDataSector: invoke ReadFile,_hFileDataBase,@lpReadValueBufPointer,_dwBytesPerSec,addr @dwDataReadCnt,addr @stOverlappedData .if eax==0 invoke GetLastError .if eax==ERROR_IO_PENDING invoke WaitForSingleObject,@stOverlappedTime.hEvent,INFINITE invoke WaitForSingleObject,@stOverlappedData.hEvent,INFINITE invoke GetOverlappedResult,_hFileDataBase,addr @stOverlappedTime,addr @dwTimeReadCnt,TRUE invoke GetOverlappedResult,_hFileDataBase,addr @stOverlappedData,addr @dwDataReadCnt,TRUE CheckDataReadCnt: mov eax,@dwDataReadCnt .if eax==_dwBytesPerSec CheckTimeReadCnt: mov eax,@dwTimeReadCnt .if eax==_dwBytesPerSec jmp ReadNextSec .else ReadAllError: mov esi,lpThreadParam lock dec dword ptr [esi] lock inc dword ptr [esi+24] invoke CloseHandle,@stOverlappedTime.hEvent invoke CloseHandle,@stOverlappedData.hEvent leave retn 4 .endif .else jmp ReadAllError .endif .elseif eax==ERROR_INVALID_USER_BUFFER invoke Sleep,0 lea esi,@stOverlappedData mov dword ptr [esi],0 mov dword ptr [esi+4],0 jmp ReadDataSector .elseif eax==ERROR_NOT_ENOUGH_MEMORY invoke Sleep,0 lea esi,@stOverlappedData mov dword ptr [esi],0 mov dword ptr [esi+4],0 jmp ReadDataSector .elseif eax==ERROR_HANDLE_EOF jmp ThreadWorkEnd .else jmp ReadAllError .endif .else mov eax,@dwDataReadCnt .if eax==_dwBytesPerSec invoke GetOverlappedResult,_hFileDataBase,addr @stOverlappedTime,addr @dwTimeReadCnt,TRUE jmp CheckTimeReadCnt .else jmp ReadAllError .endif .endif .elseif eax==ERROR_INVALID_USER_BUFFER invoke Sleep,0 lea esi,@stOverlappedTime mov dword ptr [esi],0 mov dword ptr [esi+4],0 jmp ReadAllSector .ELSEIF eax==ERROR_NOT_ENOUGH_MEMORY invoke Sleep,0 lea esi,@stOverlappedTime mov dword ptr [esi],0 mov dword ptr [esi+4],0 jmp ReadAllSector .elseif eax==ERROR_HANDLE_EOF jmp ThreadWorkEnd .else jmp ReadAllError .endif .else mov eax,@dwTimeReadCnt .if eax==_dwBytesPerSec jmp ReadDataSector .else jmp ReadAllError .endif .endif ReadNextSec: mov esi,@lpReadTimeBufPointer mov edi,@lpQueryDataPointer mov ecx,4 rep movsd mov esi,@lpReadValueBufPointer add esi,@dwSectorDetail movsd CheckReadAllEnd: inc @dwSeekCntPerThread mov eax,@dwSeekCntPerThread mov esi,lpThreadParam cmp eax,[esi-12] jae ThreadWorkEnd mov eax,4 add eax,sizeof SYSTEMTIME mov ebx,_stSystemInfo.dwNumberOfProcessors shl ebx,THREAD_CPU_RATIO mul ebx add @lpQueryDataPointer,eax lea esi,@stOverlappedTime mov dword ptr [esi],0 mov dword ptr [esi+4],0 mov eax,_dwDataRecordingSize mov ebx,_stSystemInfo.dwNumberOfProcessors shl ebx,THREAD_CPU_RATIO mul ebx add dword ptr [esi+8],eax adc dword ptr [esi+12],edx lea esi,@stOverlappedData add dword ptr [esi+8],eax adc dword ptr [esi+12],edx mov dword ptr [esi],0 mov dword ptr [esi+4],0 jmp ReadAllSector ThreadWorkEnd: mov esi,lpThreadParam lock dec dword ptr [esi] invoke CloseHandle,@stOverlappedTime.hEvent invoke CloseHandle,@stOverlappedData.hEvent leave retn 4 _ThreadReadSector endp _ProcReadInterval proc,lpszPointId,lpQueryTimeHead,lpQueryTimeEnd,nSecInterval local @dwGroupCnt local @lpGroupBuf local @dwGroupBufSize local @lpReadParam local @lpRecvBuf local @dwItemCnt local @dwTotalValue push ebx push esi push edi lock inc dword ptr [_dwRunningThreadCnt] invoke EnterCriticalSection,addr _stCriticalReadData mov esi,_lpReadQueueInfoBuf mov ebx,esi add ebx,_dwReadQueueInfoBufSize cld CheckValidPos: lodsd cmp eax,0 jz GetValidPos add esi,28 ;32B ervery struct cmp esi,ebx jb CheckValidPos invoke LeaveCriticalSection,addr _stCriticalReadData InvalidParam: lock dec dword ptr [_dwRunningThreadCnt] pop edi pop esi pop ebx mov eax,0 mov edx,0 leave retn 16 GetValidPos: sub esi,4 mov @lpReadParam,esi mov eax,lpszPointId mov dword ptr [esi],eax mov eax,lpQueryTimeHead mov dword ptr [esi+4],eax mov eax,lpQueryTimeEnd mov dword ptr [esi+8],eax invoke CreateEvent,0,TRUE,0,0 mov esi,@lpReadParam mov dword ptr [esi+12],eax lea ebx,_ThreadReadData invoke CreateThread,0,0,ebx,esi,0,0 invoke CloseHandle,eax invoke LeaveCriticalSection,addr _stCriticalReadData mov esi,@lpReadParam invoke WaitForSingleObject,dword ptr [esi+12],INFINITE mov esi,@lpReadParam invoke CloseHandle,dword ptr [esi+12] mov esi,@lpReadParam mov esi,dword ptr [esi+16] cmp esi,0 jz InvalidParam mov @lpRecvBuf,esi mov eax,nSecInterval mov ebx,1000 mul ebx mov ebx,_dwSamplePeriod div ebx mov @dwItemCnt,eax mov ebx,eax mov eax,dword ptr [esi+4] mov edx,0 div ebx cmp eax,0 jle InvalidParam mov @dwGroupCnt,eax mov ebx,4 add ebx,sizeof SYSTEMTIME mul ebx mov ebx,_stSystemInfo.dwPageSize dec ebx not ebx and eax,ebx add eax,_stSystemInfo.dwPageSize add eax,_stSystemInfo.dwPageSize mov @dwGroupBufSize,eax invoke VirtualAlloc,0,@dwGroupBufSize,MEM_COMMIT,PAGE_READWRITE mov @lpGroupBuf,eax mov ecx,@dwGroupBufSize mov dword ptr [eax],ecx mov ecx,@dwGroupCnt mov dword ptr [eax+4],ecx add dword ptr @lpGroupBuf,8 mov edi,@lpGroupBuf mov esi,@lpRecvBuf add esi,8 mov ecx,@dwGroupCnt NextEverageValue: push ecx mov ecx,4 rep movsd mov ecx,@dwItemCnt mov @dwTotalValue,0 GetTotalValue: lodsd add @dwTotalValue,eax add esi,sizeof SYSTEMTIME loop GetTotalValue mov eax,@dwTotalValue mov edx,0 mov ebx,@dwItemCnt div ebx stosd sub esi,sizeof SYSTEMTIME pop ecx loop NextEverageValue mov esi,@lpRecvBuf mov ecx,dword ptr [esi] invoke VirtualFree,@lpRecvBuf,ecx,MEM_DECOMMIT invoke VirtualFree,@lpRecvBuf,0,MEM_RELEASE mov eax,@lpGroupBuf sub eax,8 mov edx,0 pop edi pop esi pop ebx lock dec dword ptr [_dwRunningThreadCnt] leave retn 16 _ProcReadInterval endp _ThreadWaitSamplePeriod proc local @dqPrevRecvPackCnt:qword local @dwCounter cld lock inc dword ptr [_dwRunningThreadCnt] mov eax,dword ptr [_dqRecvPackCnt] mov edx,dword ptr [_dqRecvPackCnt+4] mov dword ptr [@dqPrevRecvPackCnt],eax mov dword ptr [@dqPrevRecvPackCnt+4],edx mov ecx,_dwSamplePeriod shl ecx,BUF_MULTI_RATIO invoke Sleep,ecx WaitTime: cmp dword ptr _flTerminate,1 jz KillThisThread invoke Sleep,_dwSamplePeriod mov eax,dword ptr [_dqRecvPackCnt] mov edx,dword ptr [_dqRecvPackCnt+4] cmp eax,dword ptr [@dqPrevRecvPackCnt] jz WaitTime mov dword ptr [@dqPrevRecvPackCnt],eax mov dword ptr [@dqPrevRecvPackCnt+4],edx push ebp lea ebx,_ProcExceptionGuard push ebx assume fs:nothing push fs:[0] mov fs:[0],esp mov esi,_lpRecordingBufHead invoke GetLocalTime,esi ;GetLocalTime参数是否只能先定义为SYSTEMTIME结构?空下16个字节不行么?????行!!!!! mov esi,_lpRecordingBufHead mov edi,_lpRecordingIndexBufHead mov ecx,8 rep movsw mov eax,dword ptr [_dqRecordingCntSum] mov edx,dword ptr [_dqRecordingCntSum+4] add eax,1 adc edx,0 mov dword ptr [_dqRecordingCntSum],eax mov dword ptr [_dqRecordingCntSum+4],edx stosd mov eax,edx stosd mov eax,_lpRecordingBufHead ;保存固定地址,实时值计算地址可以直接计算 mov _lpRealTimeDataBuf,eax invoke SetEvent,_hEventRealTimeData mov eax,_dwDataRecordingSize lock xadd _lpRecordingBufHead,eax mov ebx,RECORDING_INDEX_SIZE lock xadd _lpRecordingIndexBufHead,ebx mov eax,_lpRecordingIndexBufHead cmp eax,_lpRecordingIndexBufLimit jb ToWaitTime sub eax,_lpRecordingIndexBuf mov ebx,_dwBytesPerSec dec ebx and eax,ebx cmp eax,0 jnz ToWaitTime cmp dword ptr _flWriteBusying,1 jz ToWaitTime mov eax,dword ptr [_dqRecordingCntSum] mov edx,dword ptr [_dqRecordingCntSum+4] mov dword ptr [_dqFileTotalRecording],eax mov dword ptr [_dqFileTotalRecording+4],edx ;先换头指针,再换基地址,最后交换界限,为什么????? mov ebx,_lpRecordReservedBuf lock xchg dword ptr _lpRecordingBuf,ebx mov _lpRecordReservedBuf,ebx mov ecx,_lpRecordingBufHead lock xchg dword ptr _lpRecordReservedBufHead,ecx mov _lpRecordingBufHead,ecx mov ebx,_lpRecordReservedBufLimit lock xchg dword ptr _lpRecordingBufLimit,ebx mov _lpRecordReservedBufLimit,ebx mov esi,_lpIndexReservedBuf lock xchg dword ptr _lpRecordingIndexBuf,esi mov _lpIndexReservedBuf,esi mov edx,_lpRecordingIndexBufHead lock xchg dword ptr _lpIndexReservedBufHead,edx mov _lpRecordingIndexBufHead,edx mov esi,_lpIndexReservedBufLimit lock xchg dword ptr _lpRecordingIndexBufLimit,esi mov _lpIndexReservedBufLimit,esi invoke SetEvent,_hEventStoreRecording ToWaitTime: pop fs:[0] add esp,8 jmp WaitTime KillThisThread: lock dec dword ptr [_dwRunningThreadCnt] invoke SetEvent,_hEventStoreRecording ;用于控制写记录的线程结束 invoke WriteFile,_hFileJournal,addr szWaitSamplePeriodQuit,sizeof szWaitSamplePeriodQuit-1,addr @dwCounter,0 leave retn 0 _ThreadWaitSamplePeriod endp ;若是开启多个线程,还要解决多个线程的共享问题 _ThreadRecvUdpPack proc local @szBuf[100h]:byte local @szBuffer[80h]:byte local @dwCounter local @stSendAddr:sockaddr_in local @dwSendAddrSize:dword mov @dwSendAddrSize,sizeof sockaddr_in lock inc dword ptr [_dwRunningThreadCnt] cld RecvUdpData: invoke recvfrom,_hSockRecv,_lpUdpPackRecvBufHead,UDP_PACKAGE_SIZE,0,addr @stSendAddr,addr @dwSendAddrSize cmp eax,SOCKET_ERROR jz RecvFromError cmp eax,UDP_PACKAGE_SIZE jnz RecvFromError inc dword ptr [_dqRecvPackCnt] adc dword ptr [_dqRecvPackCnt+4],0 mov edi,_lpUdpPackAddrBufHead mov eax,_lpUdpPackRecvBufHead stosd cmp edi,_lpUdpPackAddrBufLimit jb PacketBufNotEnd mov edi,_lpUdpPackAddrBuf PacketBufNotEnd: mov _lpUdpPackAddrBufHead,edi mov eax,_lpUdpPackRecvBufHead add eax,UDP_PACKAGE_SIZE cmp eax,_lpUdpPackRecvBufLimit jb RecvNextUdpData mov eax,_lpUdpPackRecvBuf RecvNextUdpData: mov _lpUdpPackRecvBufHead,eax jmp RecvUdpData RecvFromError: lea eax,@szBuffer push eax call _ProcSysTimeToAsc invoke wsprintf,addr @szBuf,addr szRecvUdpPackError,addr @szBuffer mov ecx,eax invoke WriteFile,_hFileJournal,addr @szBuf,ecx,addr @dwCounter,0 lock dec dword ptr [_dwRunningThreadCnt] leave retn 0 _ThreadRecvUdpPack endp _ThreadUdpUnpack proc local @szBuf[100h]:byte local @szBuffer[80h]:byte local @dwCounter lock inc dword ptr [_dwRunningThreadCnt] cld NoPackNow: cmp dword ptr _flTerminate,1 jz KillThisThread invoke Sleep,SMALLEST_SAMPLE_PERIOD mov esi,_lpUdpPackAddrBufEnd cmp esi,_lpUdpPackAddrBufHead jz NoPackNow UnPackUdpData: push ebp lea ebx,_ProcExceptionGuard push ebx assume fs:nothing push fs:[0] mov fs:[0],esp mov esi,_lpUdpPackAddrBufEnd lodsd mov esi,eax test word ptr [esi+10],BOOL_PACK_FLAG jnz BoolData FloatData: movzx ecx,word ptr [esi+8] ;注意MOVZX指令的用法!!!!! cmp ecx,0 jz UnpackNext shr ecx,3 add esi,UDP_PACKAGE_HEADER_SIZE CopyFloatData: lodsw movzx edi,ax ;注意MOVZX指令的用法!!!!! shl edi,2 add edi,sizeof SYSTEMTIME add edi,dword ptr [_lpRecordingBufHead] add esi,2 movsd loop CopyFloatData jmp UnpackNext BoolData: movzx ecx,word ptr [esi+8] cmp ecx,0 jz UnpackNext shr ecx,2 add esi,UDP_PACKAGE_HEADER_SIZE CopyBoolData: lodsw movzx edi,ax shl edi,2 add edi,sizeof SYSTEMTIME add edi,dword ptr [_lpRecordingBufHead] lodsw movzx eax,ax stosd loop CopyBoolData UnpackNext: inc dword ptr [_dqUnPackCnt] adc dword ptr [_dqUnPackCnt+4],0 pop fs:[0] add esp,8 mov esi,_lpUdpPackAddrBufEnd add esi,4 cmp esi,_lpUdpPackAddrBufLimit jb PackEndNotReachLimit mov esi,_lpUdpPackAddrBuf PackEndNotReachLimit: mov _lpUdpPackAddrBufEnd,esi cmp esi,_lpUdpPackAddrBufHead jnz UnPackUdpData jmp NoPackNow KillThisThread: lock dec dword ptr [_dwRunningThreadCnt] invoke WriteFile,_hFileJournal,addr szUdpUnpackQuit,sizeof szUdpUnpackQuit-1,addr @dwCounter,0 leave retn 0 _ThreadUdpUnpack endp ;异常处理函数是由WINDOWS调用的,而且调用的时候是C格式调用,因此由WINDOWS负责恢复堆栈,所以RET返回时不必从堆栈弹出参数 ;而且如果按照STDCALL方式弹出堆栈参数后,WINDOWS也会自己恢复原来保存在WINDOWS空间的堆栈,因此自己弹出调用堆栈参数也不出错 _ProcExceptionGuard proc,lpExceptionRecord,lpSeh,lpContext,lpDispatcher local @szBuf[200h]:byte local @szBuffer[100h]:byte local @dwCounter pushad mov esi,lpExceptionRecord mov edi,lpContext assume esi:ptr EXCEPTION_RECORD,edi:ptr CONTEXT mov eax,[esi].ExceptionCode .if eax==STATUS_GUARD_PAGE_VIOLATION mov ebx,lpSeh mov [edi].regEsp,ebx push [ebx+8] pop [edi].regEbp push esi push edi lea eax,@szBuffer push eax call _ProcSysTimeToAsc pop edi pop esi invoke wsprintf,addr @szBuf,addr szGuardPageViolation,addr @szBuffer,[esi].ExceptionAddress,[esi].ExceptionCode,\ [esi].ExceptionFlags assume esi:nothing,edi:nothing mov ecx,eax invoke WriteFile,_hFileJournal,addr @szBuf,ecx,addr @dwCounter,0 popad mov eax,ExceptionContinueExecution leave retn 0 .elseif eax==EXCEPTION_ACCESS_VIOLATION AccessViolation: ;invoke SuspendThread,_hThreadWaitSamplePeriod ;加上这两个函数就卡住了,为什么?????????? ;invoke SuspendThread,_hThreadUdpUnpack mov esi,lpExceptionRecord mov edi,lpContext assume esi:ptr EXCEPTION_RECORD,edi:ptr CONTEXT mov ebx,[esi].ExceptionFlags test ebx,1 jz ExceptionContinueable call _ProcTerminate invoke ExitProcess,0 ExceptionContinueable: mov ebx,lpSeh mov [edi].regEsp,ebx push [ebx+8] pop [edi].regEbp push esi push edi lea eax,@szBuffer push eax call _ProcSysTimeToAsc pop edi pop esi invoke wsprintf,addr @szBuf,addr szMsgException,addr @szBuffer,[esi].ExceptionAddress,[esi].ExceptionCode,\ [esi].ExceptionFlags assume esi:nothing,edi:nothing mov ecx,eax invoke WriteFile,_hFileJournal,addr @szBuf,ecx,addr @dwCounter,0 cmp _flMemoryNotEnough,1 jz RequestMemoryError mov ebx,_lpRecordingBuf add ebx,_dwRecordingBufSize mov ecx,_dwRecordingBackupBufSize sub ecx,_dwRecordingBufSize invoke VirtualAlloc,ebx,ecx,MEM_COMMIT,PAGE_READWRITE mov ebx,_lpRecordingIndexBuf add ebx,_dwRecordingIndexBufSize mov ecx,_dwIndexBackupBufSize sub ecx,_dwRecordingIndexBufSize invoke VirtualAlloc,ebx,ecx,MEM_COMMIT,PAGE_READWRITE invoke SetThreadPriority,_hThreadStoreRecording,THREAD_PRIORITY_HIGHEST mov _flReadWriteBusy,1 mov _flMemoryNotEnough,1 invoke WriteFile,_hFileJournal,addr szExceptionReadWriteBusy,sizeof szExceptionReadWriteBusy-1,addr @dwCounter,0 ;invoke ResumeThread,_hThreadWaitSamplePeriod ;这两个函数不会得到执行,为什么?????????? ;invoke ResumeThread,_hThreadUdpUnpack popad mov eax,ExceptionContinueExecution leave retn 0 RequestMemoryError: mov ebx,_lpRecordingBuf lock xchg dword ptr _lpRecordingBufHead,ebx mov edx,_lpRecordingIndexBuf lock xchg dword ptr _lpRecordingIndexBufHead,edx invoke SetThreadPriority,_hThreadStoreRecording,THREAD_PRIORITY_HIGHEST mov _flReadWriteBusy,1 invoke WriteFile,_hFileJournal,addr szExceptionMemUnroll,sizeof szExceptionMemUnroll-1,addr @dwCounter,0 popad mov eax,ExceptionContinueExecution leave retn 0 .elseif eax==EXCEPTION_IN_PAGE_ERROR ;0C0000006H jmp AccessViolation .elseif eax==0c0000027h UnWindProc: invoke RtlUnwind,lpSeh,0,0,0 assume esi:nothing,edi:nothing popad mov eax,ExceptionContinueSearch leave retn 0 .elseif eax==80000003h ; int 3 .elseif eax==0c000001dh ; invalid instruction .elseif eax==0c0000094h ;dividen by 0 .elseif eax==80000004h ;int 1 .elseif eax==0c00000fdh ;stack overflow .else mov eax,dword ptr [esi+4] test eax,2 jnz UnWindProc test eax,4 jnz UnWindProc jmp AccessViolation .endif assume esi:nothing,edi:nothing popad mov eax,ExceptionContinueSearch leave retn 0 _ProcExceptionGuard endp ;Functions such as ReadFile and WriteFile set event handle to the nonsignaled state before they begin an I/O operation. ;When the operation has completed, the handle is set to the signaled state _ThreadStoreRecording proc align qword local @dqBeginCount:qword local @dqFileDataSize:qword local @dqFileIndexSize:qword local @dwRecordWriteCnt local @dwIndexWriteCnt local @stOverlappedRecord:OVERLAPPED local @stOverlappedIndex:OVERLAPPED local @dwRecordWriteSum local @dwIndexWriteSum local @szBuf[100h]:byte local @szBuffer[80h]:byte local @dwCounter local @dwWriteErrorCode lock inc dword ptr [_dwRunningThreadCnt] invoke CreateEvent,0,TRUE,0,0 mov @stOverlappedRecord.hEvent,eax invoke CreateEvent,0,TRUE,0,0 mov @stOverlappedIndex.hEvent,eax WaitWriteFile: invoke WaitForSingleObject,_hEventStoreRecording,INFINITE invoke ResetEvent,_hEventStoreRecording cmp dword ptr [_flTerminate],1 jz TerminateThisThread mov _flWriteBusying,1 invoke QueryPerformanceCounter,addr @dqBeginCount mov ecx,_lpRecordReservedBufHead sub ecx,_lpRecordReservedBuf mov @dwRecordWriteSum,ecx mov eax,_lpIndexReservedBufHead sub eax,_lpIndexReservedBuf mov @dwIndexWriteSum,eax lea esi,@stOverlappedIndex mov dword ptr [esi+8],0ffffffffh mov dword ptr [esi+12],0ffffffffh lea edi,@stOverlappedRecord mov dword ptr [edi+8],0ffffffffh mov dword ptr [edi+12],0ffffffffh invoke GetFileSizeEx,_hFileDataBase,addr @dqFileDataSize invoke GetFileSizeEx,_hFileDataBase,addr @dqFileIndexSize WriteData: lea esi,@stOverlappedRecord mov dword ptr [esi],0 mov dword ptr [esi+4],0 invoke WriteFile,_hFileDataBase,_lpRecordReservedBuf,dword ptr @dwRecordWriteSum,addr @dwRecordWriteCnt,addr @stOverlappedRecord .if eax==0 invoke GetLastError .if eax==ERROR_IO_PENDING WriteIndexAPC: lea esi,@stOverlappedIndex mov dword ptr [esi],0 mov dword ptr [esi+4],0 invoke WriteFile,_hFileIndex,_lpIndexReservedBuf,dword ptr @dwIndexWriteSum,addr @dwIndexWriteCnt,\ addr @stOverlappedIndex .if eax==0 invoke GetLastError .if eax==ERROR_IO_PENDING invoke WaitForSingleObject,@stOverlappedIndex.hEvent,INFINITE invoke GetOverlappedResult,_hFileIndex,addr @stOverlappedIndex,addr @dwIndexWriteCnt,TRUE CheckWriteCnt: invoke WaitForSingleObject,@stOverlappedRecord.hEvent,INFINITE invoke GetOverlappedResult,_hFileDataBase,addr @stOverlappedRecord,addr @dwRecordWriteCnt,TRUE mov eax,@dwIndexWriteCnt .if eax==@dwIndexWriteSum mov eax,@dwRecordWriteCnt .if eax==@dwRecordWriteSum jmp WriteFileOk .else WriteError: jmp WriteRecordingError .endif .else jmp WriteError .endif .elseif eax==ERROR_INVALID_USER_BUFFER invoke Sleep,0 jmp WriteIndexAPC .ELSEIF eax==ERROR_NOT_ENOUGH_MEMORY invoke Sleep,0 jmp WriteIndexAPC .else jmp WriteError .endif .else mov eax,@dwIndexWriteCnt .if eax==@dwIndexWriteSum jmp CheckWriteCnt .else jmp WriteError .endif .endif .elseif eax==ERROR_INVALID_USER_BUFFER invoke Sleep,0 jmp WriteData .ELSEIF eax==ERROR_NOT_ENOUGH_MEMORY invoke Sleep,0 jmp WriteData .else jmp WriteError .endif .else mov eax,@dwRecordWriteCnt .if eax==@dwRecordWriteSum jmp WriteIndexAPC .else jmp WriteError .endif .endif WriteFileOk: mov edi,_lpRecordReservedBuf mov ecx,_lpRecordReservedBufHead sub ecx,edi shr ecx,2 mov eax,INVALID_POINT_VALUE rep stosd mov edi,_lpIndexReservedBuf mov ecx,_lpIndexReservedBufHead sub ecx,edi shr ecx,2 rep stosd mov edx,_lpRecordReservedBuf lock xchg dword ptr _lpRecordReservedBufHead,edx mov ebx,_lpIndexReservedBuf lock xchg dword ptr _lpIndexReservedBufHead,ebx lea esi,@dqBeginCount lea ebx,_ThreadJournalOfWriteInfo invoke CreateThread,0,0,ebx,esi,0,0 invoke CloseHandle,eax ;mov _flWriteBusying,0 cmp _flReadWriteBusy,1 jnz WaitWriteFile mov ebx,_lpIndexReservedBuf add ebx,_dwRecordingIndexBufSize mov ecx,_dwIndexBackupBufSize sub ecx,_dwRecordingIndexBufSize invoke IsBadWritePtr,ebx,ecx cmp eax,0 jnz WaitWriteFile mov ebx,_lpRecordReservedBuf add ebx,_dwRecordingBufSize mov ecx,_dwRecordingBackupBufSize sub ecx,_dwRecordingBufSize invoke VirtualFree,ebx,ecx,MEM_DECOMMIT mov ebx,_lpIndexReservedBuf add ebx,_dwRecordingIndexBufSize mov ecx,_dwIndexBackupBufSize sub ecx,_dwRecordingIndexBufSize invoke VirtualFree,ebx,ecx,MEM_DECOMMIT invoke SetThreadPriority,_hThreadStoreRecording,THREAD_PRIORITY_NORMAL mov _flReadWriteBusy,0 mov _flMemoryNotEnough,0 invoke WriteFile,_hFileJournal,addr szExceptionReadWriteNotBusy,sizeof szExceptionReadWriteNotBusy-1,addr @dwCounter,0 jmp WaitWriteFile WriteRecordingError: lea eax,@szBuffer push eax call _ProcSysTimeToAsc invoke GetLastError mov @dwWriteErrorCode,eax invoke wsprintf,addr @szBuf,addr szRecordingWriteError,addr @szBuffer,@dwWriteErrorCode mov ecx,eax invoke WriteFile,_hFileJournal,addr @szBuf,ecx,addr @dwCounter,0 lea esi,@stOverlappedRecord mov eax,dword ptr [@dqFileDataSize] mov edx,dword ptr [@dqFileDataSize+4] mov dword ptr [esi+8],eax mov dword ptr [esi+12],edx lea edi,@stOverlappedIndex mov eax,dword ptr [@dqFileIndexSize] mov edx,dword ptr [@dqFileIndexSize+4] mov dword ptr [edi+8],eax mov dword ptr [edi+12],edx jmp WriteData ;忽略错误,继续写入 TerminateThisThread: invoke CloseHandle,@stOverlappedRecord.hEvent invoke CloseHandle,@stOverlappedIndex.hEvent lock dec dword ptr [_dwRunningThreadCnt] invoke WriteFile,_hFileJournal,addr szStoreRecordingQuit,sizeof szStoreRecordingQuit-1,addr @dwCounter,0 leave retn 0 _ThreadStoreRecording endp ;sizeof计算数据(包括数组、变量、类型、结构体等)所占内存空间,用字节数表示。 _ThreadJournalOfWriteInfo proc,lpBeginCount align qword local @dqBeginCount:qword local @dqEndCount:qword local @dqCountPerSec:qword local @dqWriteRecordCost:qword local @dwMicroSecPerSec local @szBuffer[100h]:byte local @szBuf[200h]:byte local @dwCounter lock inc dword ptr [_dwRunningThreadCnt] mov dword ptr @dwMicroSecPerSec,1000000 mov esi,lpBeginCount mov eax,[esi] mov edx,[esi+4] mov dword ptr [@dqBeginCount],eax mov dword ptr [@dqBeginCount+4],edx invoke QueryPerformanceCounter,addr @dqEndCount invoke QueryPerformanceFrequency,addr @dqCountPerSec finit fild qword ptr @dqBeginCount fild qword ptr @dqEndCount fsub st(0),st(1) fild dword ptr @dwMicroSecPerSec fmul st(0),st(1) fild qword ptr @dqCountPerSec fdivp st(1),st(0) fistp qword ptr @dqWriteRecordCost ;fistp可弹出64为整数,fist只能弹出32为整数????? lea eax,@szBuffer push eax call _ProcSysTimeToAsc invoke wsprintf,addr @szBuf,addr szJournalWrite,addr @szBuffer,dword ptr [_dqFileTotalRecording+4],\ dword ptr [_dqFileTotalRecording],dword ptr [@dqWriteRecordCost+4],dword ptr [@dqWriteRecordCost],\ dword ptr [_dqRecordingCntSum+4],dword ptr [_dqRecordingCntSum] mov ecx,eax invoke WriteFile,_hFileJournal,addr @szBuf,ecx,addr @dwCounter,0 invoke wsprintf,addr @szBuf,addr szJournalPack,addr @szBuffer,dword ptr dword ptr [_dqRecvPackCnt+4],dword ptr [_dqRecvPackCnt],\ dword ptr [_dqUnPackCnt+4],dword ptr [_dqUnPackCnt] mov ecx,eax invoke WriteFile,_hFileJournal,addr @szBuf,ecx,addr @dwCounter,0 lock dec dword ptr [_dwRunningThreadCnt] leave retn 4 _ThreadJournalOfWriteInfo endp _ThreadRealTimeData proc local @dwQueryPointOrdinal local @lpRltDataBufHead local @lpRltDataBufEnd local @lpDcsInputBufPointer local @lpDcsInputBuf cld lock inc dword ptr [_dwRunningThreadCnt] WaitEventRealTimeData: invoke WaitForSingleObject,_hEventRealTimeData,INFINITE invoke ResetEvent,_hEventRealTimeData cmp dword ptr [_flTerminate],1 jz TerminateThisThread mov esi,_lpRltDataTableBuf mov ecx,_dwRltDataTableBufSize shr ecx,3 cld CheckRealTimeDataRequest: push ecx push esi lodsd cmp eax,0ffffffffh jnz GetValidRequest CheckRequestEnd: pop esi add esi,8 pop ecx loop CheckRealTimeDataRequest jmp WaitEventRealTimeData GetValidRequest: mov @dwQueryPointOrdinal,eax lodsd cmp eax,[eax] jnz CheckRequestEnd mov @lpRltDataBufHead,eax add eax,_stSystemInfo.dwPageSize mov @lpRltDataBufEnd,eax mov esi,@lpRltDataBufHead mov edi,[esi+8] mov esi,_lpRealTimeDataBuf push esi mov ecx,4 rep movsd pop esi mov ebx,@dwQueryPointOrdinal shl ebx,2 add ebx,sizeof SYSTEMTIME add esi,ebx movsd cmp edi,@lpRltDataBufEnd jb PointerInRange mov esi,@lpRltDataBufHead mov edi,esi add edi,16 mov dword ptr [esi+8],edi jmp CheckRequestEnd PointerInRange: mov esi,@lpRltDataBufHead mov dword ptr [esi+8],edi jmp CheckRequestEnd TerminateThisThread: lock dec dword ptr [_dwRunningThreadCnt] leave retn 0 _ThreadRealTimeData endp _ProcRegistryInfo proc,lpszPointId,flSignal local @dwQueryPointOrdinal local @dwQueryPointIdLen local @lpPointDirFileEnd local @lpRealTimeDataBuf push ebx push esi push edi cld mov esi,lpszPointId GetPointIdLen: lodsb cmp al,0 jnz GetPointIdLen dec esi sub esi,lpszPointId cmp esi,0 jz ParamError mov @dwQueryPointIdLen,esi invoke EnterCriticalSection,addr _stCriticalPointDir mov ebx,_lpPointDirBuf add ebx,_dwPointDirBufSize mov @lpPointDirFileEnd,ebx mov @dwQueryPointOrdinal,0 mov esi,_lpPointDirBuf SeekFirstDot: lodsb cmp al,2ch jnz SeekFirstDot SeekSecondDot: lodsb cmp al,2ch jnz SeekSecondDot mov edi,lpszPointId mov ecx,@dwQueryPointIdLen repz cmpsb jz CheckLastChar GetEnterSymbol: lodsb cmp esi,@lpPointDirFileEnd jae ParamError cmp al,0ah jnz GetEnterSymbol inc @dwQueryPointOrdinal jmp SeekFirstDot ParamError: invoke LeaveCriticalSection,addr _stCriticalPointDir pop edi pop esi pop ebx mov eax,0 mov edx,0 leave retn 8 CheckLastChar: lodsb cmp al,2ch jnz ParamError invoke LeaveCriticalSection,addr _stCriticalPointDir cmp flSignal,0 jz CancelRegistryInfo mov esi,_lpRltDataTableBuf mov ecx,_dwRltDataTableBufSize shr ecx,3 CheckEmptyRoom: push ecx push esi lodsd cmp eax,0ffffffffh jz GetEmptyRoom pop esi add esi,8 pop ecx loop CheckEmptyRoom jmp RealTimeDataInfoBufFull GetEmptyRoom: invoke VirtualAlloc,NULL,_stSystemInfo.dwPageSize,MEM_COMMIT,PAGE_READWRITE mov @lpRealTimeDataBuf,eax pop esi pop ecx mov ebx,@dwQueryPointOrdinal mov dword ptr [esi],ebx mov dword ptr [esi+4],eax mov edi,@lpRealTimeDataBuf mov dword ptr [edi],eax add eax,16 mov dword ptr [edi+4],eax mov dword ptr [edi+8],eax pop edi pop esi pop ebx mov eax,1 mov edx,0 leave retn 8 RealTimeDataInfoBufFull: pop edi pop esi pop ebx mov eax,0 mov edx,0 leave retn 8 CancelRegistryInfo: mov esi,_lpRltDataTableBuf mov ecx,_dwRltDataTableBufSize shr ecx,3 CheckPointOrdinal: push ecx push esi lodsd cmp eax,@dwQueryPointOrdinal jz GetPointOrdinal pop esi add esi,8 pop ecx loop CheckPointOrdinal jmp NotFoundPointOrdinal GetPointOrdinal: pop esi pop ecx mov edi,[esi+4] mov dword ptr [esi],0ffffffffh mov dword ptr [esi+4],0ffffffffh push edi invoke VirtualFree,edi,_stSystemInfo.dwPageSize,MEM_DECOMMIT ;此处内存已释放,总函数不必释放了 pop edi invoke VirtualFree,edi,0,MEM_RELEASE pop edi pop esi pop ebx mov eax,1 mov edx,0 leave retn 8 NotFoundPointOrdinal: pop edi pop esi pop ebx mov eax,0 mov edx,0 leave retn 8 _ProcRegistryInfo endp _ProcGetRealTimeData proc,lpszPointId local @dwQueryPointOrdinal local @dwQueryPointIdLen local @lpPointDirFileEnd local @lpQueryDataBuf local @lpRealTimeDataBufHead local @lpRealTimeDataBufEnd local @dwRealTimeDataCnt push ebx push esi push edi cld mov esi,lpszPointId GetPointIdLen: lodsb cmp al,0 jnz GetPointIdLen dec esi sub esi,lpszPointId cmp esi,0 jz ErrorParam mov @dwQueryPointIdLen,esi invoke EnterCriticalSection,addr _stCriticalPointDir mov ebx,_dwPointDirBufSize add ebx,_lpPointDirBuf mov @lpPointDirFileEnd,ebx mov @dwQueryPointOrdinal,0 mov esi,_lpPointDirBuf SeekFirstDot: lodsb cmp al,2ch jnz SeekFirstDot SeekSecondDot: lodsb cmp al,2ch jnz SeekSecondDot mov edi,lpszPointId mov ecx,@dwQueryPointIdLen repz cmpsb jz CheckLastChar GetEnterSymbol: lodsb cmp esi,@lpPointDirFileEnd jae ErrorParam cmp al,0ah jnz GetEnterSymbol inc @dwQueryPointOrdinal jmp SeekFirstDot ErrorParam: invoke LeaveCriticalSection,addr _stCriticalPointDir pop edi pop esi pop ebx mov eax,0 mov edx,0 leave retn 4 CheckLastChar: lodsb cmp al,2ch jnz ErrorParam invoke LeaveCriticalSection,addr _stCriticalPointDir mov esi,_lpRltDataTableBuf mov ecx,_dwRltDataTableBufSize shr ecx,3 CheckRltDataTable: push ecx push esi lodsd cmp eax,@dwQueryPointOrdinal jz GetQueryPointOrdinal pop esi add esi,8 pop ecx loop CheckRltDataTable GetRealTimeDataError: pop edi pop esi pop ebx mov eax,0 mov edx,0 leave retn 4 GetQueryPointOrdinal: pop esi pop ecx mov eax,[esi+4] mov @lpRealTimeDataBufHead,eax cmp eax,dword ptr [eax] jnz GetRealTimeDataError invoke VirtualAlloc,NULL,_stSystemInfo.dwPageSize,MEM_COMMIT,PAGE_READWRITE mov @lpQueryDataBuf,eax mov dword ptr [eax],eax mov edi,eax add edi,8 ;接收缓冲比实时数据缓冲区大,因此复制时不会发生溢出 mov ebx,@lpRealTimeDataBufHead mov esi,[ebx+4] mov edx,[ebx+8] add ebx,_stSystemInfo.dwPageSize mov @dwRealTimeDataCnt,0 CopyDataToBuf: cmp esi,edx jz CopyDataOk cmp esi,ebx jae RewindEndPointer CopyToBuf: mov ecx,5 rep movsd inc @dwRealTimeDataCnt jmp CopyDataToBuf RewindEndPointer: mov esi,@lpRealTimeDataBufHead add esi,16 jmp CopyDataToBuf CopyDataOk: mov edi,@lpRealTimeDataBufHead mov [edi+4],esi mov ebx,@lpQueryDataBuf push @dwRealTimeDataCnt pop dword ptr [ebx+4] pop edi pop esi pop ebx mov eax,@lpQueryDataBuf mov edx,0 leave retn 4 _ProcGetRealTimeData endp ;所有的点的格式必须要保证格式,切最大长度不能超过256字节 _ProcInsertPoint proc stdcall,lpszPointID,lpszPointContent local @dwDotCnt local @lpCurrentRecordEnd local @lpCurrentRecordHead local @dwPointIdLen local @dwPointContentLen local @dwFileEndPos local @lpInsertID local @dwInsertIdLen local @lpInsertHead local @lpInsertEnd local @flFound local @lpszPointContent[200h]:byte local @szBuf[200h]:byte local @szBufTime[100h]:byte push ebx push esi push edi invoke EnterCriticalSection,addr _stCriticalPointDir cmp dword ptr _dwPointDirBufSize,0 jz InvalidParam cld mov esi,lpszPointID GetPointIdLen: lodsb cmp al,0 jnz GetPointIdLen dec esi sub esi,lpszPointID cmp esi,0 jz InvalidParam mov @dwPointIdLen,esi mov esi,lpszPointContent mov @dwDotCnt,0 GetInsertID: lodsb cmp al,2ch jnz GetInsertID inc @dwDotCnt cmp @dwDotCnt,2 jnz GetInsertID mov @lpInsertID,esi mov @dwInsertIdLen,0 GetInsertIdLen: lodsb cmp al,2ch jz GetInsertIdEnd inc @dwInsertIdLen jmp GetInsertIdLen GetInsertIdEnd: cmp @dwInsertIdLen,0 jz InvalidParam GetPointContentLen: lodsb cmp al,0 jnz GetPointContentLen dec esi sub esi,lpszPointContent cmp esi,0 jz InvalidParam mov @dwPointContentLen,esi mov esi,lpszPointContent lea edi,@lpszPointContent mov ecx,@dwPointContentLen rep movsb mov eax,0a0dh stosd add @dwPointContentLen,2 mov eax,_lpPointDirBuf add eax,_dwPointDirBufSize mov @dwFileEndPos,eax mov esi,_lpPointDirBuf mov @lpCurrentRecordHead,esi GetCurrentRecordEnd: lodsb cmp al,0ah jnz GetCurrentRecordEnd mov @lpCurrentRecordEnd,esi mov @flFound,0 mov @dwDotCnt,0 mov esi,_lpPointDirBuf GetRecordId: lodsb cmp al,2ch jnz GetRecordId inc @dwDotCnt cmp @dwDotCnt,2 jnz GetRecordId mov @dwDotCnt,0 mov ecx,@dwInsertIdLen mov edi,@lpInsertID push esi repz cmpsb jnz CheckInsertID lodsb cmp al,2ch jz FindSamePoint ;注意: 不能将比较运算完成后所得的ECX值作为比较相等的参考依据.原因是什么???????????? ;原因:例如若要比较1和2的值是否相等,他们的长度都为1,比较完成后ECX==0,但是他们却不相等 CheckInsertID: pop esi mov ecx,@dwPointIdLen mov edi,lpszPointID repz cmpsb jnz GetCurrentRecordStart lodsb cmp al,2ch jz GetNextRecordStart ;注意: 不能将比较运算完成后所得的ECX值作为比较相等的参考依据.原因是什么???????????? ;原因:例如若要比较1和2的值是否相等,他们的长度都为1,比较完成后ECX==0,但是他们却不相等 GetCurrentRecordStart: lodsb cmp esi,@dwFileEndPos jae GetPointEnd cmp al,0ah jnz GetCurrentRecordStart mov @lpCurrentRecordHead,esi jmp GetRecordId GetNextRecordStart: mov dword ptr @flFound,1 push @lpCurrentRecordHead pop @lpInsertHead GetNextRecordStartAddr: lodsb cmp esi,@dwFileEndPos jae FindPointEndLast cmp al,0ah jnz GetNextRecordStartAddr mov @lpInsertEnd,esi mov @lpCurrentRecordHead,esi jmp GetRecordId FindPointEndLast: mov @lpInsertEnd,esi GetPointEnd: mov @lpCurrentRecordEnd,esi cmp @flFound,1 jnz InvalidParam std mov eax,@lpInsertHead sub eax,_lpPointDirBuf mov ecx,_dwPointDirBufSize sub ecx,eax mov esi,_lpPointDirBuf add esi,_dwPointDirBufSize dec esi mov edi,esi add edi,@dwPointContentLen rep movsb lea esi,@lpszPointContent add esi,@dwPointContentLen dec esi mov ecx,@dwPointContentLen rep movsb cld mov ecx,@dwPointContentLen add _dwPointDirBufSize,ecx mov esi,FILE_POINTDIR_SIZE mov eax,_lpPointDirBuf push _dwPointDirBufSize pop dword ptr [esi+eax-4] mov eax,_dwFreeRecordCnt cmp eax,0 jz NotEnoughSpace lock inc dword ptr _dwDcsSampleCnt lock dec _dwFreeRecordCnt NotEnoughSpace: invoke LeaveCriticalSection,addr _stCriticalPointDir lea eax,@szBufTime push eax call _ProcSysTimeToAsc invoke wsprintf,addr @szBuf,addr szPointInsert,addr @szBufTime,lpszPointID,lpszPointContent mov ecx,eax invoke WriteFile,_hFileJournal,addr @szBuf,ecx,addr @dwDotCnt,0 pop edi pop esi pop ebx mov eax,1 mov edx,0 leave retn 8 FindSamePoint: pop esi InvalidParam: invoke LeaveCriticalSection,addr _stCriticalPointDir pop edi pop esi pop ebx mov eax,0 mov edx,0 leave retn 8 _ProcInsertPoint endp _ProcAddPoint proc,lpszPointContent local @dwPointContentLen local @dwPointIdLen local @dwFileEndPos local @dwDotCnt local @szBuf[200h]:byte local @szBufTime[100h]:byte local @lpPointID push ebx push esi push edi invoke EnterCriticalSection,addr _stCriticalPointDir cld mov esi,lpszPointContent mov @dwDotCnt,0 GetPointIdHeadPos: lodsb cmp al,2ch jnz GetPointIdHeadPos inc @dwDotCnt cmp @dwDotCnt,2 jnz GetPointIdHeadPos mov @lpPointID,esi mov @dwPointIdLen,0 GetPointIdLen: lodsb cmp al,2ch jz GetPointIdEndPos inc @dwPointIdLen jmp GetPointIdLen GetPointIdEndPos: cmp @dwPointIdLen,0 jz KeepLenth GetPointContentLen: lodsb cmp al,0 jnz GetPointContentLen dec esi sub esi,lpszPointContent cmp esi,0 jz KeepLenth mov @dwPointContentLen,esi cmp dword ptr _dwPointDirBufSize,0 jz ToAddPointDir mov eax,_lpPointDirBuf add eax,_dwPointDirBufSize mov @dwFileEndPos,eax mov @dwDotCnt,0 mov esi,_lpPointDirBuf GetRecordId: ;检查是否有重复的数据记录 lodsb cmp al,2ch jnz GetRecordId inc @dwDotCnt cmp @dwDotCnt,2 jnz GetRecordId mov @dwDotCnt,0 mov ecx,@dwPointIdLen mov edi,@lpPointID repz cmpsb jnz GetCurrentRecordHead lodsb cmp al,2ch jz KeepLenth ;注意: 不能将比较运算完成后所得的ECX值作为比较相等的参考依据.原因是什么???????????? ;原因:例如若要比较1和2的值是否相等,他们的长度都为1,比较完成后ECX==0,但是他们却不相等 GetCurrentRecordHead: lodsb cmp esi,@dwFileEndPos jae ToAddPointDir cmp al,0ah jnz GetCurrentRecordHead jmp GetRecordId ToAddPointDir: mov edi,_lpPointDirBuf add edi,_dwPointDirBufSize cmp word ptr [edi-2],0a0dh jz HaveChangeLine mov ax,0a0dh stosw add _dwPointDirBufSize,2 HaveChangeLine: mov esi,lpszPointContent mov ecx,@dwPointContentLen rep movsb mov ax,0a0dh stosw add dword ptr @dwPointContentLen,2 mov eax,@dwPointContentLen add _dwPointDirBufSize,eax mov esi,FILE_POINTDIR_SIZE mov eax,_lpPointDirBuf push _dwPointDirBufSize pop dword ptr [esi+eax-4] mov eax,_dwFreeRecordCnt cmp eax,0 jz NotEnoughSpace lock inc dword ptr _dwDcsSampleCnt lock dec _dwFreeRecordCnt NotEnoughSpace: invoke LeaveCriticalSection,addr _stCriticalPointDir lea eax,@szBufTime push eax call _ProcSysTimeToAsc invoke wsprintf,addr @szBuf,addr szPointAdd,addr @szBufTime,lpszPointContent mov ecx,eax invoke WriteFile,_hFileJournal,addr @szBuf,ecx,addr @dwDotCnt,0 pop edi pop esi pop ebx mov eax,1 mov edx,0 leave retn 4 KeepLenth: invoke LeaveCriticalSection,addr _stCriticalPointDir pop edi pop esi pop ebx mov eax,0 mov edx,0 leave retn 4 _ProcAddPoint endp _ProcDeletePoint proc,lpszPointID local @dwDotCnt local @lpCurrentRecordEnd local @lpCurrentRecordHead local @dwPointIdLen local @dwFileEndPos local @szBuf[200h]:byte local @szBufTime[100h]:byte push ebx push esi push edi invoke EnterCriticalSection,addr _stCriticalPointDir cmp _dwPointDirBufSize,0 jz ReachFileEnd cld mov esi,lpszPointID GetPointIdLen: lodsb cmp al,0 jnz GetPointIdLen dec esi sub esi,lpszPointID cmp esi,0 jz ReachFileEnd mov @dwPointIdLen,esi mov eax,_lpPointDirBuf add eax,_dwPointDirBufSize mov @dwFileEndPos,eax mov esi,_lpPointDirBuf mov @lpCurrentRecordHead,esi GetCurrentRecordEnd: lodsb cmp al,0ah jnz GetCurrentRecordEnd mov @lpCurrentRecordEnd,esi mov @dwDotCnt,0 mov esi,_lpPointDirBuf GetRecordId: lodsb cmp al,2ch jnz GetRecordId inc @dwDotCnt cmp @dwDotCnt,2 jnz GetRecordId mov @dwDotCnt,0 mov ecx,@dwPointIdLen mov edi,lpszPointID repz cmpsb jnz GetCurrentRecordHead lodsb cmp al,2ch jz GetNextRecordStart ;注意: 不能将比较运算完成后所得的ECX值作为比较相等的参考依据.原因是什么???????????? ;原因:例如若要比较1和2的值是否相等,他们的长度都为1,比较完成后ECX==0,但是他们却不相等 GetCurrentRecordHead: lodsb cmp esi,@dwFileEndPos jae ReachFileEnd ;此处末尾与文件冲突么????? cmp al,0ah jnz GetCurrentRecordHead mov @lpCurrentRecordHead,esi jmp GetRecordId GetNextRecordStart: lodsb cmp esi,@dwFileEndPos jae GetPointEnd cmp al,0ah jnz GetNextRecordStart GetPointEnd: mov @lpCurrentRecordEnd,esi mov eax,@lpCurrentRecordEnd sub eax,_lpPointDirBuf mov ecx,_dwPointDirBufSize sub ecx,eax mov esi,@lpCurrentRecordEnd mov edi,@lpCurrentRecordHead rep movsb mov ecx,@lpCurrentRecordEnd sub ecx,@lpCurrentRecordHead sub _dwPointDirBufSize,ecx mov al,0 rep stosb mov esi,FILE_POINTDIR_SIZE mov eax,_lpPointDirBuf push _dwPointDirBufSize pop dword ptr [esi+eax-4] mov eax,_dwDcsSampleCnt cmp eax,0 jz IsEmptyFile lock dec dword ptr _dwDcsSampleCnt lock inc _dwFreeRecordCnt IsEmptyFile: invoke LeaveCriticalSection,addr _stCriticalPointDir lea eax,@szBufTime push eax call _ProcSysTimeToAsc invoke wsprintf,addr @szBuf,addr szPointDelete,addr @szBufTime,lpszPointID mov ecx,eax invoke WriteFile,_hFileJournal,addr @szBuf,ecx,addr @dwDotCnt,0 pop edi pop esi pop ebx mov eax,1 mov edx,0 leave retn 4 ReachFileEnd: invoke LeaveCriticalSection,addr _stCriticalPointDir pop edi pop esi pop ebx mov eax,0 mov edx,0 leave retn 4 _ProcDeletePoint endp _ProcModifyPoint proc,lpszPointID,lpszPointContent local @dwDotCnt local @lpCurrentRecordEnd local @lpCurrentRecordHead local @dwPointIdLen local @dwPointContentLen local @dwFileEndPos local @lpInsertID local @dwInsertIdLen local @lpszPointContent[100h]:byte local @szBuf[200h]:byte local @szBufTime[100h]:byte push ebx push esi push edi invoke EnterCriticalSection,addr _stCriticalPointDir cmp dword ptr _dwPointDirBufSize,0 jz InvalidParam cld mov esi,lpszPointID GetPointIdLen: lodsb cmp al,0 jnz GetPointIdLen dec esi sub esi,lpszPointID cmp esi,0 jz InvalidParam mov @dwPointIdLen,esi mov @dwDotCnt,0 mov esi,lpszPointContent GetInsertIDHeadPos: lodsb cmp al,2ch jnz GetInsertIDHeadPos inc @dwDotCnt cmp @dwDotCnt,2 jnz GetInsertIDHeadPos mov @lpInsertID,esi mov @dwInsertIdLen,0 GetInsertIdLen: lodsb cmp al,2ch jz GetInsertIdEnd inc @dwInsertIdLen jmp GetInsertIdLen GetInsertIdEnd: cmp @dwInsertIdLen,0 jz InvalidParam GetPointContentLen: lodsb cmp al,0 jnz GetPointContentLen dec esi sub esi,lpszPointContent cmp esi,0 jz InvalidParam mov @dwPointContentLen,esi mov ecx,@dwInsertIdLen cmp ecx,@dwPointIdLen jnz InvalidParam mov esi,lpszPointID mov edi,@lpInsertID repz cmpsb jnz InvalidParam mov esi,lpszPointContent lea edi,@lpszPointContent mov ecx,@dwPointContentLen rep movsb mov eax,0a0dh stosd add @dwPointContentLen,2 mov eax,_lpPointDirBuf add eax,_dwPointDirBufSize mov @dwFileEndPos,eax mov esi,_lpPointDirBuf mov @lpCurrentRecordHead,esi GetCurrentRecordEnd: lodsb cmp al,0ah jnz GetCurrentRecordEnd mov @lpCurrentRecordEnd,esi mov @dwDotCnt,0 mov esi,_lpPointDirBuf GetRecordId: lodsb cmp al,2ch jnz GetRecordId inc @dwDotCnt cmp @dwDotCnt,2 jnz GetRecordId mov @dwDotCnt,0 mov ecx,@dwPointIdLen mov edi,lpszPointID repz cmpsb jnz GetCurrentRecordStart lodsb cmp al,2ch jz GetNextRecordStart ;注意: 不能将比较运算完成后所得的ECX值作为比较相等的参考依据.原因是什么???????????? ;原因:例如若要比较1和2的值是否相等,他们的长度都为1,比较完成后ECX==0,但是他们却不相等 GetCurrentRecordStart: lodsb cmp esi,@dwFileEndPos jae InvalidParam cmp al,0ah jnz GetCurrentRecordStart mov @lpCurrentRecordHead,esi jmp GetRecordId GetNextRecordStart: lodsb cmp esi,@dwFileEndPos jae FindPointEndLast cmp al,0ah jnz GetNextRecordStart FindPointEndLast: mov @lpCurrentRecordEnd,esi mov eax,@lpCurrentRecordEnd sub eax,@lpCurrentRecordHead mov ebx,@dwPointContentLen cmp eax,ebx jae ShortLine sub ebx,eax push ebx mov esi,_lpPointDirBuf add esi,_dwPointDirBufSize dec esi mov edi,esi add edi,ebx mov eax,@lpCurrentRecordEnd sub eax,_lpPointDirBuf mov ecx,_dwPointDirBufSize sub ecx,eax std rep movsb lea esi,@lpszPointContent add esi,@dwPointContentLen dec esi mov ecx,@dwPointContentLen rep movsb pop ebx add _dwPointDirBufSize,ebx cld jmp ModifyLenth ShortLine: cld sub eax,ebx push eax lea esi,@lpszPointContent mov edi,@lpCurrentRecordHead mov ecx,@dwPointContentLen rep movsb mov ebx,@lpCurrentRecordEnd sub ebx,_lpPointDirBuf mov ecx,_dwPointDirBufSize sub ecx,ebx mov esi,@lpCurrentRecordEnd rep movsb pop ecx sub _dwPointDirBufSize,ecx mov al,0 rep stosb ModifyLenth: mov esi,FILE_POINTDIR_SIZE mov eax,_lpPointDirBuf push _dwPointDirBufSize pop dword ptr [esi+eax-4] invoke LeaveCriticalSection,addr _stCriticalPointDir lea eax,@szBufTime push eax call _ProcSysTimeToAsc invoke wsprintf,addr @szBuf,addr szPointModify,addr @szBufTime,lpszPointID,lpszPointContent mov ecx,eax invoke WriteFile,_hFileJournal,addr @szBuf,ecx,addr @dwDotCnt,0 pop edi pop esi pop ebx mov eax,1 mov edx,0 leave retn 8 InvalidParam: invoke LeaveCriticalSection,addr _stCriticalPointDir pop edi pop esi pop ebx mov eax,0 mov edx,0 leave retn 8 _ProcModifyPoint endp _ProcSeekPoint proc,lpszPointID local @lpCurrentRecordEnd local @lpCurrentRecordHead local @dwPointIdLen local @dwFileEndPos local @dwDotCnt local @szBuf[200h]:byte local @szBufTime[100h]:byte local @szBuffer[200h]:byte local @lpSeekPointBuf push ebx push esi push edi invoke EnterCriticalSection,addr _stCriticalPointDir cmp dword ptr _dwPointDirBufSize,0 jz ReachFileEnd cld mov esi,lpszPointID GetPointIdLen: lodsb cmp al,0 jnz GetPointIdLen dec esi sub esi,lpszPointID cmp esi,0 jz ReachFileEnd mov @dwPointIdLen,esi mov eax,_lpPointDirBuf add eax,_dwPointDirBufSize mov @dwFileEndPos,eax mov esi,_lpPointDirBuf mov @lpCurrentRecordHead,esi GetCurrentRecordEnd: lodsb cmp al,0ah jnz GetCurrentRecordEnd mov @lpCurrentRecordEnd,esi mov @dwDotCnt,0 mov esi,_lpPointDirBuf GetRecordId: lodsb cmp al,2ch jnz GetRecordId inc @dwDotCnt cmp @dwDotCnt,2 jnz GetRecordId mov @dwDotCnt,0 mov ecx,@dwPointIdLen mov edi,lpszPointID repz cmpsb jnz GetCurrentRecordHead lodsb cmp al,2ch jz GetNextRecordStart ;注意: 不能将比较运算完成后所得的ECX值作为比较相等的参考依据.原因是什么???????????? ;原因:例如若要比较1和2的值是否相等,他们的长度都为1,比较完成后ECX==0,但是他们却不相等 GetCurrentRecordHead: lodsb cmp esi,@dwFileEndPos jae ReachFileEnd cmp al,0ah jnz GetCurrentRecordHead mov @lpCurrentRecordHead,esi jmp GetRecordId GetNextRecordStart: lodsb cmp esi,@dwFileEndPos jae GetPointEnd cmp al,0ah jnz GetNextRecordStart GetPointEnd: mov @lpCurrentRecordEnd,esi invoke VirtualAlloc,0,_stSystemInfo.dwPageSize,MEM_COMMIT,PAGE_READWRITE mov @lpSeekPointBuf,eax mov edi,eax mov esi,@lpCurrentRecordHead mov ecx,@lpCurrentRecordEnd sub ecx,@lpCurrentRecordHead rep movsb invoke LeaveCriticalSection,addr _stCriticalPointDir lea eax,@szBufTime push eax call _ProcSysTimeToAsc lea edi,@szBuffer mov esi,@lpSeekPointBuf mov ecx,@lpCurrentRecordEnd sub ecx,@lpCurrentRecordHead sub ecx,2 rep movsb mov al,0 stosb invoke wsprintf,addr @szBuf,addr szPointSeek,addr @szBufTime,addr @szBuffer mov ecx,eax invoke WriteFile,_hFileJournal,addr @szBuf,ecx,addr @dwDotCnt,0 mov eax,@lpSeekPointBuf mov edx,0 pop edi pop esi pop ebx leave retn 4 ReachFileEnd: invoke LeaveCriticalSection,addr _stCriticalPointDir mov eax,0 mov edx,0 pop edi pop esi pop ebx leave retn 4 _ProcSeekPoint endp _ProcGetPointTable proc local @szBuffer[100h]:byte local @szBuf[200h]:byte local @dwCounter push ebx push esi push edi invoke EnterCriticalSection,addr _stCriticalPointDir cmp _dwPointDirBufSize,0 jz NullBuf lea eax,@szBuffer push eax call _ProcSysTimeToAsc invoke wsprintf,addr @szBuf,addr szGetPointTable,addr @szBuffer mov ecx,eax invoke WriteFile,_hFileJournal,addr @szBuf,ecx,addr @dwCounter,0 mov eax,_lpPointDirBuf mov esi,_dwPointDirBufSize mov byte ptr [esi+eax],0 invoke LeaveCriticalSection,addr _stCriticalPointDir mov eax,_lpPointDirBuf mov edx,0 pop edi pop esi pop ebx leave retn 0 NullBuf: invoke LeaveCriticalSection,addr _stCriticalPointDir pop edi pop esi pop ebx mov eax,0 mov edx,0 leave retn 0 _ProcGetPointTable endp _ProcSysTimeToAsc proc,lpOutPutBuf local @stSystemTime:SYSTEMTIME push ebx push esi push edi invoke GetLocalTime,addr @stSystemTime mov ax,@stSystemTime.wYear movzx eax,ax mov bx,@stSystemTime.wMonth movzx ebx,bx mov cx,@stSystemTime.wDay movzx ecx,cx mov dx,@stSystemTime.wHour movzx edx,dx mov di,@stSystemTime.wMinute movzx edi,di mov si,@stSystemTime.wSecond movzx esi,si invoke wsprintf,lpOutPutBuf,addr szSystemTime,eax,ebx,ecx,edx,edi,esi mov edx,0 pop edi pop esi pop ebx leave retn 4 _ProcSysTimeToAsc endp _ProcNewExceptionFilter proc,lpExceptionPoint local @szBuffer[100h]:byte local @szBuf[200h]:byte local @dwCounter pushad lea eax,@szBuffer push eax call _ProcSysTimeToAsc mov esi,lpExceptionPoint assume esi:ptr EXCEPTION_POINTERS mov edi,[esi].ContextRecord mov esi,[esi].pExceptionRecord assume esi:ptr EXCEPTION_RECORD,edi:ptr CONTEXT invoke wsprintf,addr @szBuf,addr szMsgException,addr @szBuffer,[esi].ExceptionAddress,[esi].ExceptionCode,[esi].ExceptionFlags mov ecx,eax invoke WriteFile,_hFileJournal,addr @szBuf,ecx,addr @dwCounter,0 call _ProcTerminate invoke ExitProcess,0 popad mov eax,EXCEPTION_CONTINUE_SEARCH leave retn 4 _ProcNewExceptionFilter endp ;用户信息文件初始化:16个字节的用户名(不足用空格补齐),16个字节的密码(不足用空格补齐),回车换行符 _ProcSeekUser proc,lpszUserName,lpszPassWord local @szPassWord[USER_PASSWORD_LEN]:byte local @szUserName[USER_NAME_LEN]:byte local @lpUserInfoEnd push ebx push esi push edi cld mov esi,lpszUserName lea edi,@szUserName GetUserNameLen: lodsb cmp al,0 jz GetUserNameEnd stosb jmp GetUserNameLen GetUserNameEnd: mov esi,edi lea ebx,@szUserName sub esi,ebx cmp esi,0 jz InvalidParam cmp esi,USERNAME_PASSWORD_LEN ja InvalidParam mov ecx,sizeof @szUserName sub ecx,esi mov al,20h rep stosb mov esi,lpszPassWord lea edi,@szPassWord GetPassWordLen: lodsb cmp al,0 jz GetPassWordEnd stosb jmp GetPassWordLen GetPassWordEnd: mov esi,edi lea ebx,@szPassWord sub esi,ebx cmp esi,0 jz InvalidParam cmp esi,USERNAME_PASSWORD_LEN ja InvalidParam mov ecx,sizeof @szPassWord sub ecx,esi mov al,20h rep stosb invoke EnterCriticalSection,addr _stCriticalUserInfo cmp dword ptr _dwUserInfoBufSize,0 jz ToInvalidParam mov esi,_lpUserInfoBuf mov ebx,esi add ebx,_dwUserInfoBufSize mov @lpUserInfoEnd,ebx CheckNextUser: push esi lea edi,@szUserName mov ecx,sizeof @szUserName repz cmpsb jnz ToCheckNextUser mov ecx,sizeof @szPassWord lea edi,@szPassWord repz cmpsb jnz ToCheckNextUser pop esi jmp GetUserNameCorrect ToCheckNextUser: pop esi add esi,USER_INFO_LEN cmp esi,@lpUserInfoEnd jb CheckNextUser ToInvalidParam: invoke LeaveCriticalSection,addr _stCriticalUserInfo InvalidParam: mov eax,0 mov edx,0 pop edi pop esi pop ebx leave retn 8 GetUserNameCorrect: lea esi,szAdminLogon lea edi,@szUserName mov ecx,sizeof @szUserName repz cmpsb jz AdminiatratorLogon invoke LeaveCriticalSection,addr _stCriticalUserInfo mov eax,1 mov edx,0 pop edi pop esi pop ebx leave retn 8 AdminiatratorLogon: invoke LeaveCriticalSection,addr _stCriticalUserInfo mov eax,2 mov edx,0 pop edi pop esi pop ebx leave retn 8 _ProcSeekUser endp _ProcAddUser proc,lpszUserName,lpszPassWord local @szPassWord[USER_PASSWORD_LEN]:byte ;高位 local @szUserName[USER_NAME_LEN]:byte ;低位 local @lpUserInfoEnd push ebx push esi push edi cld mov esi,lpszUserName lea edi,@szUserName GetUserNameLen: lodsb cmp al,0 jz GetUserNameEnd stosb jmp GetUserNameLen GetUserNameEnd: mov esi,edi lea ebx,@szUserName sub esi,ebx cmp esi,0 jz InvalidParam cmp esi,USERNAME_PASSWORD_LEN ja InvalidParam mov ecx,sizeof @szUserName sub ecx,esi mov al,20h rep stosb mov esi,lpszPassWord lea edi,@szPassWord GetPassWordLen: lodsb cmp al,0 jz GetPassWordEnd stosb jmp GetPassWordLen GetPassWordEnd: mov esi,edi lea ebx,@szPassWord sub esi,ebx cmp esi,0 jz InvalidParam cmp esi,USERNAME_PASSWORD_LEN ja InvalidParam mov ecx,sizeof @szPassWord sub ecx,esi mov al,20h rep stosb invoke EnterCriticalSection,addr _stCriticalUserInfo cmp dword ptr _dwUserInfoBufSize,0 jz AddUserInfo mov esi,_lpUserInfoBuf mov ebx,esi add ebx,_dwUserInfoBufSize mov @lpUserInfoEnd,ebx CheckNextUser: push esi lea edi,@szUserName mov ecx,sizeof @szUserName repz cmpsb jz FoundSameInfo pop esi add esi,USER_INFO_LEN cmp esi,@lpUserInfoEnd jb CheckNextUser AddUserInfo: lea esi,@szUserName mov edi,_lpUserInfoBuf add edi,_dwUserInfoBufSize mov ecx,sizeof @szUserName add ecx,sizeof @szPassWord rep movsb mov ax,0a0dh stosw add dword ptr [_dwUserInfoBufSize],USER_INFO_LEN push dword ptr [_dwUserInfoBufSize] mov esi,_lpUserInfoBuf mov ebx,FILE_USERINFO_SIZE pop dword ptr [esi+ebx-4] invoke LeaveCriticalSection,addr _stCriticalUserInfo mov eax,1 mov edx,0 pop edi pop esi pop ebx leave retn 8 FoundSameInfo: pop esi invoke LeaveCriticalSection,addr _stCriticalUserInfo InvalidParam: mov eax,0 mov edx,0 pop edi pop esi pop ebx leave retn 8 _ProcAddUser endp _ProcDeleteUser proc,lpszUserName,lpszPassWord local @szPassWord[USER_PASSWORD_LEN]:byte local @szUserName[USER_NAME_LEN]:byte local @lpUserInfoEnd push ebx push esi push edi cld mov esi,lpszUserName lea edi,@szUserName GetUserNameLen: lodsb cmp al,0 jz GetUserNameEnd stosb jmp GetUserNameLen GetUserNameEnd: mov esi,edi lea ebx,@szUserName sub esi,ebx cmp esi,0 jz InvalidParam cmp esi,USERNAME_PASSWORD_LEN ja InvalidParam mov ecx,sizeof @szUserName sub ecx,esi mov al,20h rep stosb lea esi,szAdminLogon lea edi,@szUserName mov ecx,sizeof @szUserName repz cmpsb jz InvalidParam invoke EnterCriticalSection,addr _stCriticalUserInfo cmp dword ptr _dwUserInfoBufSize,0 jz NotFoundSameInfo mov esi,_lpUserInfoBuf mov ebx,esi add ebx,_dwUserInfoBufSize mov @lpUserInfoEnd,ebx CheckNextName: push esi lea edi,@szUserName mov ecx,sizeof @szUserName repz cmpsb jz GetSameUserName pop esi add esi,USER_INFO_LEN cmp esi,@lpUserInfoEnd jb CheckNextName NotFoundSameInfo: invoke LeaveCriticalSection,addr _stCriticalUserInfo InvalidParam: mov eax,0 mov edx,0 pop edi pop esi pop ebx leave retn 8 GetSameUserName: pop esi mov edi,esi add esi,USER_INFO_LEN mov eax,esi sub eax,_lpUserInfoBuf mov ecx,_dwUserInfoBufSize sub ecx,eax rep movsb mov ecx,esi sub ecx,edi push ecx mov al,0 rep stosb pop ecx sub dword ptr [_dwUserInfoBufSize],ecx push dword ptr [_dwUserInfoBufSize] mov esi,_lpUserInfoBuf mov ebx,FILE_USERINFO_SIZE pop dword ptr [esi+ebx-4] invoke LeaveCriticalSection,addr _stCriticalUserInfo mov eax,1 mov edx,0 pop edi pop esi pop ebx leave retn 8 _ProcDeleteUser endp _ProcClientShowValue proc,lpValueBuf,nOrdinal local @dwValue local @szBuf[200h]:byte push ebx push esi push edi cmp nOrdinal,1 jnz ToAddTo lea ebx,_ThreadCreateDlg invoke CreateThread,0,0,ebx,0,0,0 invoke CloseHandle,eax WaitInitOk: cmp _hDlgShowValue,0 jz WaitInitOk ToAddTo: mov esi,lpValueBuf mov ax,word ptr [esi] movzx eax,ax mov bx,word ptr [esi+2] movzx ebx,bx mov cx,word ptr [esi+6] movzx ecx,cx mov dx,word ptr [esi+8] movzx edx,dx mov di,word ptr [esi+10] movzx edi,di push dword ptr [esi+16] pop dword ptr @dwValue mov si,word ptr [esi+12] movzx esi,si invoke wsprintf,addr @szBuf,addr szClientShowValue,eax,ebx,ecx,edx,edi,esi,@dwValue invoke SendDlgItemMessage,_hDlgShowValue,_LIST_CLIENT_SHOWVALUE,LB_ADDSTRING,0,addr @szBuf ClientShowValueEnd: pop edi pop esi pop ebx mov eax,1 mov edx,0 leave retn 8 _ProcClientShowValue endp _ThreadCreateDlg proc lea ebx,_DlgProcShowValue invoke DialogBoxParam,_hDllInstance,_DLG_CLIENT_SHOWVALUE,0,ebx,0 ;为什么不用得到模块句柄,而要用链接库句柄????? leave retn 0 _ThreadCreateDlg endp _DlgProcShowValue proc,hWnd,uMsg,wParam,lParam local @dwValue local @szBuf[200h]:byte push ebx push esi push edi mov eax,uMsg .if eax==WM_INITDIALOG push hWnd pop _hDlgShowValue .elseif eax==WM_CLOSE mov _hDlgShowValue,0 invoke EndDialog,hWnd,0 .else mov eax,TRUE pop edi pop esi pop ebx leave mov eax,FALSE retn 16 .endif mov eax,TRUE pop edi pop esi pop ebx leave retn 16 _DlgProcShowValue endp _ProcService proc local @hScmManager local @hService local @stServiceTableEntry:SERVICE_TABLE_ENTRY push ebx push esi push edi invoke OpenSCManager,0,0,SC_MANAGER_ALL_ACCESS .if eax==0 invoke MessageBox,0,offset szOpenScmError,0,MB_OK .endif mov @hScmManager,eax invoke OpenService,@hScmManager,offset szServiceName,SERVICE_QUERY_CONFIG .if eax==0 invoke CreateService,@hScmManager,offset szServiceName,offset szServiceName,SERVICE_ALL_ACCESS,SERVICE_WIN32_OWN_PROCESS,\ SERVICE_AUTO_START,SERVICE_ERROR_NORMAL,addr szModuleFileName,0,0,0,0,0 .if eax==0 invoke MessageBox,0,offset szOpenServiceError,0,MB_OK .else mov @hService,eax .endif .else mov @hService,eax .endif invoke CloseServiceHandle,@hScmManager lea esi,@stServiceTableEntry lea ebx,szServiceName mov dword ptr [esi],ebx lea edi,_ProcServiceMain mov dword ptr [esi+4],edi invoke StartServiceCtrlDispatcher,addr @stServiceTableEntry .if eax==0 invoke MessageBox,0,offset szDispatcherServiceError,0,MB_OK .endif pop edi pop esi pop ebx leave retn 0 _ProcService endp _ProcServiceMain proc local @stServiceStatus:SERVICE_STATUS local @hServiceStatus:SERVICE_STATUS_HANDLE push ebx push esi push edi invoke RtlZeroMemory,addr @stServiceStatus,sizeof SERVICE_STATUS mov @stServiceStatus.dwServiceType,SERVICE_WIN32_OWN_PROCESS mov @stServiceStatus.dwCurrentState,SERVICE_START_PENDING mov @stServiceStatus.dwControlsAccepted,SERVICE_ACCEPT_STOP mov @stServiceStatus.dwWin32ExitCode,0 mov @stServiceStatus.dwServiceSpecificExitCode,0 mov @stServiceStatus.dwCheckPoint,0 mov @stServiceStatus.dwWaitHint,0 invoke SetServiceStatus,@hServiceStatus,addr @stServiceStatus lea ebx,_ProcServiceHandler invoke RegisterServiceCtrlHandler,addr szServiceName,ebx .if eax==0 invoke MessageBox,0,offset szRegistryServiceError,0,MB_OK .endif mov @hServiceStatus,eax mov @stServiceStatus.dwWin32ExitCode,S_OK mov @stServiceStatus.dwCheckPoint,0 mov @stServiceStatus.dwWaitHint,0 mov @stServiceStatus.dwCurrentState,SERVICE_RUNNING invoke SetServiceStatus,@hServiceStatus,addr @stServiceStatus mov ecx,100 ToSleep: push ecx invoke Sleep,1000 pop ecx loop ToSleep mov @stServiceStatus.dwCurrentState,SERVICE_STOPPED invoke SetServiceStatus,@hServiceStatus,addr @stServiceStatus pop edi pop esi pop ebx leave retn 0 _ProcServiceMain endp _ProcServiceHandler proc,dwOpCode push ebx push esi push edi pop edi pop esi pop ebx leave retn 4 _ProcServiceHandler endp _ProcRestart proc _ProcRestart endp end DllEntry
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。