как будет выглядеть код Код (Text): .IF !eax ret .ENDIF на чистом асм без макросов? , подскажите пожалуйста , савсем позабыл азы.
Спасибо большое. А еще вот такой вопрос. http://pastebin.com/DXbkJEwk Объясните пожалуйста зачем в процедуре Runsvc используется в конце lstrlen и почему там везде MAX_PATH+1 Код (Text): .data fPaused BOOL FALSE fRunning BOOL FALSE .data? exitEvent dd ? hWinMain dd ? schSCManager dd ? szFileName db MAX_PATH+1 dup(?) stSS SERVICE_STATUS <> hStatus DWORD ? sTable SERVICE_TABLE_ENTRY <> sTable2 SERVICE_TABLE_ENTRY <> hInstance HINSTANCE ? hThread HANDLE ? evTerminate HANDLE ? .code IsInstalledService proc invoke OpenSCManager, NULL, NULL, SC_MANAGER_ALL_ACCESS mov schSCManager, eax .IF !eax ret .ENDIF invoke OpenService, schSCManager, offset szServiceName, DELETE .IF eax invoke CloseServiceHandle, eax push 1 .ELSE push 0 .ENDIF invoke CloseServiceHandle, schSCManager pop eax ret IsInstalledService endp InstallService proc invoke OpenSCManager, NULL, NULL, SC_MANAGER_ALL_ACCESS mov schSCManager, eax .IF !eax ret .ENDIF invoke GetModuleFileName, 0, addr szFileName, MAX_PATH invoke CreateService,schSCManager,addr szServiceName,addr szDisplayName,\ SERVICE_ALL_ACCESS,SERVICE_WIN32_OWN_PROCESS or SERVICE_INTERACTIVE_PROCESS,\ SERVICE_AUTO_START,SERVICE_ERROR_NORMAL,addr szFileName,\ NULL,NULL,NULL,NULL,NULL .IF eax push eax invoke StartService, eax, NULL, NULL call CloseServiceHandle .ENDIF invoke CloseServiceHandle, schSCManager ret InstallService endp InitService Proc LOCAL id:DWORD mov fRunning, TRUE mov eax, 1 ret InitService EndP ResumeService Proc mov fPaused, FALSE invoke ResumeThread, hThread ret ResumeService EndP PauseService Proc mov fPaused, TRUE invoke SuspendThread, hThread ret PauseService EndP StopServiceStatus Proc mov fRunning, FALSE invoke SendMessage,hWinMain,WM_CLOSE,0,0 invoke SetEvent, evTerminate ret StopServiceStatus EndP CtrlHandler Proc controlCode1:DWORD LOCAL currentState:DWORD LOCAL success:BOOL mov currentState, 0 mov eax, controlCode1 .if ( eax == SERVICE_CONTROL_STOP ) SendSvcState SERVICE_STOP_PENDING call StopServiceStatus SendSvcState SERVICE_STOPPED .elseif ( eax == SERVICE_CONTROL_PAUSE ) .if ( fRunning != FALSE && fPaused == FALSE ) SendSvcState SERVICE_PAUSE_PENDING call PauseService SendSvcState SERVICE_PAUSED .endif .elseif ( eax == SERVICE_CONTROL_CONTINUE ) .if ( fRunning != FALSE && fPaused == TRUE ) SendSvcState SERVICE_CONTINUE_PENDING call ResumeService SendSvcState SERVICE_RUNNING .endif .elseif ( eax == SERVICE_CONTROL_INTERROGATE ) .elseif ( eax == SERVICE_CONTROL_SHUTDOWN ) .endif ret CtrlHandler EndP ServiceMain Proc argc:DWORD, argv:DWORD invoke RegisterServiceCtrlHandler,addr szServiceName,offset CtrlHandler mov hStatus, eax mov stSS.dwServiceType,SERVICE_WIN32_OWN_PROCESS or SERVICE_INTERACTIVE_PROCESS mov stSS.dwControlsAccepted,SERVICE_ACCEPT_STOP mov stSS.dwWin32ExitCode,NO_ERROR mov stSS.dwWaitHint,3000 SendSvcState SERVICE_START_PENDING call InitService SendSvcState SERVICE_RUNNING invoke start_work ret ServiceMain EndP Runsvc proc invoke GetSystemDirectory, offset lpBuf1, MAX_PATH+1 invoke GetModuleFileName, NULL, offset lpBuf2, MAX_PATH+1 invoke lstrcat, offset lpBuf1, offset exename invoke lstrcmp, offset lpBuf1, offset lpBuf2 test eax, eax jz @ret invoke CopyFile, offset lpBuf2, offset lpBuf1, 0 test eax, eax jz @exit invoke lstrlen, offset lpBuf1 @@: invoke ShellExecute, 0, offset szTextOpen, offset lpBuf1, 0, 0, SW_HIDE @exit: invoke ExitProcess, 0 @ret: invoke IsInstalledService .IF !eax invoke InstallService .ENDIF mov sTable.lpServiceProc, offset ServiceMain mov sTable.lpServiceName, offset szServiceName invoke StartServiceCtrlDispatcher, addr sTable ret Runsvc endp
fragment Автор думал что символ завершающий строку(ноль) не входит в макс. длину строки. Это не верно.
Ответ ясен, а про invoke lstrlen, offset lpBuf1 в конце кода что можите сказать? Код (Text): invoke lstrlen, offset lpBuf1 @@: invoke ShellExecute, 0, offset szTextOpen, offset lpBuf1, 0, 0, SW_HIDE не понятен этот кусок кода , и зачем там метка если ею никто в модуле не пользутеся
Здесь будет представлен другой, более универсальный скрипт на Visual FoxPro, позволяющий из листинга системной dll-ки, дизасемблированного с помощью демо-версии IdaPro v.5.7, получить нужный def файл, что означает автоматическое создание и соответствующего lib файла. Повторим, вкратце процедуру работы с демо-версией «Иды» (в коммерческой версии, работать будет немного проще). Если нас интересует создание def или lib файла некоторой системной библиотеки, например, из Windows XP sp.3, то мы просто загружаем данную dll в «Иду», хотя бы в демо-версию и дизассемблируем ее с отладочными символами, обычно подгружаемых из Интернета, но можно и локально (подробнее расписано в моих предыдущих ссылках). Далее сохраняем через буфер обмена (так как в демо-версии отсутствует возможность записи в файл) листинг данной dll-ки в файл с расширением lst. Конечно, можно было бы не париться с «Идой», если бы мы умели самостоятельно разгребать контейнер с отладочными символами. Однако разбираться с форматом pdb-файла как-то лениво, тем более, что «Ида» это делает превосходно, правда, размазывая нужную нам информацию (в избыточном виде) по всему листингу. Из-за этих заморочек «Иды», код нашего скрипта получается достаточно объемный. Впрочем, это не единственное возможное решение, другие варианты зависят от вашей фантазии . Итак, пусть нас интересует kernel32.dll. С помощью «Иды» мы получаем из него kernel32.lst. Полученный листинг скармливаем нашему скрипту: Код (Text): ****************************************************************************** * lst2def.prg ****************************************************************************** CLEAR SET TALK OFF SET SAFETY OFF SET TEXTMERGE ON filename = "kernel32" infile = filename + ".lst" outfile = filename + ".txt" dbffile = "temp.dbf" dbffile2 = filename + ".dbf" Line1 = " ; Exported entry" Len1 = LEN(Line1) Line2 = " public" Len2 = LEN(Line2) FuncNameLen = 125 && Выделенная длина для имени функции crlf = CHR(13) + CHR(10) && Символы завершения строки tabulators = CHR(9) + CHR(9) file1 = FOPEN(infile) IF file1 < 0 WAIT 'Не могу открыть файл: ' + infile QUIT ENDIF file2 = FCREATE(outfile) IF file2 < 0 WAIT 'Не могу создать файл: ' + outfile QUIT ENDIF End1 = FSEEK(file1, 0, 2) && Определяем размер файла Top1 = FSEEK(file1, 0) && Идем в начало. Сама переменная не нужна IF End1 <= 0 && Если файл пуст MESSAGEBOX('Пустой файл: ' + infile) QUIT ENDIF pos = 0 IsLine1 = .F. KolStr = 10 && Максимально возможное количество строк для общих функций и до строки public (д.б. >= 6) DIMENSION aSnum[KolStr] && Строковые ординалы функций DIMENSION aFunc[KolStr] && Их базовые имена * Обнуляем массивы FOR i = 1 TO KolStr aSnum[i] = "" aFunc[i] = "" ENDFOR * i = 0 DO WHILE NOT EOF(file1) && На самом деле мы не можем доверять этому условию strline = FGETS(file1) *!* i = i + 1 *!* IF i > 100000000 *!* CLOSE ALL *!* QUIT *!* ENDIF *!* *!* ModulI = i%10000 *!* IF ModulI == 0 *!* ? i *!* ENDIF Curpos1 = FSEEK(file1, 0, 1) IF Curpos1 >= End1 && Достигнут конец файла EXIT ENDIF pos = AT(Line1, strline) && Ищем первую строку IF pos > 0 && Нашли первую строку Line1 IsLine1 = .T. ELSE LOOP ENDIF && Первая строка Line1 найдена! Однако этих строк может быть несколько. && Т.е. разные функции могут иметь общий код. strline = SUBSTR(strline, pos + Len1 + 1) && Выделяем число (номер / ординал функции) pos = AT(".", strline) && Ищем признак завершения числа IF pos > 0 && Нашли конец числа aSnum[1] = RIGHT(" " + LTRIM(LEFT(strline, pos - 1)), 5) + " " aFunc[1] = SUBSTR(strline, pos + 2) ELSE MESSAGEBOX("Нет признака для номера функции!") QUIT ENDIF KolLine1 = 1 && Количество найденных подряд строк Line1 по умолчанию * В течении следующих KolStr - 1 пытаемся искать другие строки Line1 FOR i = 2 TO KolStr strline = FGETS(file1) pos = AT(Line1, strline) && Снова ищем первую строку IF pos > 0 && Нашли новую копию первой строки Line1 KolLine1 = i strline = SUBSTR(strline, pos + Len1 + 1) && Выделяем число (номер / ординал функции) pos = AT(".", strline) && Ищем признак завершения числа IF pos > 0 && Нашли конец числа aSnum[i] = RIGHT(" " + LTRIM(LEFT(strline, pos - 1)), 5) + " " aFunc[i] = SUBSTR(strline, pos + 2) ELSE MESSAGEBOX("Нет признака для номера функции!") QUIT ENDIF ELSE && Нет других копий строк Line1 EXIT ENDIF ENDFOR && Ищем вторую строку Line2, которой могут соответствовать несколько первых строк Line1 IsLine2 = .F. * В течении следующих KolStr должна быть найдена вторая строка Line2 FOR i = 1 TO KolStr pos = AT(Line2, strline) && Ищем вторую строку Line2 IF pos > 0 && Нашли вторую строку Line2 IsLine2 = .T. EXIT ENDIF strline = FGETS(file1) ENDFOR IF NOT IsLine2 MESSAGEBOX("Нет пары для первой строки!") QUIT ENDIF && Вторая строка Line2 найдена! FuncName = TRIM(SUBSTR(strline, pos + Len2 + 1)) && Выделяем полное имя экспортируемой функции FuncName = LEFT(FuncName + REPLICATE(" ", FuncNameLen), FuncNameLen) * Следующим KolLine1 строкам Line1 соответствует одна строка Line2 FOR i = 1 TO KolLine1 IF KolLine1 = 1 FWRITE(file2, FuncName + aSnum[1] + crlf) ELSE FWRITE(file2, FuncName + aSnum[i] + aFunc[i] + crlf) ENDIF ENDFOR * ? strline + tabulators + "@" + snum ENDDO IF NOT IsLine1 MESSAGEBOX("Искомая строка не найдена!") QUIT ENDIF CLOSE ALL * Dbf файл для экспортируемых функций CREATE TABLE (dbffile) (FuncName c((FuncNameLen)), Ord n(6,0), Comments c((FuncNameLen))) APPEND FROM (outfile) TYPE SDF CLOSE ALL * Сортруем dbf файл по ординалу SELECT * FROM (dbffile) ORDER BY Ord INTO TABLE (dbffile2) SELECT (dbffile2) SET TEXTMERGE TO filename + ".def" \\LIBRARY "<<filename + '.dll'>>" \EXPORTS * Генерим def файл FOR i = 1 TO RECCOUNT() GO i SCATTER MEMVAR \<<m.FuncName>>@<<LTRIM(STR(Ord))>><<IIF(EMPTY(m.Comments), "", " ; ")>><<TRIM(Comments)>> ENDFOR CLOSE ALL QUIT ****************************************************************************** ****************************************************************************** Заметим, что для других версий «Иды» сигнатура Line1 и Line2 может немного отличаться. В результате работы скрипта мы получим файл kernel32.def: Код (Text): LIBRARY "kernel32.dll" EXPORTS _ActivateActCtx@8 @1 _AddAtomA@4 @2 _AddAtomW@4 @3 _AddConsoleAliasA@12 @4 _AddConsoleAliasW@12 @5 _AddLocalAlternateComputerNameA@8 @6 _AddLocalAlternateComputerNameW@8 @7 _AddRefActCtx@4 @8 AddVectoredExceptionHandler @9 _AllocConsole@0 @10 _AllocateUserPhysicalPages@12 @11 _AreFileApisANSI@0 @12 _AssignProcessToJobObject@8 @13 _AttachConsole@4 @14 _BackupRead@28 @15 _BackupSeek@24 @16 _BackupWrite@28 @17 _BaseCheckAppcompatCache@16 @18 _BaseCleanupAppcompatCache@0 @19 _BaseCleanupAppcompatCacheSupport@4 @20 _BaseDumpAppcompatCache@0 @21 _BaseFlushAppcompatCache@0 @22 _BaseInitAppcompatCache@0 @23 _BaseInitAppcompatCacheSupport@0 @24 _BaseProcessInitPostImport@0 @25 _BaseQueryModuleData@20 @26 _BaseUpdateAppcompatCache@12 @27 _BasepCheckWinSaferRestrictions@24 @28 _Beep@8 @29 _BeginUpdateResourceA@8 @30 _BeginUpdateResourceW@8 @31 _BindIoCompletionCallback@12 @32 _BuildCommDCBA@8 @33 _BuildCommDCBAndTimeoutsA@12 @34 _BuildCommDCBAndTimeoutsW@12 @35 _BuildCommDCBW@8 @36 _CallNamedPipeA@28 @37 _CallNamedPipeW@28 @38 _CancelDeviceWakeupRequest@4 @39 _CancelIo@4 @40 _CancelTimerQueueTimer@8 @41 _CancelWaitableTimer@4 @42 _ChangeTimerQueueTimer@16 @43 _CheckNameLegalDOS8Dot3A@20 @44 _CheckNameLegalDOS8Dot3W@20 @45 _CheckRemoteDebuggerPresent@8 @46 _ClearCommBreak@4 @47 _ClearCommError@12 @48 _CloseConsoleHandle@4 @49 _CloseHandle@4 @50 _CloseProfileUserMapping@0 @51 _CmdBatNotification@4 @52 _CommConfigDialogA@12 @53 _CommConfigDialogW@12 @54 _CompareFileTime@8 @55 _CompareStringA@24 @56 _CompareStringW@24 @57 _ConnectNamedPipe@8 @58 _ConsoleMenuControl@12 @59 _ContinueDebugEvent@12 @60 _ConvertDefaultLocale@4 @61 _ConvertFiberToThread@0 @62 _ConvertThreadToFiber@4 @63 _CopyFileA@12 @64 _CopyFileExA@24 @65 _CopyFileExW@24 @66 _CopyFileW@12 @67 _CopyLZFile@8 @68 _CreateActCtxA@4 @69 _CreateActCtxW@4 @70 _CreateConsoleScreenBuffer@20 @71 _CreateDirectoryA@8 @72 _CreateDirectoryExA@12 @73 _CreateDirectoryExW@12 @74 _CreateDirectoryW@8 @75 _CreateEventA@16 @76 _CreateEventW@16 @77 _CreateFiber@12 @78 _CreateFiberEx@20 @79 _CreateFileA@28 @80 _CreateFileMappingA@24 @81 _CreateFileMappingW@24 @82 _CreateFileW@28 @83 _CreateHardLinkA@12 @84 _CreateHardLinkW@12 @85 _CreateIoCompletionPort@16 @86 _CreateJobObjectA@8 @87 _CreateJobObjectW@8 @88 _CreateJobSet@12 @89 _CreateMailslotA@16 @90 _CreateMailslotW@16 @91 _CreateMemoryResourceNotification@4 @92 _CreateMutexA@12 @93 _CreateMutexW@12 @94 _CreateNamedPipeA@32 @95 _CreateNamedPipeW@32 @96 _CreateNlsSecurityDescriptor@12 @97 _CreatePipe@16 @98 _CreateProcessA@40 @99 _CreateProcessInternalA@48 @100 _CreateProcessInternalW@48 @101 LZDone @102 ; CreateProcessInternalWSecure _CreateProcessW@40 @103 _CreateRemoteThread@28 @104 _CreateSemaphoreA@16 @105 _CreateSemaphoreW@16 @106 _CreateSocketHandle@0 @107 _CreateTapePartition@16 @108 _CreateThread@24 @109 _CreateTimerQueue@0 @110 _CreateTimerQueueTimer@28 @111 _CreateToolhelp32Snapshot@8 @112 _CreateVirtualBuffer@12 @113 _CreateWaitableTimerA@12 @114 _CreateWaitableTimerW@12 @115 _DeactivateActCtx@8 @116 _DebugActiveProcess@4 @117 _DebugActiveProcessStop@4 @118 _DebugBreak@0 @119 _DebugBreakProcess@4 @120 _DebugSetProcessKillOnExit@4 @121 DecodePointer @122 DecodeSystemPointer @123 _DefineDosDeviceA@12 @124 _DefineDosDeviceW@12 @125 _DelayLoadFailureHook@8 @126 _DeleteAtom@4 @127 DeleteCriticalSection @128 _DeleteFiber@4 @129 _DeleteFileA@4 @130 _DeleteFileW@4 @131 _DeleteTimerQueue@4 @132 _DeleteTimerQueueEx@8 @133 _DeleteTimerQueueTimer@12 @134 _DeleteVolumeMountPointA@4 @135 _DeleteVolumeMountPointW@4 @136 _DeviceIoControl@32 @137 _DisableThreadLibraryCalls@4 @138 _DisconnectNamedPipe@4 @139 _DnsHostnameToComputerNameA@12 @140 _DnsHostnameToComputerNameW@12 @141 _DosDateTimeToFileTime@12 @142 _DosPathToSessionPathA@12 @143 _DosPathToSessionPathW@12 @144 _DuplicateConsoleHandle@16 @145 _DuplicateHandle@28 @146 EncodePointer @147 EncodeSystemPointer @148 _EndUpdateResourceA@8 @149 _EndUpdateResourceW@8 @150 EnterCriticalSection @151 _EnumCalendarInfoA@16 @152 _EnumCalendarInfoExA@16 @153 _EnumCalendarInfoExW@16 @154 _EnumCalendarInfoW@16 @155 _EnumDateFormatsA@12 @156 _EnumDateFormatsExA@12 @157 _EnumDateFormatsExW@12 @158 _EnumDateFormatsW@12 @159 _EnumLanguageGroupLocalesA@16 @160 _EnumLanguageGroupLocalesW@16 @161 _EnumResourceLanguagesA@20 @162 _EnumResourceLanguagesW@20 @163 _EnumResourceNamesA@16 @164 _EnumResourceNamesW@16 @165 _EnumResourceTypesA@12 @166 _EnumResourceTypesW@12 @167 _EnumSystemCodePagesA@8 @168 _EnumSystemCodePagesW@8 @169 _EnumSystemGeoID@12 @170 _EnumSystemLanguageGroupsA@12 @171 _EnumSystemLanguageGroupsW@12 @172 _EnumSystemLocalesA@8 @173 _EnumSystemLocalesW@8 @174 _EnumTimeFormatsA@12 @175 _EnumTimeFormatsW@12 @176 _EnumUILanguagesA@12 @177 _EnumUILanguagesW@12 @178 _EnumerateLocalComputerNamesA@16 @179 _EnumerateLocalComputerNamesW@16 @180 _EraseTape@12 @181 _EscapeCommFunction@8 @182 _ExitProcess@4 @183 _ExitThread@4 @184 _ExitVDM@8 @185 _ExpandEnvironmentStringsA@12 @186 _ExpandEnvironmentStringsW@12 @187 _ExpungeConsoleCommandHistoryA@4 @188 _ExpungeConsoleCommandHistoryW@4 @189 _ExtendVirtualBuffer@8 @190 _FatalAppExitA@8 @191 _FatalAppExitW@8 @192 _FatalExit@4 @193 _FileTimeToDosDateTime@12 @194 _FileTimeToLocalFileTime@8 @195 _FileTimeToSystemTime@8 @196 _FillConsoleOutputAttribute@20 @197 _FillConsoleOutputCharacterA@20 @198 _FillConsoleOutputCharacterW@20 @199 _FindActCtxSectionGuid@20 @200 _FindActCtxSectionStringA@20 @201 _FindActCtxSectionStringW@20 @202 _FindAtomA@4 @203 _FindAtomW@4 @204 _FindClose@4 @205 _FindVolumeMountPointClose@4 @206 ; FindCloseChangeNotification _FindFirstChangeNotificationA@12 @207 _FindFirstChangeNotificationW@12 @208 _FindFirstFileA@8 @209 _FindFirstFileExA@24 @210 _FindFirstFileExW@24 @211 _FindFirstFileW@8 @212 _FindFirstVolumeA@8 @213 _FindFirstVolumeMountPointA@12 @214 _FindFirstVolumeMountPointW@12 @215 _FindFirstVolumeW@8 @216 _FindNextChangeNotification@4 @217 _FindNextFileA@8 @218 _FindNextFileW@8 @219 _FindNextVolumeA@12 @220 _FindNextVolumeMountPointA@12 @221 _FindNextVolumeMountPointW@12 @222 _FindNextVolumeW@12 @223 _FindResourceA@12 @224 _FindResourceExA@16 @225 _FindResourceExW@16 @226 _FindResourceW@12 @227 _FindVolumeClose@4 @228 _FindVolumeMountPointClose@4 @229 ; FindVolumeMountPointClose _FlushConsoleInputBuffer@4 @230 _FlushFileBuffers@4 @231 _FlushInstructionCache@12 @232 _FlushViewOfFile@8 @233 _FoldStringA@20 @234 _FoldStringW@20 @235 _FormatMessageA@28 @236 _FormatMessageW@28 @237 _FreeConsole@0 @238 _FreeEnvironmentStringsA@4 @239 _FreeEnvironmentStringsW@4 @240 _FreeLibrary@4 @241 _FreeLibraryAndExitThread@8 @242 _DnsApiSetDebugGlobals@4 @243 _FreeUserPhysicalPages@12 @244 _FreeVirtualBuffer@4 @245 _GenerateConsoleCtrlEvent@8 @246 _GetACP@0 @247 _GetAtomNameA@12 @248 _GetAtomNameW@12 @249 _GetBinaryTypeA@8 @250 ; GetBinaryType _GetBinaryTypeA@8 @251 ; GetBinaryTypeA _GetBinaryTypeW@8 @252 _GetCPFileNameFromRegistry@12 @253 _GetCPInfo@8 @254 _GetCPInfoExA@12 @255 _GetCPInfoExW@12 @256 _GetCalendarInfoA@24 @257 _GetCalendarInfoW@24 @258 _GetComPlusPackageInstallStatus@0 @259 _GetCommConfig@12 @260 _GetCommMask@8 @261 _GetCommModemStatus@8 @262 _GetCommProperties@8 @263 _GetCommState@8 @264 _GetCommTimeouts@8 @265 _GetCommandLineA@0 @266 _GetCommandLineW@0 @267 _GetCompressedFileSizeA@8 @268 _GetCompressedFileSizeW@8 @269 _GetComputerNameA@8 @270 _GetComputerNameExA@12 @271 _GetComputerNameExW@12 @272 _GetComputerNameW@8 @273 _GetConsoleAliasA@16 @274 _GetConsoleAliasExesA@8 @275 _GetConsoleAliasExesLengthA@0 @276 _GetConsoleAliasExesLengthW@0 @277 _GetConsoleAliasExesW@8 @278 _GetConsoleAliasW@16 @279 _GetConsoleAliasesA@12 @280 _GetConsoleAliasesLengthA@4 @281 _GetConsoleAliasesLengthW@4 @282 _GetConsoleAliasesW@12 @283 _GetConsoleCP@0 @284 _GetConsoleCharType@12 @285 _GetConsoleCommandHistoryA@12 @286 _GetConsoleCommandHistoryLengthA@4 @287 _GetConsoleCommandHistoryLengthW@4 @288 _GetConsoleCommandHistoryW@12 @289 _GetConsoleCursorInfo@8 @290 _GetConsoleCursorMode@12 @291 _GetConsoleDisplayMode@4 @292 _GetConsoleFontInfo@16 @293 _GetConsoleFontSize@8 @294 _GetConsoleHardwareState@12 @295 _GetConsoleInputExeNameA@8 @296 _GetConsoleInputExeNameW@8 @297 _GetConsoleInputWaitHandle@0 @298 _GetConsoleKeyboardLayoutNameA@4 @299 _GetConsoleKeyboardLayoutNameW@4 @300 _GetConsoleMode@8 @301 _GetConsoleNlsMode@8 @302 _GetConsoleOutputCP@0 @303 _GetConsoleProcessList@8 @304 _GetConsoleScreenBufferInfo@8 @305 _GetConsoleSelectionInfo@4 @306 _GetConsoleTitleA@8 @307 _GetConsoleTitleW@8 @308 _GetConsoleWindow@0 @309 _GetCurrencyFormatA@24 @310 _GetCurrencyFormatW@24 @311 _GetCurrentActCtx@4 @312 _GetCurrentConsoleFont@12 @313 _GetCurrentDirectoryA@8 @314 _GetCurrentDirectoryW@8 @315 _GetCurrentProcess@0 @316 _GetCurrentProcessId@0 @317 _GetCurrentThread@0 @318 _GetCurrentThreadId@0 @319 _GetDateFormatA@24 @320 _GetDateFormatW@24 @321 _GetDefaultCommConfigA@12 @322 _GetDefaultCommConfigW@12 @323 _GetDefaultSortkeySize@4 @324 _GetDevicePowerState@8 @325 _GetDiskFreeSpaceA@20 @326 _GetDiskFreeSpaceExA@16 @327 _GetDiskFreeSpaceExW@16 @328 _GetDiskFreeSpaceW@20 @329 _GetDllDirectoryA@8 @330 _GetDllDirectoryW@8 @331 _GetDriveTypeA@4 @332 _GetDriveTypeW@4 @333 _GetEnvironmentStrings@0 @334 ; GetEnvironmentStrings _GetEnvironmentStrings@0 @335 ; GetEnvironmentStringsA _GetEnvironmentStringsW@0 @336 _GetEnvironmentVariableA@12 @337 _GetEnvironmentVariableW@12 @338 _GetExitCodeProcess@8 @339 _GetExitCodeThread@8 @340 _GetExpandedNameA@8 @341 _GetExpandedNameW@8 @342 _GetFileAttributesA@4 @343 _GetFileAttributesExA@12 @344 _GetFileAttributesExW@12 @345 _GetFileAttributesW@4 @346 _GetFileInformationByHandle@8 @347 _GetFileSize@8 @348 _GetFileSizeEx@8 @349 _GetFileTime@16 @350 _GetFileType@4 @351 _GetFirmwareEnvironmentVariableA@16 @352 _GetFirmwareEnvironmentVariableW@16 @353 _GetFullPathNameA@16 @354 _GetFullPathNameW@16 @355 _GetGeoInfoA@20 @356 _GetGeoInfoW@20 @357 _GetHandleContext@4 @358 _GetHandleInformation@8 @359 _GetLargestConsoleWindowSize@4 @360 GetLastError @361 _GetLinguistLangSize@4 @362 _GetLocalTime@4 @363 _GetLocaleInfoA@16 @364 _GetLocaleInfoW@16 @365 _GetLogicalDriveStringsA@8 @366 _GetLogicalDriveStringsW@8 @367 _GetLogicalDrives@0 @368 _GetLogicalProcessorInformation@8 @369 _GetLongPathNameA@12 @370 _GetLongPathNameW@12 @371 _GetMailslotInfo@20 @372 _GetModuleFileNameA@12 @373 _GetModuleFileNameW@12 @374 _GetModuleHandleA@4 @375 _GetModuleHandleExA@12 @376 _GetModuleHandleExW@12 @377 _GetModuleHandleW@4 @378 _GetNamedPipeHandleStateA@28 @379 _GetNamedPipeHandleStateW@28 @380 _GetNamedPipeInfo@20 @381 _GetNativeSystemInfo@4 @382 _GetNextVDMCommand@4 @383 _GetNlsSectionName@24 @384 _GetNumaAvailableMemory@12 @385 _GetNumaAvailableMemoryNode@8 @386 _GetNumaHighestNodeNumber@4 @387 _GetNumaNodeProcessorMask@8 @388 _GetNumaProcessorMap@12 @389 _GetNumaProcessorNode@8 @390 _GetNumberFormatA@24 @391 _GetNumberFormatW@24 @392 _GetNumberOfConsoleFonts@0 @393 _GetNumberOfConsoleInputEvents@8 @394 _GetNumberOfConsoleMouseButtons@4 @395 _GetOEMCP@0 @396 _GetOverlappedResult@16 @397 _GetPriorityClass@4 @398 _GetPrivateProfileIntA@16 @399 _GetPrivateProfileIntW@16 @400 _GetPrivateProfileSectionA@16 @401 _GetPrivateProfileSectionNamesA@12 @402 _GetPrivateProfileSectionNamesW@12 @403 _GetPrivateProfileSectionW@16 @404 _GetPrivateProfileStringA@24 @405 _GetPrivateProfileStringW@24 @406 _GetPrivateProfileStructA@20 @407 _GetPrivateProfileStructW@20 @408 _GetProcAddress@8 @409 _GetProcessAffinityMask@12 @410 _GetProcessDEPPolicy@12 @411 _GetProcessHandleCount@8 @412 _GetProcessHeap@0 @413 _GetProcessHeaps@8 @414 _GetProcessId@4 @415 _GetProcessIoCounters@8 @416 _GetProcessPriorityBoost@8 @417 _GetProcessShutdownParameters@8 @418 _GetProcessTimes@20 @419 _GetProcessVersion@4 @420 _GetProcessWorkingSetSize@12 @421 _GetProfileIntA@12 @422 _GetProfileIntW@12 @423 _GetProfileSectionA@12 @424 _GetProfileSectionW@12 @425 _GetProfileStringA@20 @426 _GetProfileStringW@20 @427 _GetQueuedCompletionStatus@20 @428 _GetShortPathNameA@12 @429 _GetShortPathNameW@12 @430 _GetStartupInfoA@4 @431 _GetStartupInfoW@4 @432 _GetStdHandle@4 @433 _GetStringTypeA@20 @434 _GetStringTypeExA@20 @435 _GetStringTypeExW@20 @436 _GetStringTypeW@16 @437 _GetSystemDEPPolicy@0 @438 _GetSystemDefaultLCID@0 @439 _GetSystemDefaultLangID@0 @440 _GetSystemDefaultUILanguage@0 @441 _GetSystemDirectoryA@8 @442 _GetSystemDirectoryW@8 @443 _GetSystemInfo@4 @444 _GetSystemPowerStatus@4 @445 _GetSystemRegistryQuota@8 @446 _GetSystemTime@4 @447 _GetSystemTimeAdjustment@12 @448 _GetSystemTimeAsFileTime@4 @449 _GetSystemTimes@12 @450 _GetSystemWindowsDirectoryA@8 @451 _GetSystemWindowsDirectoryW@8 @452 _GetSystemWow64DirectoryA@8 @453 ; GetSystemWow64DirectoryA _GetSystemWow64DirectoryA@8 @454 ; GetSystemWow64DirectoryW _GetTapeParameters@16 @455 _GetTapePosition@20 @456 _GetTapeStatus@4 @457 _GetTempFileNameA@16 @458 _GetTempFileNameW@16 @459 _GetTempPathA@8 @460 _GetTempPathW@8 @461 _GetThreadContext@8 @462 _GetThreadIOPendingFlag@8 @463 _GetThreadLocale@0 @464 _GetThreadPriority@4 @465 _GetThreadPriorityBoost@8 @466 _GetThreadSelectorEntry@12 @467 _GetThreadTimes@20 @468 _GetTickCount@0 @469 _GetTimeFormatA@24 @470 _GetTimeFormatW@24 @471 _GetTimeZoneInformation@4 @472 _GetUserDefaultLCID@0 @473 _GetUserDefaultLangID@0 @474 _GetUserDefaultUILanguage@0 @475 _GetUserGeoID@4 @476 _GetVDMCurrentDirectories@8 @477 _GetVersion@0 @478 _GetVersionExA@4 @479 _GetVersionExW@4 @480 _GetVolumeInformationA@32 @481 _GetVolumeInformationW@32 @482 _GetVolumeNameForVolumeMountPointA@12 @483 _GetVolumeNameForVolumeMountPointW@12 @484 _GetVolumePathNameA@12 @485 _GetVolumePathNameW@12 @486 _GetVolumePathNamesForVolumeNameA@16 @487 _GetVolumePathNamesForVolumeNameW@16 @488 _GetWindowsDirectoryA@8 @489 _GetWindowsDirectoryW@8 @490 _GetWriteWatch@24 @491 _GlobalAddAtomA@4 @492 _GlobalAddAtomW@4 @493 _GlobalAlloc@8 @494 _LocalCompact@4 @495 ; GlobalCompact _GlobalDeleteAtom@4 @496 _GlobalFindAtomA@4 @497 _GlobalFindAtomW@4 @498 _GlobalFix@4 @499 _GlobalFlags@4 @500 _GlobalFree@4 @501 _GlobalGetAtomNameA@12 @502 _GlobalGetAtomNameW@12 @503 _GlobalHandle@4 @504 _GlobalLock@4 @505 _GlobalMemoryStatus@4 @506 _GlobalMemoryStatusEx@4 @507 _GlobalReAlloc@12 @508 _GlobalSize@4 @509 _GlobalUnWire@4 @510 _GlobalUnfix@4 @511 _GlobalUnlock@4 @512 _GlobalWire@4 @513 _Heap32First@12 @514 _Heap32ListFirst@8 @515 _Heap32ListNext@8 @516 _Heap32Next@4 @517 HeapAlloc @518 _HeapCompact@8 @519 _HeapCreate@12 @520 _HeapCreateTagsW@16 @521 _HeapDestroy@4 @522 _HeapExtend@16 @523 HeapFree @524 _HeapLock@4 @525 _HeapQueryInformation@20 @526 _HeapQueryTagW@20 @527 HeapReAlloc @528 _HeapSetInformation@16 @529 _HeapSize@12 @530 ; Must be: HeapSize _HeapSummary@12 @531 _HeapUnlock@4 @532 _HeapUsage@20 @533 _HeapValidate@12 @534 _HeapWalk@8 @535 _InitAtomTable@4 @536 _InitializeCriticalSection@4 @537 _InitializeCriticalSectionAndSpinCount@8 @538 InitializeSListHead @539 _InterlockedCompareExchange@12 @540 _InterlockedDecrement@4 @541 _InterlockedExchange@8 @542 _InterlockedExchangeAdd@8 @543 InterlockedFlushSList @544 _InterlockedIncrement@4 @545 InterlockedPopEntrySList @546 InterlockedPushEntrySList @547 _InvalidateConsoleDIBits@8 @548 _IsBadCodePtr@4 @549 _IsBadHugeReadPtr@8 @550 _IsBadHugeWritePtr@8 @551 _IsBadReadPtr@8 @552 _IsBadStringPtrA@8 @553 _IsBadStringPtrW@8 @554 _IsBadWritePtr@8 @555 _IsDBCSLeadByte@4 @556 _IsDBCSLeadByteEx@8 @557 _IsDebuggerPresent@0 @558 _IsProcessInJob@12 @559 _IsProcessorFeaturePresent@4 @560 _IsSystemResumeAutomatic@0 @561 _IsValidCodePage@4 @562 _IsValidLanguageGroup@8 @563 _IsValidLocale@8 @564 _IsValidUILanguage@4 @565 _IsWow64Process@8 @566 _LCMapStringA@24 @567 _LCMapStringW@24 @568 _LZClose@4 @569 _LZCloseFile@4 @570 _LZCopy@8 @571 _LZCreateFileW@20 @572 LZDone @573 ; LZDone _LZInit@4 @574 _LZOpenFileA@12 @575 _LZOpenFileW@12 @576 _LZRead@12 @577 _LZSeek@12 @578 _LZStart@0 @579 LeaveCriticalSection @580 _LoadLibraryA@4 @581 _LoadLibraryExA@12 @582 _LoadLibraryExW@12 @583 _LoadLibraryW@4 @584 _LoadModule@8 @585 _LoadResource@8 @586 _LocalAlloc@8 @587 _LocalCompact@4 @588 ; LocalCompact _LocalFileTimeToFileTime@8 @589 _LocalFlags@4 @590 _LocalFree@4 @591 _LocalHandle@4 @592 _LocalLock@4 @593 _LocalReAlloc@12 @594 _LocalShrink@8 @595 _LocalSize@4 @596 _LocalUnlock@4 @597 _LockFile@20 @598 _LockFileEx@24 @599 _LockResource@4 @600 ; LockResource _MapUserPhysicalPages@12 @601 _MapUserPhysicalPagesScatter@12 @602 _MapViewOfFile@20 @603 _MapViewOfFileEx@24 @604 _Module32First@8 @605 _Module32FirstW@8 @606 _Module32Next@8 @607 _Module32NextW@8 @608 _MoveFileA@8 @609 _MoveFileExA@12 @610 _MoveFileExW@12 @611 _MoveFileW@8 @612 _MoveFileWithProgressA@20 @613 _MoveFileWithProgressW@20 @614 _MulDiv@12 @615 _MultiByteToWideChar@24 @616 _NlsConvertIntegerToString@20 @617 _NlsGetCacheUpdateCount@0 @618 _NlsResetProcessLocale@0 @619 _NumaVirtualQueryNode@16 @620 _OpenConsoleW@16 @621 _OpenDataFile@8 @622 _OpenEventA@12 @623 _OpenEventW@12 @624 _OpenFile@12 @625 _OpenFileMappingA@12 @626 _OpenFileMappingW@12 @627 _OpenJobObjectA@12 @628 _OpenJobObjectW@12 @629 _OpenMutexA@12 @630 _OpenMutexW@12 @631 _OpenProcess@12 @632 _OpenProfileUserMapping@0 @633 _OpenSemaphoreA@12 @634 _OpenSemaphoreW@12 @635 _OpenThread@12 @636 _OpenWaitableTimerA@12 @637 _OpenWaitableTimerW@12 @638 _OutputDebugStringA@4 @639 _OutputDebugStringW@4 @640 _PeekConsoleInputA@16 @641 _PeekConsoleInputW@16 @642 _PeekNamedPipe@24 @643 _PostQueuedCompletionStatus@16 @644 _PrepareTape@12 @645 _PrivCopyFileExW@24 @646 _PrivMoveFileIdentityW@12 @647 _Process32First@8 @648 _Process32FirstW@8 @649 _Process32Next@8 @650 _Process32NextW@8 @651 _ProcessIdToSessionId@8 @652 _PulseEvent@4 @653 _PurgeComm@8 @654 _QueryActCtxW@28 @655 QueryDepthSList @656 _QueryDosDeviceA@12 @657 _QueryDosDeviceW@12 @658 _QueryInformationJobObject@20 @659 _QueryMemoryResourceNotification@8 @660 _QueryPerformanceCounter@4 @661 _QueryPerformanceFrequency@4 @662 _QueryWin31IniFilesMappedToRegistry@16 @663 _QueueUserAPC@12 @664 _QueueUserWorkItem@12 @665 _RaiseException@16 @666 _ReadConsoleA@20 @667 _ReadConsoleInputA@16 @668 _ReadConsoleInputExA@20 @669 _ReadConsoleInputExW@20 @670 _ReadConsoleInputW@16 @671 _ReadConsoleOutputA@20 @672 _ReadConsoleOutputAttribute@20 @673 _ReadConsoleOutputCharacterA@20 @674 _ReadConsoleOutputCharacterW@20 @675 _ReadConsoleOutputW@20 @676 _ReadConsoleW@20 @677 _ReadDirectoryChangesW@32 @678 _ReadFile@20 @679 _ReadFileEx@20 @680 _ReadFileScatter@20 @681 _ReadProcessMemory@20 @682 _RegisterConsoleIME@8 @683 _RegisterConsoleOS2@4 @684 _RegisterConsoleVDM@44 @685 _RegisterWaitForInputIdle@4 @686 _RegisterWaitForSingleObject@24 @687 _RegisterWaitForSingleObjectEx@20 @688 _RegisterWowBaseHandlers@4 @689 _RegisterWowExec@4 @690 _ReleaseActCtx@4 @691 _ReleaseMutex@4 @692 _ReleaseSemaphore@12 @693 _RemoveDirectoryA@4 @694 _RemoveDirectoryW@4 @695 _RemoveLocalAlternateComputerNameA@8 @696 _RemoveLocalAlternateComputerNameW@8 @697 RemoveVectoredExceptionHandler @698 _ReplaceFileW@24 @699 ; ReplaceFile _ReplaceFileA@24 @700 _ReplaceFileW@24 @701 ; ReplaceFileW _RequestDeviceWakeup@4 @702 _RequestWakeupLatency@4 @703 _ResetEvent@4 @704 _ResetWriteWatch@8 @705 RestoreLastError @706 _ResumeThread@4 @707 RtlCaptureContext @708 RtlCaptureStackBackTrace @709 RtlFillMemory @710 RtlMoveMemory @711 RtlUnwind @712 RtlZeroMemory @713 _ScrollConsoleScreenBufferA@20 @714 _ScrollConsoleScreenBufferW@20 @715 _SearchPathA@24 @716 _SearchPathW@24 @717 _SetCPGlobal@4 @718 _SetCalendarInfoA@16 @719 _SetCalendarInfoW@16 @720 _SetClientTimeZoneInformation@4 @721 _SetComPlusPackageInstallStatus@4 @722 _SetCommBreak@4 @723 _SetCommConfig@12 @724 _SetCommMask@8 @725 _SetCommState@8 @726 _SetCommTimeouts@8 @727 _SetComputerNameA@4 @728 _SetComputerNameExA@8 @729 _SetComputerNameExW@8 @730 _SetComputerNameW@4 @731 _SetConsoleActiveScreenBuffer@4 @732 _SetConsoleCP@4 @733 _SetConsoleCommandHistoryMode@4 @734 _SetConsoleCtrlHandler@8 @735 _SetConsoleCursor@8 @736 _SetConsoleCursorInfo@8 @737 _SetConsoleCursorMode@12 @738 _SetConsoleCursorPosition@8 @739 _SetConsoleDisplayMode@12 @740 _SetConsoleFont@8 @741 _SetConsoleHardwareState@12 @742 _SetConsoleIcon@4 @743 _SetConsoleInputExeNameA@4 @744 _SetConsoleInputExeNameW@4 @745 _SetConsoleKeyShortcuts@16 @746 _SetConsoleLocalEUDC@16 @747 _SetConsoleMaximumWindowSize@8 @748 _SetConsoleMenuClose@4 @749 _SetConsoleMode@8 @750 _SetConsoleNlsMode@8 @751 _SetConsoleNumberOfCommandsA@8 @752 _SetConsoleNumberOfCommandsW@8 @753 _SetConsoleOS2OemFormat@4 @754 _SetConsoleOutputCP@4 @755 _SetConsolePalette@12 @756 _SetConsoleScreenBufferSize@8 @757 _SetConsoleTextAttribute@8 @758 _SetConsoleTitleA@4 @759 _SetConsoleTitleW@4 @760 _SetConsoleWindowInfo@12 @761 SetCriticalSectionSpinCount @762 _SetCurrentDirectoryA@4 @763 _SetCurrentDirectoryW@4 @764 _SetDefaultCommConfigA@12 @765 _SetDefaultCommConfigW@12 @766 _SetDllDirectoryA@4 @767 _SetDllDirectoryW@4 @768 _SetEndOfFile@4 @769 _SetEnvironmentVariableA@8 @770 _SetEnvironmentVariableW@8 @771 _SetErrorMode@4 @772 _SetEvent@4 @773 _SetFileApisToANSI@0 @774 _SetFileApisToOEM@0 @775 _SetFileAttributesA@8 @776 _SetFileAttributesW@8 @777 _SetFilePointer@16 @778 _SetFilePointerEx@20 @779 _SetFileShortNameA@8 @780 _SetFileShortNameW@8 @781 _SetFileTime@16 @782 _SetFileValidData@12 @783 _SetFirmwareEnvironmentVariableA@16 @784 _SetFirmwareEnvironmentVariableW@16 @785 _GetSystemWow64DirectoryA@8 @786 ; SetHandleContext _LockResource@4 @787 ; SetHandleCount _SetHandleInformation@12 @788 _SetInformationJobObject@16 @789 _SetLastConsoleEventActive@0 @790 SetLastError @791 _SetLocalPrimaryComputerNameA@8 @792 _SetLocalPrimaryComputerNameW@8 @793 _SetLocalTime@4 @794 _SetLocaleInfoA@12 @795 _SetLocaleInfoW@12 @796 _SetMailslotInfo@8 @797 _SetMessageWaitingIndicator@8 @798 _SetNamedPipeHandleState@16 @799 _SetPriorityClass@8 @800 _SetProcessAffinityMask@8 @801 _SetProcessDEPPolicy@4 @802 _SetProcessPriorityBoost@8 @803 _SetProcessShutdownParameters@8 @804 _SetProcessWorkingSetSize@12 @805 _SetStdHandle@8 @806 _SetSystemPowerState@8 @807 _SetSystemTime@4 @808 _SetSystemTimeAdjustment@8 @809 _SetTapeParameters@12 @810 _SetTapePosition@24 @811 _SetTermsrvAppInstallMode@4 @812 _SetThreadAffinityMask@8 @813 _SetThreadContext@8 @814 _SetThreadExecutionState@4 @815 _SetThreadIdealProcessor@8 @816 _SetThreadLocale@4 @817 _SetThreadPriority@8 @818 _SetThreadPriorityBoost@8 @819 _SetThreadUILanguage@4 @820 _SetTimeZoneInformation@4 @821 _SetTimerQueueTimer@24 @822 _SetUnhandledExceptionFilter@4 @823 _SetUserGeoID@4 @824 _SetVDMCurrentDirectories@8 @825 _SetVolumeLabelA@8 @826 _SetVolumeLabelW@8 @827 _SetVolumeMountPointA@8 @828 _SetVolumeMountPointW@8 @829 _SetWaitableTimer@24 @830 _SetupComm@12 @831 _ShowConsoleCursor@8 @832 _SignalObjectAndWait@16 @833 _SizeofResource@8 @834 _Sleep@4 @835 _SleepEx@8 @836 _SuspendThread@4 @837 _SwitchToFiber@4 @838 _SwitchToThread@0 @839 _SystemTimeToFileTime@8 @840 _SystemTimeToTzSpecificLocalTime@12 @841 _TerminateJobObject@8 @842 _TerminateProcess@8 @843 _TerminateThread@8 @844 _TermsrvAppInstallMode@0 @845 _Thread32First@8 @846 _Thread32Next@8 @847 _TlsAlloc@0 @848 _TlsFree@4 @849 _TlsGetValue@4 @850 _TlsSetValue@8 @851 _Toolhelp32ReadProcessMemory@20 @852 _TransactNamedPipe@28 @853 _TransmitCommChar@8 @854 _TrimVirtualBuffer@4 @855 TryEnterCriticalSection @856 _TzSpecificLocalTimeToSystemTime@12 @857 _UTRegister@28 @858 _UTUnRegister@4 @859 _UnhandledExceptionFilter@4 @860 _UnlockFile@20 @861 _UnlockFileEx@20 @862 _UnmapViewOfFile@4 @863 _UnregisterConsoleIME@0 @864 _UnregisterWait@4 @865 _UnregisterWaitEx@8 @866 _UpdateResourceA@24 @867 _UpdateResourceW@24 @868 _VDMConsoleOperation@8 @869 _VDMOperationStarted@4 @870 _ValidateLCType@16 @871 _ValidateLocale@4 @872 _VerLanguageNameA@12 @873 _VerLanguageNameW@12 @874 VerSetConditionMask @875 _VerifyConsoleIoHandle@4 @876 _VerifyVersionInfoA@16 @877 _VerifyVersionInfoW@16 @878 _VirtualAlloc@16 @879 _VirtualAllocEx@20 @880 _VirtualBufferExceptionHandler@12 @881 _VirtualFree@12 @882 _VirtualFreeEx@16 @883 _VirtualLock@8 @884 _VirtualProtect@16 @885 _VirtualProtectEx@20 @886 _VirtualQuery@12 @887 _VirtualQueryEx@16 @888 _VirtualUnlock@8 @889 _WTSGetActiveConsoleSessionId@0 @890 _WaitCommEvent@12 @891 _WaitForDebugEvent@8 @892 _WaitForMultipleObjects@16 @893 _WaitForMultipleObjectsEx@20 @894 _WaitForSingleObject@8 @895 _WaitForSingleObjectEx@12 @896 _WaitNamedPipeA@8 @897 _WaitNamedPipeW@8 @898 _WideCharToMultiByte@32 @899 _WinExec@8 @900 _WriteConsoleA@20 @901 _WriteConsoleInputA@16 @902 _WriteConsoleInputVDMA@16 @903 _WriteConsoleInputVDMW@16 @904 _WriteConsoleInputW@16 @905 _WriteConsoleOutputA@20 @906 _WriteConsoleOutputAttribute@20 @907 _WriteConsoleOutputCharacterA@20 @908 _WriteConsoleOutputCharacterW@20 @909 _WriteConsoleOutputW@20 @910 _WriteConsoleW@20 @911 _WriteFile@20 @912 _WriteFileEx@20 @913 _WriteFileGather@20 @914 _WritePrivateProfileSectionA@12 @915 _WritePrivateProfileSectionW@12 @916 _WritePrivateProfileStringA@16 @917 _WritePrivateProfileStringW@16 @918 _WritePrivateProfileStructA@20 @919 _WritePrivateProfileStructW@20 @920 _WriteProcessMemory@20 @921 _WriteProfileSectionA@8 @922 _WriteProfileSectionW@8 @923 _WriteProfileStringA@12 @924 _WriteProfileStringW@12 @925 _WriteTapemark@16 @926 _ZombifyActCtx@4 @927 __lread@12 @928 ; _hread __lwrite@12 @929 ; _hwrite __lclose@4 @930 __lcreat@8 @931 __llseek@12 @932 __lopen@8 @933 __lread@12 @934 ; _lread __lwrite@12 @935 ; _lwrite _lstrcatA@8 @936 ; lstrcat _lstrcatA@8 @937 ; lstrcatA _lstrcatW@8 @938 _lstrcmpA@8 @939 ; lstrcmp _lstrcmpA@8 @940 ; lstrcmpA _lstrcmpW@8 @941 _lstrcmpiA@8 @942 ; lstrcmpi _lstrcmpiA@8 @943 ; lstrcmpiA _lstrcmpiW@8 @944 _lstrcpyA@8 @945 ; lstrcpy _lstrcpyA@8 @946 ; lstrcpyA _lstrcpyW@8 @947 _lstrcpynA@12 @948 ; lstrcpyn _lstrcpynA@12 @949 ; lstrcpynA _lstrcpynW@12 @950 _lstrlenA@4 @951 ; lstrlen _lstrlenA@4 @952 ; lstrlenA _lstrlenW@4 @953 Заметим, что одну строчку нам пришлось поправить вручную: Код (Text): _HeapSize@12 @530 ; Must be: HeapSize У «Иды» этот кусок кода представлен следующим образом: Код (Text): .text:7C80911A ; Exported entry 530. HeapSize .text:7C80911A public HeapSize .text:7C80911A ; SIZE_T __stdcall HeapSize(HANDLE hHeap, DWORD dwFlags, LPCVOID lpMem) .text:7C80911A HeapSize db 'NTDLL.RtlSizeHeap',0 ; DATA XREF: .text:off_7C802654 o Т.е. мы имеем переходник на функцию из другого модуля, которая в kernel32.dll совершенно не используется, потому, видимо, Ильфак поленился вместо HeapSize написать _HeapSize@12. Поэтому это пришлось делать нам, так как иначе не проходит компиляция в lib-файл. Однако для других использованных библиотек, особенно, для такого тяжеловеса как shell32.dll, подобных правок мне делать больше не пришлось. shell32.dll это особый случай, но там у меня все прошло успешно, если не считать того, что копировать листинг этого файла через буфер обмена мне пришлось несколько раз (четырьмя кусками), так как объем листинга составлял порядка 60 мегабайт и за один раз копироваться не захотел. Ну, вот и всё. Полученные либы я проверил на нескольких своих ассемблерных проектах. Вроде все работает. Так что, если возникнут какие-либо нюансы, всегда можно будет подредактировать получаемые def-файлы. Ну, а чтобы из дефов получить либы, используем утилиту polib.exe из бесплатного пакета MASM32, например, с помощью командного файла def2lib.bat: Код (Text): SET FILENAME=kernel32 :: Создание lib файла из def файла Bin\polib /DEF:%FILENAME%.def /OUT:%FILENAME%.lib /MACHINE:X86 > a.a P.S. Анализируя файл kernel32.def, можно заметить, что встречаются неоднократно одинаковые имена некоторых функций (до 3-х раз), но с разными ординалами. Это говорит о том, что одному и тому же коду некоторой функции из kernel32.dll соответствует несколько различных имен и ординалов. Другими словами, можно через различные имена и ординалы обращаться к одному и тому же коду. Однако экспортирование новых имен в библиотеке kernel32.dll не происходит. Фактически происходит только экспортирование различных ординалов, поэтому и «Ида» и мы показываем для