Добро пожаловать, гость ( Вход | Регистрация )
| Дата поста: | В теме: | За сообщение: | Спасибо сказали: | ||
|---|---|---|---|---|---|
| Aug 17 2016, 10:15 | STUNS - STupid UNcompreSsor | Собрал новую версию v0.5. Русским языком: Натолкнулся на падение STUNS из-за minilzo, причём на потоке, где был, как оказалось, только deflate. Блин, давно надо было обновить все библиотеки распаковщиков. Также, на всякий случай, обновил UCL. Там, кстати, есть новые алгоритмы сжатия, типа NRV2E и NRV2E-99, но их тогда надо отдельными ключами командной строки добавлять - сейчас нет времени и желания с этим копаться, так что лишние файлы просто выкинул для уменьшения размера дистрибутива. Главное, что не падает больше. Все библиотеки в STUNS сейчас должны быть последних версий. |
Axsis, Siberian GRemlin, | ||
| Jul 13 2016, 10:45 | The Last Express Gold Edition | Ух, ты! Первый раз вижу .EXE файл, который реально использует reloc'и! $0054E2F8 => $00B0E2F8 Во всяком случае у меня оно сюда грузится. Проверь у себя - такой же адрес будет или нет. Если нет, то придётся тебе получать адрес, куда загружен процесс, затем прибавлять к нему $0014E2F8 ($0054E2F8 - $00400000), чтобы получить смещение до своей строки. Гугли как можно по ProcessInfo.hProcess или ProcessInfo.dwProcessId (PID) получить HMODULE / HINSTANCE (это как раз адрес загрузки). Я попробовал строчку Arial заменить на Comic - вроде бы, ошибок нет, но и шрифт в меню и Credits не поменялся (во всяком случае на Comic не похож). Возможно, Arial, он везде Arial, а Comic нужно было писать полным именем как "Comic Sans MS", поэтому и не сработало. Но WriteProcessMemory() возвращет True, так что всё отрабатывает без проблем. Кстати, всё забываю сказать - у тебя дескрипторы текут - после ResumeThread() нужно обязательно его закрывать: CloseHandle(ProcessInfo.hThread); Закрытие дескриптора - это не завершение процесса. |
Siberian GRemlin, | ||
| Jul 4 2016, 14:39 | Кто чего слушает? | Kaleo - Way Down We Go (Official Video) Kaleo - "Way Down We Go" (LIVE in a volcano) Во втором клипе они реально в недра вулкана спустились. Правда уже недействующего. (*улыбается*) |
Axsis, | ||
| Jun 26 2016, 18:28 | The Last Express Gold Edition | Это просто адрес кода. Его можно посмотреть в HIEW или IDA например (это из другой программы): .0040117A: E8D1FD0200 call ExitProcess ; KERNEL32 Вот это $0040117A и есть адрес в памяти загруженного процесса. Учти, что это виртуальный адрес, а не смещение в файле. var buff, dw: DWORD; ... if (ReadProcessMemory(pHandle, $0040117A, @buff, 4, @dw) = true) then writeln(buff); // buff == $02FDD1E8 ... .EXE не используют relocations, так что для исполняемого файла адрес всегда будет абсолютный и одинаковый на любой системе. А для .DLL тебе нужно будет к базе (GetModulaHandle() / LoadLibrary()) прибавлять относительный адрес (т.е. от начала модуля). Вообще, проверить можешь - читаешь память по указаному адресу (ReadProcessMemory()) и смотришь "Arial" ли там. Если да - значит попал куда надо. (*улыбается*) |
Siberian GRemlin, | ||
| Jun 26 2016, 13:00 | The Last Express Gold Edition | QUOTE(Siberian GRemlin @ Jun 26 2016, 12:12) [snapback]4113[/snapback] Печально, но ни один из вариантов не помог. Может игра как-то иначе субтитры выводит, не через эту функцию / DLL. Наверное.Насчёт .EXE и "Arial", попробуй так (малой кровью проверить): 1) Пишешь программу, которая через CreateProcess() создаёт процесс игры в спящем (CREATE_SUSPENDED) режиме. 2) Патчишь своё "Arial" в памяти (WriteProcessMemory()) на что нужно (не забудь права на память поменять и обратно - VirtualProtectEx()) или что ты там хотел изменить. 3) "Отпускаешь" процесс на исполнение через ResumeThread(). Если этот финт с ушами пройдёт (игра не проверят свой код в памяти и после изменения начала видеть русские буквы), то можно, в принципе, так в виде запускалки и оставить. |
Siberian GRemlin, | ||
| Jun 26 2016, 11:22 | The Last Express Gold Edition | Если не проверяется, то ок. Попробуй, пока что, такое: libcocos2d.dll 0005F0EC: 01 -> 00 ; DEFAULT_CHARSET (1) -> ANSI_CHARSET (0) Если не поможет, то попробуй вместо 00 вписать CC - это RUSSIAN_CHARSET (204). Если и так не сработает, значит в ту ветку, почему-то, управление не передаётся и можно попробовать перед самым созданием шрифта заменить качество на кодировку: // это то, что мы выше меняли .1005FCE9: C6 45 83 01 mov b,[ebp][-7D], 001 => mov b,[ebp+var_94.lfCharSet], 1 // а это - установка качества непосредственно перед вызовом CreateFontIndirect() .1005FE64: C6 45 86 04 mov b,[ebp][-7A], 004 => mov b,[ebp+var_94.lfQuality], 4 ; (ANTIALIASED_QUALITY 4) Т.е. меняешь 86 на 83 и вместо 04 пишешь 00 или CC (смещение начала этой инструкции 0005F264). Шрифт, правда, вместо ANTIALIASED будет с обычным, простым, начертанием, зато с нужной кодировкой. |
Siberian GRemlin, | ||
| Jun 25 2016, 21:03 | STUNS - STupid UNcompreSsor | Собрал новую версию v0.4. Описание на английском (спасибо Grom PE за его пруфрид, а также справки по командной строке!) и ссылку в первом сообщении обновил. Пришлось правда в справке по ключам командной строки кое-чего тут и там подсократить, чтобы в стандартный экран 80x25 влезало. Вообще, хотел всё это ещё в октябре прошлого года выложить, но забыл. Русским языком: - появилась возможность задать смещение (только в hex) откуда сканировать, что помогает пропустить лишние данные в начале файла (по умолчанию 0 - с начала файла) - появилась возможность задать максимальное количество файлов (например, 25) после распаковки которых программа завершает работу (по умолчанию 0 - неограниченно) - наконец, появилась та штука, которую, видимо, планировал сделать ещё сам автор оригинальной программы - если вы помните, то ключи с именами алгоритма указываются просто и с "-" на конце если алгоритм нужно отключить; при этом т.к. по умолчанию все алгоритмы включены, то простое использование любого алгоритма без "-" на конце ничего не меняло; т.е. если в сканируемом файле использовался только один, скажем, deflate, то все остальные приходилось отключать: stuns -pkware- -lzo- -ucl2b- -ucl2d- ... что раздувало командную строку, да и раздражало набирать; теперь же достаточно написать: stuns -deflate ... и все остальные алгоритмы сами отключатся; если нужно два каких-то, то пишем: stuns -deflate -pkware ... будут использованы только deflate и pkware, а остальные отключатся - по-моему очень удобно. |
Axsis, Siberian GRemlin, | ||
| Feb 7 2016, 13:45 | Новости сайта | Друзья! Нам сегодня исполнилось 10 лет! Поздравляю всех с этой круглой датой! Кое-что я написал в новостях на главной, но хотелось бы вспомнить всю историю нашего проекта... Начать, наверное, стоит с товарища Terminus'а - автора и хозяина сайта Extractor.ru - если бы не он, то, скорее всего, и нашего проекта не было бы, потому что Extractor.ru это не просто крупнейший, а единственный русскоязычный сайт по распаковке ресурсов. Практически все из нашей команды познакомились именно там. А уже потом, в 2006 году товарищ Blade вытащил меня с моей домашней странички CTPAX-CHEATER на народе на отдельный хостинг и домен второго уровня. Мало кто знает, но в то время у меня было всё очень сложно - я крутился на нескольких работах и только после полуночи у меня появлялось время чтобы заняться свежеоткрывшимся сайтом, ответить на почту людям, а рано утром снова вставать на работу... Blade буквально на ходу писал сайт, добавлял новые вещи, исправлял и менял уже написанное и отшлифовывал сайт насколько мог. В то же время нам помогал недавно снова вернувшися в наши ряды товарищ RAYN3, который влился в нашу команду разбираясь тогда с шифрованием архивов в русской версии Bloodrayne 2. У нас практически каждый день что-то менялось. Это было безумное время, но мы выдержали. А потом мы, я считаю, отлично заявили о себе с NFS Multimedia Converter'ом - нам всем есть чем гордиться, это была отлично выполненная и качественная работа - не многие коммерческие фирмы могут сделать подобные вещи на таком же уровне. У нас была пара ошибок, которые, к слову, от нас не зависили - кривая работа eaconv.exe с русскими путями и точками в имени файлов, а также кривопересобранный пиратский "sdat.viv", кажется, от NFS:U2, для которого пришлось добавлять поддержку в конвертере, но это всё детали. У нас всех были свои "5 минут славы", когда мы делали первыми, единственными и лучше всех. Но не только у нас всех, но и каждого по отдельности - Xplorer со своим ToWav и огромной помощью с другими вещами, jTommy со многими и многими полезными и уникальными утилитами, Siberian GRemlin с утилитами для работы .VP6 и своими отличными переводами и русификаторами, Grom PE с конвертером DMM2XM, прочими утилитами и помощью с другими вещами, Axsis - человек, уникальный тем, что несмотря на то, что практически не написав ни одного распаковщика помог разобрать не один зубодробительный формат от сложности которых реально можно было крышей двинуться. А ещё с нами были Alex - первый и единственный модератор форума, товарищи Bourn - nocd и другие полезные программы, angeld29 - помощь с распаковкой и дешифровкой Resident Evil 3 (у него, кстати, свой сайт имеется - Angel Death's page с разными программами). Считаю нужным упомянуть и товарища Xexys утилиты которого, после закрытия сайта товарища jTommy теперь хостятся у нас и мы не дали столь полезным программам кануть в Лету. Также было бы несправедливо забыть про наших форумчан: xkL0#J (поддержка сайта, активное в обсуждениях на форуме), Капитан Фокин (помощь и тестирование плагина CheckSum для FAR), nickolayer (активное обсуждение на форуме), Raf-9600 (nocd для NFS2, Disciples: Sacred Lands, Star Wars: Galactic Battlegrounds music fix), useretail (активное обсуждение на форуме), geminiYO (помощь с конвертером для NFS4). А ещё хочется сказать спасибо участникам форума Extractor.ru: конечно же Terminus'у, а также VAG (eaconv.exe, unepf и множество других утилит), CrOm (плагин к FAR для распаковки игровых ресурсов), John_Modest (полезнейшие утилиты для игр серии Silent Hill), Guru (первый конвертер для NFS:U), а также многим-многим другим! Прошу простить, если забыл чьи-то заслуги или даже кого-то - сложно вспомнить всё, что было за эти 10 лет и объять необъятное. Спасибо всем, кто так или иначе был с нами за это время! Без вас всё было бы иначе, а возможно и не было бы совсем ничего! |
Axsis, Siberian GRemlin, | ||
| Feb 4 2016, 18:29 | Новости сайта | Друзья! К нашей команде примкнул, отлучившийся на 10 лет по жизненным обстоятельствам, товарищ RAYN3! Кто-то, возможно, не в курсе кто это - посмотрите страницу "О проекте" на основном сайте. (*улыбается*) Прошу любить и жаловать! |
RAYN3, | ||
| Oct 2 2015, 15:08 | !Вирусы! | Всё, я так больше не могу - мучительно хочется кому-нибудь в глаз дать, но не знаешь с кого начать... Прошу отнестись серьёзно к тексту ниже, т.к. он касается всех. Итак, с чего бы начать?.. Позавчера товарищ Siberian GRemlin прислал мне на почту письмо (за что ему спасибо), сказав что он не может зайти на мой сайт (ctpax-cheater) т.к. его блокирует Интернет-обозреватель. Кто не знал - современные оборзеливатели тягают откуда-то список "плохих сайтов" и если ваш сайт туда угодил, то пользователи зайти к вам не смогут. Я современными программами не пользуюсь, ибо хрень на палочке, так что об этой проблеме не знал. Стал искать кто эти списки составляет - тоже, кстати, нетривиальная задача, ибо кто этим только не занимается. Вышел вот сюда: https://www.stopbadware.org/clearinghouse/search Вбил туда адрес своего сайта и узнал, что мой сайт аж с марта (!) в блокировке из-за какого-то ThreatTrack. Нагуглил их сайт: http://www.threattracksecurity.com/resourc...ubmissions.aspx Зашёл в "Blocked website" и объяснил, что у меня нет никаких вирусов и прочей фигни - потрудитесь объяснить, за что вы мой сайт заблокировали. Сегодня опять зашёл на stopbadware.org и смотрю - с моего сайта блокировка снята (1 октября - когда на ThreatTrack написал). Но теперь в истории моего сайта есть запись, что он был в блокировке с марта по октябрь. Это, конечно, не судимость, но очень неприятно. А теперь то, что меня ОСОБЕННО БЕСИТ. Я проверил свой сайт на трёх сервисах: virustotal.com/en/url/... google.com/safebrowsing/diagnostic... urlvoid.com/... И только VirusTotal.com сказал, что мой сайт был проверен в марте (всё совпадает) и 1 (ОДИН!) антивирус что-то там нашёл - чёртов BitDefender! Самое главное - я сделал ещё раз проверку сайта на VirusTotal.com и там больше ничего не нашлось - сайт прошёл проверку всеми антивирусами. Вы понимаете что происходит? - какие-то уроды пишут кривой антивирус BitDefender, который всё считает вирусами; - кто-то, на каком-то сервисе, отправляет мой сайт на проверку; - мой сайт блокируется 1 (одним!) куском не буду говорить чего, но это был BitDefender; - из-за 1 (одного!!!) ложного срабатывания мой сайт попадает в чёрный список, который непонятно кто распространяет и непонятно кто составляет; - и теперь хозяину сайта, который об этом всём ни сном ни духом, нужно где-то и как-то искать кто, когда и как занёс его сайт в этот чёртов чёрный список, чтобы оттуда удалиться; - но самое главное - хоть тебя и убрали из списка, но история о том что твой сайт был в блокировке так и останется - и это при том, что блокировка была из-за ЛОЖНОГО срабатывания!!! Я понимаю что борьба с вирусами, фишинговыми сайтами и прочее и прочее. Но это уже маразм какой-то. Если пользователь дебил, то можно сколько угодно защищать его от подобных сайтов - он всё равно туда залезет. Зато страдают все остальные. И, вообще, благими делами вымощена дорога известно куда. На данный момент Интернет уничтожают не столько вирусы и фишинговые сайты, сколько антивирусные компании блокирующие всё подряд. Люди, что с вами не так?! |
Siberian GRemlin, | ||
| Sep 12 2015, 11:56 | Полезные ссылки | Siberian GRemlin, | |||
| Aug 14 2015, 08:50 | Баги сайта и форума | Сегодня от хостера пришло автоматическое уведомление: QUOTE User has used 102% of his/her allocated disk space. Зашёл на FTP и посчитал размер всех файлов (там ещё какие-то автоматически генерируемые логи были - где-то на 50 Мб - всё потёр) - получилось 177 Мб. Но в веб-админке показывает, что использовано 307.7 Мб из 300 Мб.Думаю, что за фигня - залез в настройки посмотреть подробнее - ах ты ж долбанный ты нафиг! Там размер БД больше 100 Мб! Что-то думаю, много. Сделал "OPTIMIZE TABLE" для всех таблиц (сайта и форума) - как-то сильно не помогло. Сделал SQL-запрос "SHOW TABLE STATUS" и поглядел что не так. С БД сайта всё было ок, а вот на форуме оказалась просто адски жирная таблица "ibf_spider_logs" - она одна аж 90 Мб с чем-то жрала. Полез в настройки форума и отключил эту хрень (Search Engine Spiders -> Log all spider visits? -> No), чтобы больше туда ничего не добавлялось. Затем очистил таблицу: TRUNCATE TABLE ibf_spider_logs; OPTIMIZE TABLE ibf_spider_logs; Поглядел ещё раз статистику и сделал тоже самое с таблицей "ibf_task_logs" (правда, где отключается запись туда не нашёл - да и ладно, она не очень большая). Так вот, после этого обновил статистику в веб-админке - БД похудела и стала занимать около 10 Мб!!! А я раньше никак не мог понять, чего это у меня резервная копия БД форума так долго делается и так много занимает! |
Siberian GRemlin, | ||
| Jul 28 2015, 08:06 | Doom 3. BFG Edition [.IDWAV] | Глянул - короче, там сплошной головняк. Формат у .idwav / .idxma примерно такой: CODE uint32 magic; // const uint32 SOUND_MAGIC_IDMSA = 0x6D7A7274 int64 timestamp; // 8 bytes (ID_TIME_T) bool loaded; // 1 byte int playBegin; // 4 bytes int playLength; // 4 bytes idWaveFile::waveFmt_t format; // vary - see "/neo/sound/WaveFile.h" int num; // 4 bytes BYTE amplitude[num]; // num bytes int totalBufferSize; // 4 bytes int num; // 4 bytes [num] structs: int numSamples // 4 bytes int bufferSize // 4 bytes BYTE [bufferSize] // bufferSize bytes См. файлы: /neo/sound/XAudio2/XA2_SoundSample.cpp /neo/sound/XAudio2/XA2_SoundSample.h Например метод: bool idSoundSample_XAudio2::LoadGeneratedSample( const idStr &filename ) Это загрузка такого файла. Определённый интерес вызывает там idWaveFile::ReadWaveFormatDirect( format, fileIn ); которая, как я понял, читает format, который, в свою очередь, будет разного размера в зависимости от типа закодированного звука (см. комментарии в XA2_SoundSample.h). И ещё я не понял что такое amplitude и зачем оно нужно. Теоретически, т.к. здесь хранится заголовок waveFmt_t от .WAV, то можно собрать .WAV файл. Практически - как ты видишь звук побит на блоки и с тем же IMA ADPCM всё не так просто. |
Siberian GRemlin, | ||
| Apr 26 2015, 12:01 | Нужен нормальный C/C++ компилятор | Представьте себе такую программу: CODE #include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <string.h> static char strx[] = TEXT("HELLO WORLD!"); /* 3984 => 0x0F90 */ void func(void) { char buf[3984]; strcpy(buf, strx); printf("%s\n", buf); } int main(int argc, char *argv[]) { func(); return(0); } Всё компилируется и работает на отлично. А теперь если поставить вместо 3984 число 3985 или больше, то получим что-то очень странное: QUOTE C:\Temp/ccsfeaaa.o(.text+0x352):test.c: undefined reference to `_alloca' После долгих гуглений и битья головой об стол нашёл вот такое обсуждение: QUOTE Danny Smith To disable stack probing, add this switch -mno-stack-arg-probe. Randall R Schulz Man! I scanned through the GCC man page for anything that would control this action, and couldn't find anything. I don't see "-mno-stack-arg-probe" listed there at all, nor is any option that includes the word "probe." Danny Smith Yeah, no documentation to speak of. The only reason I know about it because I've been chasing the _alloca bug that Fish reported. It is still present in GCC trunk (3.4). I have submitted a simple patch that fixes, but ... time for a ping in the New Year. Вдумайтесь в это - в документации к GCC нет ни слова об этом ключе, а единственный человек, который о нём знает, узнал о его существовании исправляя баг в компиляторе. Словами не передать как я фрустрирую! |
Siberian GRemlin, | ||
| Apr 2 2015, 11:31 | Delphi, Asm, C, WinAPI, PHP, ... | Конкретизируй задачу (опиши коротко и понятно на каком-нибудь похожем примере). Потому что если тебе просто нужно сравнить свои значения с теми что там, то всю БД в память загружать и не нужно - прочитал одну строку, распарсил, нашёл нужные занчения, сравнил, затем прочитал следующую и так далее. При таком подходе тебе нафиг грузить файл в память не упёрлось, что быстрее и проще. Я бы читал файл блоками: 1) Скажем, известна максимальная длинна строки - пусть будет 500 символов. 2) Читал бы с запасом блок в 512 символов. 3) Парсил бы его и искал конец строки. Скажем, строка бы была длинной в 302 символа. 4) На этом шаге парсил строку и вытаскивал нужные значения. 5) Здесь перемещал бы оставшийся блок в 512-302=210 символов в начало буфера, затем читал бы из файла остаток в 302 байта и переходил бы к пункту 1. Если сделать буфер кольцевой, то даже перемещать ничего не нужно - будет быстрее, но с реализацией замороченнее. К слову сказать, пункты 2-5 умеет делать буферизованный ввод/вывод Сишных функций fgets() - читает строку из файла. В Delphi можно подключить через external библиотеку msvcrt.dll и оттуда эту функцию тягать (ещё fopen() и fclose() понадобятся). Если же тебе нужно постоянно что-то там сравнивать, то проще и быстрее будет загрузить твой .CSV обратно в какую-нибудь БД и уже с БД и работать. Вот, держи, можешь замерить скорость - по идее, должно быть быстро. Учти только, что fgets() возвращает строку с символом перевода на конце (если это не последняя строка в файле) и строки там ASCIIZ (с нулём на конце). CODE program functest; {$APPTYPE CONSOLE} function fopen(filename: pchar; filemode: pchar): pointer; cdecl; external 'msvcrt.dll'; function fgets(s: pchar; n: integer; fptr: pointer): pchar; cdecl; external 'msvcrt.dll'; function fclose(fptr: pointer): integer; cdecl; external 'msvcrt.dll'; var f: pointer; s: array[0..1023] of char; begin // open for (r)ead as (t)ext file = rt f:=fopen('functest.dpr', 'rt'); // file open ok if (f <> nil) then begin // first line fgets(s, 1024, f); writeln(s); // second line fgets(s, 1024, f); writeln(s); // close file fclose(f); end; end. |
Siberian GRemlin, | ||
| Jan 4 2015, 20:40 | Сотовые телефоны: ни сот, ни мёда | Пришёл знакомый человек, озадаченно разглядывая свой телефон - говорит, что дата после Нового Года сбросилась на 1 января 1997. Телефон модели Samsung SGH-X160 (фото тут). Модель эта была анонсирована и вышла в 2006 году. Меняю там дату - ставлю 01/01/2015 - телефон говорит неверный формат. Офигеть. На официальном сайте (ссылка выше) написано: QUOTE Вопрос: У меня модель sgh-x160, работает хорошо с 2008 года, менять его не хочу. К сожалению календарь в телефоне только до конца 2014 года. Как его можно продлить? Ну, это просто охренеть, скажу я вам!Ответ: К сожалению, продление календаря не предусмотрено. Поставил человеку 2009 год в телефоне - там, вроде бы, календарь с 2015 совпадает. А так-то, конечно, свинство полное. Погуглил ещё и нашёл вот такое: QUOTE интересно, телефон, я так понимаю года 2006-2008? Т.е. по сути ему не так много. В инструкции же не сказано, что он сможет работать только до 2015 года? (да и на каком основании?) - может стоит с юристами поговорить, ты же вещь, грубо говоря, не на семь лет покупал, а тут обман производителя. Вот бы кто-нибудь сделал хорошее дело и подал на них в суд, заставив не моральную компенсацию выплачивать, а исправлять прошивку.Интересно, в моём телефоне тоже такое "ограничение" стоит?.. |
Siberian GRemlin, | ||
| Nov 29 2014, 14:51 | Delphi, Asm, C, WinAPI, PHP, ... | Немного интересной и полезной информации по .BAT файлам. 1) Недавно перечитывая справку по .BAT файлам в Windows, натолкнулся на такую штуку: CODE @echo off if _%1 == _ goto quit program.exe %1 :quit Оказывается в Windows (в 98-ой не проверял, но в XP точно есть) можно сделать проще (справка по "goto /?"): QUOTE Изменение команды GOTO при включении расширенной обработки команд: Таким образом, скрипт можно сократить:Команда GOTO принимает в качестве метки перехода строку :EOF, которая вызывае передачу управления в конец текущего пакетного файла. Это позволяет легко выйти из пакетного файла без определения каких-либо меток. Команда CALL /? выводит описание расширенных возможностей команды CALL, делающих эту функцию особенно полезной. CODE @echo off if _%1 == _ goto :EOF program.exe %1 Для тех, кто не в курсе - если вместо "goto <конец_файла>" делать exit, то это прекращает выполнение вообще. К примеру, если из одного .BAT файла через call вызвали другой, то при exit произойдёт выход из обоих файлов, а не возврат в верхний. 2) А ещё команду call можно вызывать с метками и параметрами - см. справку по "call /?". 3) Но и это ещё не всё. Перечитывая FAQ к DOS Navigator 1.51 (C:\DN\DOC\DN-FAQ25.TXT) я нашёл там такое: QUOTE Q > Зачем в DN.HGL сделано 'comentstring ::' в .BAT-файлах". A > Потому, что набоp '::' в начале стpоки аналогичен REM, более того, это даже более гpамотно, так как REM все же команда DOS и вся стpока пеpедается командному пpоцессоpу на обpаботку, а ':' это не команда, а метка (что, видимо, и так все знают), а вот если после ':' стоит символ, котоpый не может быть частью названия метки (точнее метка, котоpой нет), то DOS пpосто пpопускает эту стpоку, т.е. получается тот же комментаpий, только экономится запуск целой команды. Для командных файлов с многими REM'ами можно добиться некотоpого ускоpения запуска. А '::' - уже установившийся de-facto стандаpт, кpоме того так пpоще набиpать и так гоpаздо кpасивее. Не знаю, насколько эта фича документированна, но такая штука: CODE @echo off Вполне себе работает.rem комментарий :: это тоже комментарий echo тест P.S. Годная, хотя и старая, книжка Стивен Симрин. Библия MS-DOS (версии 3.30), особенно там интересны всякие описания по физическому устройству дисков и файловой системы. Чего я про неё пишу - там описывается, что до MS-DOS 3.30 не было команды call и прямой вызов одного .BAT файла из другого приводил к невозможности возврата, поэтому приходилось выкручиваться. |
Siberian GRemlin, | ||
| Nov 26 2014, 18:25 | Прогресс и программы | Как вы, наверное, все знаете Microsoft бросила Windows XP, а за ней уже и все остальные подтянулись, ломая зачастую даже хорошие вещи в угоду "моде". Ведь нормально написанная программа без проблем работает с ядром системы напрямую (KERNEL / USER / GDI и прочие DLL), без всяких "MSVCR90.DLL" и прочего ГМО призванного подтирать сопли рукожопым дебилам немогущим нормальный код. В связи с этим создаю эту тему, где буду сообщать о программах, которые были ничего, но превратились в кучу компоста. Во-первых, срочно - обновилась Miranda IM до версии v0.10.25: QUOTE Enhancements: Обратите внимание: если раньше Miranda IM работала через "MSVCRT.DLL", который есть много где (хотя и не везде), то теперь через "MSVCR90.DLL", который нужно качать и ставить (redistributable package). Хотя я использую Unicode под Windows XP, но у меня большие сомнения, что их ANSI-версия теперь будет работать под Windows 98.- Switch to newer compiler which requires an included redistributable package Так что бегом качать Miranda IM v0.10.24 из репозитория, пока её оттуда ещё не удалили. Во-вторых, пара слов о PHP: 1) Последний кошерный PHP собранный под VC6 - это 5.3.5 (тут остался) - работает не в пример шустрее собранных под VC9, а также меньше занимает. 2) Сам PHP 5.3.x уже бросили летом. 3) Как видно из ссылки выше PHP 5.4.x бросят в следующем году. 4) А PHP 5.5.x и выше уже не поддерживает Windows XP и Windows 2003 (минимум нужен Vista)! В общем, делайте запасы. |
Siberian GRemlin, | ||
| Nov 2 2014, 14:02 | Command & Conquer: Red Alert [Hidden Easter Egg] | Товарищ Siberian GRemlin! Во-первых, поздравляю с очередным релизом, во-вторых, замечания принимаются? Решил поставить перевод на свою версию C&C:RA (какой-то рип, с какого-то сборника - очень давно у меня на винте лежит, так что не смогу вспомнить где взял). Что меня в твоём переводе удивило: 1) Путь установки был предложен как... "C:\Program Files\Far". Эээ... так и должно быть? 2) Если воспользоваться переключателями снизу, то путь меняется на "C:\WESTWOOD\REDALERT" - у меня игра и не там стоит, ну да ладно (подозреваю, что ты пытаешься настройки из реестра прочитать, а у меня рип, который ничего туда не писал... но Far-то откуда?). 3) Далее перевод отказывался установиться, ибо у меня чего-то нехватало, хотя окно требовало с меня версию 3.03 (она у меня и так стоит) или 3.05. Потом до меня дошло - переименовал RA95.EXE обратно в RA95.DAT и твой перевод встал. Можно ли как-то (пожелание) сделать сообщение об ошибке более информативным, чтобы пользователь знал на каком файле программа стопорится или что ей не нравится? Я, конечно, понимаю, что человек нормально поставивший игру и обновление на неё такой ошибки не получит, но на всякий случай решил о такой вещи упомянуть. 4) В результате обновились файлы RA95.DAT (EXE) и WOLAPI.MIX. Других изменений не заметил. Загрузил одну из своих старых игр (года два или три назад играл последний раз), но при вызове "Меню" -> "Инструкции" задание миссии всё ещё на английском. Это так и должно быть или задание сохраняется в файл вместе с сохранённой игрой, поэтому и осталось непереведённым? Если так, то, может, стоит об этом где-нибудь упомянуть при установке перевода, а то вводит в заблуждение. Вроде бы всё. |
Siberian GRemlin, | ||
| Oct 25 2014, 18:18 | Command & Conquer: Red Alert [Hidden Easter Egg] | Короче, рассказываю: 1) Открываешь свой файл через HIEW. 2) Встаёшь на первую букву любого сообщения. 3) Переходишь в ASM-режим (F4 - Decode или два раза Enter). 4) Жмёшь F6. 5) Всё. 6) Если, вдруг, строчка используется в нескольких местах, то после того как нашлось первое сразу же жмёшь CTRL+F6 и так пока все ссылки не будут найдены. И, кстати, поиск массива указателей тебе не поможет, потому что там не массив. (*улыбается*) |
Siberian GRemlin, | ||
| Sep 23 2014, 17:35 | Delphi, Asm, C, WinAPI, PHP, ... | Можно одним вызовом со специальным параметром разрешить для всех потоков процесса: QUOTE Did you get that? If any thread in the process calls CoInitialize[Ex] with the COINIT_MULTITHREADED flag, then that not only initializes the current thread as a member of the multi-threaded apartment, but it also says, "Any thread which has never called CoInitialize[Ex] is also part of the multi-threaded apartment." © Why does CoCreateInstance work even though my thread never called CoInitialize? The curse of the implicit MTAИ ещё пара полезных ссылок о подводных камнях: для C++ и для Delphi. |
Siberian GRemlin, | ||
| Sep 14 2014, 17:21 | Сотовые телефоны: ни сот, ни мёда | Microsoft - КОРПОРАЦИЯ ЗЛА! Знакомому подарили смартфон с Windows 8 (Nokia Lumia). Тот захотел поставить туда свои мелодии на звонки - попросил помочь. Уже существующий там каталог "Ringtones" и всё что в нём лежит телефон не видит. Погуглил - чтобы добавить музыку в коллекцию рингтонов нужна специальная программа (трындец!). Чтобы поставить программу (любую!), нужен аккаунт в Microsoft Live. Чтобы получить аккаунт в Microsoft Live нужно иметь ящик на @Hotmail.com или @Outlook.com. В этом месте мне захотелось очень сильно ВЗЯТЬ@УШАТАТЬ того, кто разрабатывал этот сраный сраньфон. На кой хрен чтобы поставить БЕСПЛАТНУЮ программу мне ОБЯЗАТЕЛЬНО нужно иметь сраную учётную запись в Microsoft? У меня, блин, сотовый телефон удобнее, чем этот кусок не буду говорить чего. |
Siberian GRemlin, | ||
| Aug 17 2014, 06:33 | MicroOLAP TCPDUMP for Windows | Нашёл ещё одну похожую тулзу: RawCap (подробнее). Бесплатная, драйверов не ставит. Но есть несколько жирных минусов: 1) Нужен сраный .NET Framework 2.0. 2) Полноценно работает только под Windows XP. 3) Пишет лог в формате PCAP, так что и смотреть придётся специальной программой (на том же сайте есть одна такая - CapLoader - правда триальная). |
useretail, | ||
| Jun 26 2014, 14:00 | Нужен нормальный C/C++ компилятор | Как вы, наверное, помните, я пишу сишные программы на: QUOTE gcc.exe (GCC) 3.2 (mingw special 20020817-1) Это тот GCC, который из DEV-CPP. Писал тут одну программу DOS/Windows совместимую. Всё было нормально, пока не проверил программу под DOS в Borland Turbo C++ 3.0. Поменял кое-чего, сохранил и... она перестала копилироваться под Windows. Получаю какую-то странную ошибку: QUOTE C:\Temp/ccmYeaaa.o(.eh_frame+0x11):TESTFILE.C: undefined reference to `__gxx_personality_v0' Погуглил - говорят, надо какими-то ключами из командной строки что-то отключать. Но у меня же всё работало! Начинаю по одной строчке и блоками возвращать программу из резервной копии, которая комилировалась. Возвращал, возвращал... всё вернул! Обе программы идентичны, даже через "fc /b old_file.c TESTFILE.C" проверил - нет различий! Что за черт?! Осталось только имя поменять - сменил, всё заработало! Итого: если файл имеет расширение "*.C" (C - заглавная!) и компилируется через "GCC.EXE", то включается какой-то зело параноидальный режим, в котором нельзя вызывать функции отсутствующие в стандарте ANSI C89. В частности у меня вызывалась функция GetLastError() из WinAPI. При этом отсутствие или наличие ключа "-ansi" ни на что не влияет. |
Siberian GRemlin, | ||
| Jun 2 2014, 17:38 | Command & Conquer: Red Alert [Hidden Easter Egg] | Смотри какая штука - там есть дикая функция, которая считает хеш от строк (привет The Neverhood). У меня RA95.EXE выводит версию V3.03E - для других смещения будут другие. Собственно, сама функция: sub_4F5C0C. У ней один входной параметр - это строка (в EAX). Возвращается её хеш. В игре эта функция используется два раза для двух хешей: RA95.EXE:000F4DD0 - тут первый хеш: $D95C68A2 (параметр командной строки) RA95.EXE:00108218 - тут второй хеш: $72A47EF6 (неизвестно; может имя пользователя для сетевой игры?..) Я выдернул код подсчёта хеша и попробовал перебором подобрать - не получилось. Там реально вырвиглазный подсчёт идёт, в том числе по таблице для каждого символа ASCII. Зато хеш можно заменить. Например, для слова "boom" хеш будет $03432522. Если заменить первый хеш (D95C68A2) хешем для "boom", то запустив игру: RA95.EXE boom Будет пропущен вступительный ролик (там ещё какая-то странная серая табличка "STAND BY" промелькнёт) и сразу стартует кампания за Советов (не знаю на какой сложности). Со вторым хешем сложнее - я так и не понял, где и что он включает, но от него зависит как раз вывод тех строк-приколов и ещё где-то рядом надпись "SECRET UNITS ON" (даёт возможность производить секретные типы войск?..). Там ещё какая-то строчка выше по коду про инициализацию сети была, так что, подозреваю, что эти строки-приколы вызываются в меню мультиплеера, но у меня кнопка "Network" там не работает - выкидывает назад в главное меню. |
Siberian GRemlin, | ||
< 1 2 3 4 5 > »
| Упрощённая версия | Сейчас: 10th April 2026 - 14:52 |