Първо прилагам и връзкате към MonPower проекта, като основна тестова постановка, съдържаща в себе си HTTP фечъра.
Имплементацията на фечъра е базирана на примера за асинхронните заявки по HTTP в Platform SDK-то, реализирано с WinInet API-то, като обаче функцията за четенето на приетите данни от респонса е разписана малко по-разбираемо и разширено, без безусловните преходи. На практика е едно готовото решение за фечване на контент по ХТТП. При мен на теория трябва да прерасне в туул за тестване на натоварване на уеб сървър. Има добавена и специфична обработка на данните(закоментирана в кода), които сървърния скрипт плюе, защото те са двоични, не текстови и се тълкуват като байтстрийм. В момента името на хоста за чекване за ъпдейтите в MonPower.exe e хардкоднато и се вижда в кода на проекта. Има Debug, Release и Еxternal Release конфигурации, като разликата в последните две е една препроцесорна дефиниция за ресурсния компилатор, който сменя стрингов ресурс с името на хоста за ъпдейт. В първата конфигурация слага вътрешното име на сървър ми, а във втория външното му IP, което не мога да ползвам зад ADSL модема.
В момента бинарито разположено на сървъра рипортва версия 1.0.2.1, въпреки че си е 1.0.2.0 на практика. Сложено е за да може да се илюстрира работата на целия механизъм. Бинари-то в проекта е 1.0.2.0.
Прилагам и тестовата ми версия на HTTP фечъра като отделен проект, откъдето е и по-лесно да се модифицира. Ето я и нея. В нея има забит статичен стринг на УРЛ-то на Интел, за да се илюстрира работата. Можете да си го смените в кода и да компилирате. Частта, свързана ексклузивно с тестването на протокола на чекъра на версията е закоментирана(големия коментар).
PHP скрипта определено беше по-предизвикателната част от механизма, първо заради нуждата от детайлно познаване на формата на PE изпълнимите файлове. Скрипта на практика обхожда поструктурно файла и вади версията. Особеностите са, че в изпълнимите файлове всички данни са big endian, т.е младшите битове са отляво. Друга особеност е алайнването на 4 байта на вътрешните ресурсни структури, като например не е упоменато никъде, че отделните String псевдо структури в StringTable са също алайнати. И последната особеност беше механизма за намиране на реалния офсет на данните в дисковия файл, тъй като структурата, указваща местоположението на Version ресурса в ресурсната директория съдържа в себе си само офсета по виртуален адрес(т.е, когато е мапнат файла от .екзе мапера на ОС-а), а това не е местоположението във файла. В работната версия на скрипта има обяснено как се пресмята отместването при зададен виртуален адрес на секция и данни. Може да се види как работи тук. Настроена е да оперира с .exe-to na Notepad-a, само за визуализация на примера, но данните са от реалния изпълним файл, който е копиран в сървъра. Може да се свали от тук и да се разгледа(съжалявам за оскъдните коментари). Работната версия е малко по-стегната и изходния резултат от работата и е по-простичкия протокол между нея и HTTP фечъра. Няма нужда да го описвам, той е видим вътре и е self-explanatory. Това е работната, актуално инсталирана версия. Тя разпакетира екзето от zip, така че е нужен PHP 5.2 с пуснато zip разширение. Има и една дефиниция вътре, за по-лесно управление, с която се спира zip частта и се търси директно дисков файл. В архива, който давам за работната версия има малка част, която се допитва до базата(Файърбърд в моя случай), за да сглоби доунлоад URL-то и да го прати на фечъра. Махнал съм всички специфични за моята машина данни, но механизма на работа и структурата на таблиците са прозрачни.