Windows 7 и Microsoft DirectX SDK

Странно. Пришлось поставить семерку.

  • Скачал последний июньский MS DirectX SDK огнелисом
  • Начал ставить
  • Получил ошибку S1010
  • Погуглив увидел, что перезакачка дистрибутива вроде помогает
  • Перекачал огнелисом
  • Начал ставить
  • Получил ошибку S1010
  • Погуглив еще немного увидел, что перезакачка дистрибутива другим браузером вроде помогает
  • Перекачал оперой
  • Начал ставить
  • Получил попеременно ошибку S1010 и незакрывающееся окошко сообщение о том, что, мол, Microsoft.DirectX.AudioVideoPlayback.dll используется другим приложением
  • Решил откатиться на феральский дистрибутив
  • Скачал
  • Начал ставить
  • Снова ошибка S1010, хотя на XPSP3 ставилась без проблем
  • Безрезультатно убил 2гб трафика
  • Пришлось откатиться еще дальше, на август 2009

Решения проблемы S1010 — в инете нет, видимо мелкомягкие, что-то намудрили с инсталлером в этом году. К слову, каждый скаченный вариант отличается по контрольной сумме md5.

P.S. Устанавливать на XP и ниже не пробовал, может там все нормально, но в семерке вот такие вот грабли.

Рубрика: Система | Метки: , , | Оставить комментарий

ЖЖ — жара и жо…. задница

Сегодня видимо от жары у нас сдох сервак. После непродолжительного общения с саппортом ДЦ, уговорили их переставить винты на другой сервер, который был снят, в данный момент не использовался и не был увезен оттуда.

Получил я КВМ, покопавшись там, дал команду ifconfig. Увидел только локальный адрес 127.0.0.1.

Пытаемся поднять сетевую: ifup eth0 , а в ответ получаем:

SIOCSIFADDR: No such device eth0
eth0: ERROR while getting interface flags: No such device

пишем: ifconfig -a
в ответе видим наши девайсы, настраиваем / etc / network / interfaces
ifup eth3

и все.. мы в строю (слава яйцам)

Рубрика: Консоль *nix, Сервера | Метки: , , | Оставить комментарий

DDOS задрал

Ну вот от чего у (не)людей шило в заднице появляется? .. Денег мало?
Конкурентов убирают обычно одним из двух способов:

  • DDoS
  • черный пиар
  • еще какая-нибудь гадость

DDoS — тут все понятно, держим сервер в дауне как можно дольше, но надолго обычно денег не хватает. Некий школяр, просто находит _уже_готовые_ решения в виде исходников и скритпов, тупо находит уязвимости в системе, через которые эти самые решения можно впихнуть ничего не подозревающему юзеру, так называемый бакдор / руткит и иже с ними. С их помощью организуется сетка ботов, которая может управляться через некий канал IRC. Одна команда и вся зомбо-сетка начинает бомбить сервак паразитным трафиком. Сей человекодабр, считающий себя убер-хацкером, начинает предлагать свои услуги по устранению конкурентов.

Черный пиар — это более гадкая вещь. Распространяется заведомо ложная информация о сайте, его сервисах и других фичах. Информация обычно попадает под уголовный кодекс практически всех стран (несколько слов все могут решить совсем не в пользу жертвы… педофилия, продажа рабов и т.д.). После этого банится все что только можно, вплоть до проблем с регистратором домена.

И с тем, и с другим я встречался… со вторым реже. Так вот DDoS меня уже достал, встречается оно мне примерно раз в полгода, но все равно лень. Да можно сделать скрипт, который будет все это прекрасно контролировать, но ведь лень, собака, штука та еще.

Сегодняшний DDoS (обычный HTTP-flood) как обычно запоролся на замечательном продукте от Игоря Сысоева — nginx.

  • парсим последние 300к строчек лога нгинкса (или сколько там их есть)
  • считаем количество обращений каждого выловленного IP-адреса
  • если он встречается более, допустим, 500 раз — заносим в geo-ip список для nginx
  • делаем nginx reload
  • смотрим, что у нас сервером

Это самый быстрый способ удержать сервер в рабочем состоянии, далее уже можно банить файрволлом, как отдельные IP, так и целые подсетки, ну или извратиться так как будет удобно в каждом конкретном случае.

Конечно же этот способ имеет недостатки, и, на мой взгляд, поток паразитного трафика объемом свыше 40мбит он уже не удержит.

Рубрика: Безопасность, Консоль *nix, Сервера | Метки: , , , | Оставить комментарий

Вспоминаем Си. PCRE , pcrecpp (!)

Чуток накосячил с ним в прошлом посте, не включил в библиотеку наиполезнейшую вещь (!), а именно pcrecpp от Google Inc. В прошлый makefile компиляция и прилинковка данного «модуля» была чудовищно пропущена моими кривыми руками.
Сей замечательный кусок кода позволяет использовать библиотеку более простыми и удобными методами + ко всему там имеется функция замены / подстановки, которую писать самому с нуля лениво.

Скачать пофиксеное можно тут
Содержимое архива:

config.h
pcre.h
pcre_stringpiece.h
pcrecpp.h
pcrecpparg.h
pcre.lib
Рубрика: Программирование | Метки: , , , | Оставить комментарий

Windows XP Pro. explorer.exe, память не может быть ‘read’

Притащили мне тут комп на «лечение». При загрузке вылезает табличка с надписью, что-то вроде: Инструкция по адресу «0x00000000» обратилась к памяти по адресу «0x00000000». Память не может быть «read». «Что делать? раньше этого не было» .. обычно это сопровождается такими словами.

А все в принципе просто. В большинстве случаев некая программа пытается hook’нуть explorer.exe, нам остается только вычислить ее и изничтожить.

Вспоминаем, что мы ставили на комп , что запускали перед, тем как это началось. Это могут быть некорректно написанные приложения и вирусы.

Проверяем все возможные пункты автозагрузки — в меню старт, в реестре, смотрим сервисы.

Находим и удаляем их с концами.

Обычно это помогает, как помогло и в лечении данного конкретного случая.

Рубрика: Система | Метки: , , , | Оставить комментарий

Вспоминаем Си. Подключаем библиотеки CURL, Zlib, PCRE, OpenSSL и SQLite

Задался целью статично собрать все части в один исполняемый файл.. Зачем? .. Сам не знаю, может для того, чтобы не таскать с собой дополнительные .dll-файлы. Конечно это отрицательно сказывается на своевременном апдейте приложения, с каждой новой версией любой из частей нужно будет снова все компилить и собирать.

Zlib:
в сборке ничего сложного не оказалось, все уже включено внутри, для создания статик библиотеки в файле win32/Makefile.msc надо флаг -MD заменить на -MT , далее в консоли надо прописать:

nmake -f win32/Makefile.msc LOC="-DASMV -DASMINF" OBJA="inffas32.obj match686.obj"

как результат получаем файлик zlib.lib

OpenSSL:
Для сборки библиотеки потребуется интерпретатор PERL и компилятор NASM, после создания nt.mak, я его подправил, убрал флаги /Zi при компиляции (размер библиотек существенно уменьшился)

ms\do_nasm.bat
nmake -f ms\nt.mak

тут мы получим два файла: libeay32.lib и ssleay32.lib

CURL:
тут также все просто:

nmake -f Makefile.vc9 cfg=release-ssl-zlib \
     OPENSSL_PATH=..\..\__openssl  \
     ZLIB_PATH=..\..\__zlib \
     WINDOWS_SDK_PATH=c:\SDKv7 \
     RTLIBCFG=static

получаем: libcurl.lib

PCRE:
а с этим пришлось немного повозиться, скачиваем вот это, распаковываем в каталог с исходниками, переименовываем config.h.generic и pcre.h.generic в config.h и pcre.h, соответственно, далее:

nmake

получаем: pcre.lib

SQLite:
тут вообще никаких проблем, в своем проект подключаем прилагаемые хедеры и сырец.

итак, все сделано, для того, чтобы наш проект все это в себя включил компилим его примерно так:

cl /nologo /c /O2 /MT /D_MT /EHsc /DCRTAPI1=_cdecl /DCRTAPI2=_cdecl /DWIN32
   /D_WIN32 /D_WINNT /D_WIN32_WINNT=0x0500 sqlite3.c

cl /nologo /c /O2 /MT /D_MT /EHsc /DCRTAPI1=_cdecl /DCRTAPI2=_cdecl /DWIN32
   /D_WIN32 /D_WINNT /D_WIN32_WINNT=0x0500 /DHAVE_ZLIB_H /DHAVE_ZLIB
   /DHAVE_LIBZ /DUSE_SSLEAY /DCURL_STATICLIB /DPCRE_STATIC наш_сырец.cpp

link /nologo /release /subsystem:console /manifest:no наш_сырец.obj
     sqlite3.obj advapi32.Lib ws2_32.lib wldap32.lib kernel32.lib user32.lib
     gdi32.lib zlib.lib ssleay32.lib libeay32.lib pcre.lib libcurl.lib

Ну и напоследок, кому лень все это делать — можете взять здесь
Содержит:

zlib-1.2.5
openssl-1.0.0a
libpcre-8.10
libcurl-7.21.0
Рубрика: Программирование | Метки: , , , , , , | Оставить комментарий

+++ Nuclear Launch Detected +++

Уже 17 часов (а может и больше, смотря по какому времени считать) идет продажа ключей и коробок одной из самый культовых игр в истории Starcraft II. Blizzard как всегда рулИт. Сколько игр они не выпускали, каждая из них была хитом / бестселлером того времени. Самые известные марки Warcraft, Diablo, Starcraft.

Обновление World of Warcraft: Cataclysm ожидается игроками уже в сентябре-октябре этого года, в настоящее время вовсю идет бета-тестирование с участием избранных :).

Diablo III официально ожидается лишь в следующем году.

Blizzard, Diablo, Warcraft, Starcraft — зарегистрированные торговые марки компании Activision Blizzard Entertainment.

Рубрика: Новости | Метки: | Оставить комментарий

Вспоминаем Си. бНОПНЯ

После небольшого дауна, продолжаем вспоминать :)

Порой необходимо вывести что-то в консоль, или просто пишешь тестовую консольную версию для отладки какой-либо функции. Многие, я в это верю :) , встречались с абракадаброй на экране, пытались перекодировать выводимое сообщение, писали «собственные» функции с навороченным AI, для умной перекодировки. Но, в моем конкретном случае, решение было простое:

...
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
...
Рубрика: Программирование | Метки: , | Оставить комментарий

Креатив в глубинке

Пройдясь по городку Н., в самом лучшем, по мнению администрации (как там на самом деле не скажу, т.к. не знаю), детском садике города можно увидеть такой креатив:
Заходя через главные ворота мы видим щит, оформленный старыми игрульками:
Щит при входе
Читать далее

Рубрика: Оффлайн | 1 комментарий

Вспоминаем Си. Превращаем элемент управления в hyper-link

Оказалось нужным открытие браузера с нужным адресом при нажатии на тексте. Все довольно простенько.
Файл ресурсов:

#include <windows.h>

#define IDD_DIALOG1     1000
#define IDC_LINK_GOOGLE 1100

LANGUAGE LANG_NEUTRAL, SUBLANG_DEFAULT
IDD_DIALOG1 DIALOGEX 0, 0, 186, 27
STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_FIXEDSYS | WS_VISIBLE
      | WS_BORDER | WS_CAPTION | WS_DLGFRAME | WS_POPUP | WS_SYSMENU
CAPTION "Dialog"
FONT 8, "Ms Shell Dlg 2", 400, 0, 1
{
    DEFPUSHBUTTON   "Quit", IDOK, 129, 7, 45, 14
    LTEXT           "Click for google", IDC_LINK_GOOGLE, 25, 9, 53, 8, SS_LEFT
                    | SS_NOTIFY
}

Сырец:

#include <windows.h>

#define IDD_DIALOG1     1000
#define IDC_LINK_GOOGLE 1100

// Main window callback function
LRESULT CALLBACK DlgProc(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam) {
    switch (msg) {
        case WM_CLOSE:
            // close dialog box
            EndDialog(hwnd, 0);
            return 1L;
        case WM_COMMAND:
            switch (LOWORD(wparam)) {
                case IDOK:
                    EndDialog(hwnd, 0);
                    return 1L;
                case IDC_LINK_GOOGLE:
                    ShellExecute(hwnd,"open","http://google.ru",0,0,0);
                    return 1L;
            }
    }
    return 0L;
}

// winmain entry point
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrev,LPSTR line,int CmdShow)
{
    DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1),HWND_DESKTOP,
              reinterpret_cast(DlgProc));
}

компилим:

rc res.rc
cl -c hyperlink.cpp
link hyperlink.obj res.res user32.lib shell32.lib

Главный момент в этом сырце выделен красным цветом. Обязательно надо поставить флаг SS_NOTIFY, иначе элемент управления не будет сообщать нашей функции о клике на нем.

Все бы хорошо, но при наведении мышкой на этот самый элемент управления ничего не происходит. Как все уже привыкли, если элемент что-то должен делать, его надо подсветить / выделить / изменить над ним иконку курсора мыши и т.д.

Итак, узнаем, что за данный финт ушами у нас отвечает сообщение WM_SETCURSOR и добавляем в обработчик наш код:

...
    case WM_SETCURSOR:
        // сравниваем ID элемента с нашим
        if (GetDlgCtrlID((HWND)wparam) == IDC_LINK_GOOGLE) {
            // если это наш STATIC, то устанавливаем курсор в виде руки
            SetCursor(LoadCursor(NULL,IDC_HAND));
            return 1L;
        }
        break;
...

Компилим, запускаем и, как результат, получаем полное зеро, никаких отличий. Сиё действие замечательно работает в обычном окне, созданном при помощи CreateWindow(Ex), а вот в диалоге почему-то не прокатывает.

MSDN нам всем поможет :) Внимательно читаем про DialogProc Callback Function. Оказывается,

If the dialog box procedure processes a message that requires a specific return
value, the dialog box procedure should set the desired return value by calling
SetWindowLong(hwndDlg, DWL_MSGRESULT, lResult) immediately before returning
TRUE. Note that you must call SetWindowLong immediately before returning TRUE;
doing so earlier may result in the DWL_MSGRESULT value being overwritten by a
nested dialog box message.

Вооружившись «новым» знанием добавляем строчечку:

...
    case WM_SETCURSOR:
        // сравниваем ID элемента с нашим
        if (GetDlgCtrlID((HWND)wparam) == IDC_LINK_GOOGLE) {
            // если это наш STATIC, то устанавливаем курсор в виде руки
            SetCursor(LoadCursor(NULL,IDC_HAND));
            SetWindowLong(hwnd, DWL_MSGRESULT, TRUE);
            return 1L;
        }
        break;
...

Теперь при наведении курсора мыши на наш STATIC (да и любой другой элемент), мы можем установить любой выбранный нами курсор. Вот такая вот сказочка про гиперссылки.

Рубрика: Программирование | Метки: , | Оставить комментарий

Вспоминаем Си. Чтение и запись файла

Смешно, сам от себя такого не ожидал.

#include <windows.h>
#include <stdio.h>

#define CHUNK 1024

int copy(FILE *src, FILE *dst) {
    int           bytes;
    unsigned char buf[CHUNK];

    do {
        // копируем весь файл кусками по 1 Кбайт
        bytes = fread(buf, 1, CHUNK, src);
        fwrite(buf, 1, bytes, dst);
    } while (!feof(src));
    return 0;
}

int main() {
    FILE *in, *out;

    fopen_s(&in,  "test_in.bin", "r");
    fopen_s(&out, "test_out.bin", "w");
    copy(in, out);
    fclose(in);
    fclose(out);

    return 0;
}

Сидел, гадал, в чем проблема, оказалось — в генах :)
Вся разгадка проста, по умолчанию функция fopen() (устарела, вместо нее надо использовать fopen_s(), что и было сделано), открывается файлы в текстовом режиме. А мы копируем бинарные файлы и получаем абсолютно неверный результат. Встречая на своем пути код 0x1Ah / 26d, функция чтения fread() отмечает, что прочитан весь файл и заканчивает отдавать содержимое файла.
Так сказать diff patch выглядит так:

    fopen_s(&in,  "test_in.bin", "rb");
    fopen_s(&out, "test_out.bin", "wb");

Открывайте файлы в бинарном режиме.

Рубрика: Новости | Метки: | Оставить комментарий

Вспоминаем Си. Отключаем (не)удобства assert

Есть такая удобная штука assert называется. Данный макрос вызывает исключение, которое позволяет провести частичную диагностику результатов работы программы.

Макрос проверяет истинность выражения, и если оно ложно пишет в поток stderr само выражение, имя файла и строку исходника, в котором это случилось. После вывода информации работа приложения завершается функцией abort().

Пишем сырец:

#include <windows.h>
#include <assert.h>

int main() {
    assert(false);
    return 0;
}

компилим, запускаем и что мы видим?
В консоли:

Assertion failed: false, file tt.cpp, line 9

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.

плюс открывается окошко Error Report. Удобно? .. Мне — нет.

Почему так происходит? Начиная с Visual C++ 2005, функция abort() запускает механизм оповещения об ошибках. Почитав MSDN узнал, что отключить его можно установив флаги функцией _set_abort_behavior(). Там всего два флага:

  • _WRITE_ABORT_MSG — вкл./выкл. сообщение в консоли «This application…information.»
  • _CALL_REPORTFAULT — вкл./выкл. оповещение об ошибках

добавляем строчечку:

#include <windows.h>
#include <assert.h>

int main() {
    _set_abort_behavior(0, _CALL_REPORTFAULT|_WRITE_ABORT_MSG);
    assert(false);
    return 0;
}

компилим, запускаем… viola, никаких раздражающих окошек, в консоли только нужная нам информация.

Рубрика: Программирование | Метки: , , | Оставить комментарий