Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Клуб профессиональных программистов :: Выпуск #103


Клуб профессиональных программистов «Весельчак У»
Информационная рассылка сайта и форума.  Выпуск 103.  7 ноября 2010 г.

Здравствуйте, уважаемые читатели!

  • Новости форума и клуба.
  • Требуется помощь с рассылкой.
  • Сегодня мы предложим вам фрагмент статьи «Сопрограммы в языке программирования C». Это перевод статьи «Coroutines in C» Саймона Тэтхема. Еще в процессе подготовки статьи к публикации среди рецензентов возникло бурное обсуждение, так как оказалось, что понятие «сопрограмма» многим вообще не известно, а показанные в статье примеры на языке Си показались сомнительными с точки зрения синтаксиса (хотя не нарушают стандарта языка и успешно компилируются). Поэтому автор перевода решил написать серию разъясняющих статьей, которые выйдут на нашем сайте в ближайшие недели, а мы сообщим вам об этом в данной рассылке. В будущих статьях будет тот же уклон в область программирования встраиваемых систем.
  • Также традиционно предлагаем вам подборку интересных тем форума за прошедшую неделю. Орфография оригинальных сообщений созранена.

Приятного чтения!




Новости.

У нас на форуме создан новый раздел, посвященный языку Python. Всех любителей этого языка, а также тех, кто только начинает его изучать, приглашаем посетить новый раздел и обсудить волнующие вас вопросы по Python. Например, вот тема для новичков в этом языке.




Уже недалек день рождения нашего клуба. В этом году он случится 10 декабря.

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




Еще раз напоминаем: на нашем форуме можно (и нужно!) обсуждать публикуемые у нас статьи. Ссылку на обсуждение можно увидеть в конце каждой статьи на нашем сайте, либо найти по названию статьи тему на нашем форуме в этом разделе. Обсуждение статей приветствуется. Поверьте, авторам очень важно знать ваше мнение (конечно, если оно осмысленное) — они ведь пишут статьи и делают переводы не за деньги, а энтузиазм надо поощрять вниманием читателя. Темы обсуждений свободно доступны для чтения, а для обсуждения необходима регистрация.

Требуется помощь!

Нам нужна ваша помощь!

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

Предисловие переводчика


Концепция сопрограмм хорошо известна уже не один десяток лет. В частности, те, кто фундаментально изучал основы информатики, могли познакомиться с ней по ставшей классикой монографии Кнута (см. ссылки в конце статьи). Сопрограммы весьма полезны для структурирования алгоритмов, в которых данные подвергаются последовательной обработке несколькими слабо связанными модулями.

К сожалению, на практике воспользоваться преимуществами сопрограмм проблематично, поскольку традиционные языки программирования высокого уровня не обеспечивают поддержки этой концепции (причина объясняется в данной статье). Те, кто все же желает иметь такую возможность, вынуждены самостоятельно искать способ ее реализации. Например, мне доводилось писать на ассемблере модули для компилятора Pascal-2 от Oregon Software (для PDP-11), которые производили соответствующие манипуляции со стеком, подменяя адрес возврата из подпрограммы. Но подобные решения сильно привязаны к конкретным архитектурам ЭВМ и компиляторам и больше напоминают хакерские заплатки, нежели промышленное программирование.

Автору статьи, известному программисту Саймону Тэтхему, удалось найти гораздо более удачное решение, не выходящее за рамки ANSI C и по этой причине обладающее превосходной мобильностью на разные компиляторы и платформы. Причем это решение не сводится лишь к теоретическим выкладкам; оно чрезвычайно практично — автор разработал набор макросов C, собранных воедино в заголовочном файле. Читателю остается лишь скачать их и применять в своих разработках.

Надеюсь, данный перевод сделает статью доступнее для тех программистов, кто хотел бы освоить элегантный механизм сопрограмм, но испытывает трудности с чтением на языке оригинала.




Введение


Структурирование больших программ — непростая задача. Одна из наиболее трудных проблем такова: если у вас один фрагмент производит данные, а другой фрагмент их потребляет, какой из них должен быть вызывающим, а какой — вызываемым?

Ниже приведен очень простой фрагмент кода, производящий групповую декомпрессию, и столь же простой фрагмент кода парсера:


Код:
    /* Код декомпрессии */
    while (1) {
        c = getchar();
        if (c == EOF)
            break;
        if (c == 0xFF) {
            len = getchar();
            c = getchar();
            while (len--)
                emit(c);
        } else
            emit(c);
    }
    emit(EOF);

Код:
    /* Код парсера */
    while (1) {
        c = getchar();
        if (c == EOF)
            break;
        if (isalpha(c)) {
            do {
                add_to_token(c);
                c = getchar();
            } while (isalpha(c));
            got_token(WORD);
        }
        add_to_token(c);
        got_token(PUNCT);
    }

Каждый из этих фрагментов кода весьма прост и легок для понимания. Один производит литеры по одной вызовом emit(); другой потребляет литеры по одной вызовом getchar(). Если для взаимного обмена данными использовать только вызовы emit() и getchar(), легко соединить эти два фрагмента вместе таким образом, чтобы выход декомпрессора отправлялся прямо на вход парсера.

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

В данной статье я предлагаю креативное решение проблем со структурами подобного рода.

...


Полностью статью можно прочесть на нашем сайте, в разделе «Инструменты и технологии проектирования ПО::Переводы».

  • Программирование :: Общий
  • Всем привет!
    Задача следующая.
    Нужно найти и распознать (на изображении) штрих код code 39. Начитался про нейросети? сейчас каша в голове.
    Что можете посоветовать, какая НС лучше подходит под данный тип задачи?
    Либо НС тут будет излишней?
    Спасибо заранее!
  • Программирование :: .NET технология от и до
  • Добрый день.

    Первые эксперименты в Сшарпе.

    Вроде из темы вопрос ясен - КАК организовать Синхронный просмотр двух Listboxes?

    Хотя для меня будет более важным и полезным, если кто-нибуть покажет мне путь "КАК получить ответ на этот вопрос?"
    Как и где искать.
    Как использовать среду (VS 2010).
    По каким иерарниям ползать и куда смотреть.

    Буду очень благодарен.
  • Добрый день.
    Возникла проблема с хостингом WCF сервиса на рабочем сервере. До этого хостил на локальной машине (IIS 5) - работало все нормально. Сейчас перенес на рабочий сервер с IIS 6. Пул приложений поставил Default, ASP.NET version - 4.0 (пробовал и 2.0*)

    При запросе сервиса http://citytrench.citynet.kharkov.ua/ResourceInfo.svc?wsdl возникает ошибка 500
    Цитировать
    Server Application Unavailable
    The web application you are attempting to access on this web server is currently unavailable.  Please hit the "Refresh" button in your web browser to retry your request.
    Administrator Note: An error message detailing the cause of this specific request failure can be found in the application event log of the web server. Please review this log entry to discover what caused this error to occur.

    Причем, по ссылке http://citytrench.citynet.kharkov.ua заходит - могу просмотреть файлы директории. В чем может быть проблема?

    Код:
    <%@ ServiceHost Language="C#" Debug="true" Service="ResourceService.ResourceInfo" CodeBehind="ResourceInfo.svc.cs" %>
  • Программирование :: С/С++ :: WinAPI & Visual C++
  • Прошу помощи.... есть созданный класс работы со строкой:
    "MyString.h"

    Код:
    class MyString
    {
     
    public:
        MyString(const char*);
        MyString(int);
        ~MyString();
     
    public:
        void Clear();
     
        char* MString;
        int length;
        char& operator[] (int i) {return MString[i];}
        friend MyString& operator + (MyString&, MyString&);
    };
     

    Хочу использовать объект этого класса в "ethernet.h", то есть:
    Код:
    class Ethernet
    {
    public:
        Ethernet();
        ~Ethernet();
     
        int Connect();
        int Disconnect();
     
        int SetIP(IP_st &newIP);
        int GetIP(IP_st &curIP);
        bool IsConnected()
           
    private:
        SOCKET eth_socket;
        IP_st ip;
        bool on_connected;
        sockaddr_in eth_addr;               
        int socket_error;                   
        int shift;
     
        MyString buffer(2000);
        MyString out_buffer(2000);
        MyString log_buffer(1000);
        MyString sendlog_buffer(1000);
       
        HANDLE socket_handle;               
     
    };

    Выдает ошибку: 'MyString' : 'class' type redefinition

    Если я понимаю правильно, то в заголовочный файл нужно вводить нечто подобное:
    #ifndef MYSTRING_H
    #define MYSTRING_H

    А вот как это правильно сделать? .....   :dontknow:
  • Дамы и господа,

    Есть ли какой-нибудь законный (или не очень законный) способ узнать, что виртуальная функция с определённой сигнатурой будет расположена в таблице виртуальных функций под таким-то номером?

    Речь не о том, чтобы вызвать функцию, а именно в том, чтобы узнать номер.
  • Программирование :: С/С++ :: WinAPI & Visual C++ :: DirectX
  • Плз помогите не может запуститься прога кидаю код
    Код:
    //Создание шрифта и вывод текста на экран в Direct3D
    #include <windows.h>//подключаем заголовочный файл Windows
    #include <d3d9.h>//подключаем заголовочный файл DirectX SDK 9
    #include <d3dx9.h>//заголовочный файл с матричными функциями
    #include <d3dx9core.h>//подключаем файл для работы со шрифтами
    #include "TCHAR.h"

    //=============================================================================
    //глобальные переменные
    //=============================================================================
    LPDIRECT3D9 pDirect3D   = NULL;//указатель на главный интерфейс Direct3D9
    LPDIRECT3DDEVICE9 pDirect3DDevice = NULL;//указатель на интерфейс устройства Direct3D9

    LPDIRECT3DVERTEXBUFFER9 pVertexBuffer = NULL; //глобальная переменная-указатель на буфер вершин
    LPDIRECT3DINDEXBUFFER9 pIndexBuffer = NULL; //указатель на буфер индексов вершин

    LPD3DXFONT pFont = NULL;//указатель на интефейс, отвечающий за работу со шрифтом
    RECT Rect;//переменная, которая будет задавать область вывода на экран
    HFONT hFont;//переменная, в которой находится сам шрифт

    //=============================================================================
    //структуры
    //=============================================================================
    struct CUSTOMVERTEX //структура вершины
    {
    FLOAT x, y, z;//координаты
    FLOAT nx, ny, nz;//нормали
    };
    #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_NORMAL)//описываем свой формат D3DFVF_CUSTOMVERTEX содержания вершин в отдельном потоке данных

    //=============================================================================
    //функции
    //=============================================================================
    //инициализация Direct3D9
    HRESULT InitialDirect3D(HWND hWnd)
    {
    if (NULL == (pDirect3D = Direct3DCreate9(D3D_SDK_VERSION)))//создаём объект главного интерфейса Direct3D9
    return E_FAIL;
    D3DDISPLAYMODE Display;//режим дисплея
    if (FAILED(pDirect3D -> GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &Display)))//получаем текущий формат дисплея
    return E_FAIL;

    D3DPRESENT_PARAMETERS Direct3DParameter;//объект параметров представления
    ZeroMemory(&Direct3DParameter, sizeof(Direct3DParameter));
    Direct3DParameter.Windowed = FALSE;//оконный или полноэкранный режим
    Direct3DParameter.SwapEffect = D3DSWAPEFFECT_DISCARD;//параметр для определения обмена буферов
    Direct3DParameter.BackBufferFormat = Display.Format;//формат поверхности заднего буфера
    Direct3DParameter.EnableAutoDepthStencil = TRUE;//включаем z-буфер
    Direct3DParameter.AutoDepthStencilFormat = D3DFMT_D16;//формат поверхности z-буфера
    Direct3DParameter.BackBufferWidth = GetSystemMetrics(SM_CXSCREEN);//устанавливаем ширину заднего буфера равную ширине нашего экрана
    Direct3DParameter.BackBufferHeight = GetSystemMetrics(SM_CYSCREEN);//устанавливаем высоту заднего буфера равную высоте нашего экрана
    Direct3DParameter.BackBufferCount = 3;//устанавливаем количество буферов
    Direct3DParameter.FullScreen_RefreshRateInHz = Display.RefreshRate;//устанавливаем частоту обновления экрана для полноэкранного режима

    //создание объекта для интерфейса устройства
    if (FAILED(pDirect3D -> CreateDevice(D3DADAPTER_DEFAULT, //видеокарта
    D3DDEVTYPE_HAL, //тип устройства (использовать ли акселерацию видеокарты)
    hWnd, //дескриптор главного окна
    D3DCREATE_SOFTWARE_VERTEXPROCESSING, //как будет происходить обработка вершин
    &Direct3DParameter, //параметры пердставления
    &pDirect3DDevice))) //указатель на интерфейс IDirect3DDevice9
    return E_FAIL;
    pDirect3DDevice -> SetRenderState(D3DRS_CULLMODE, D3DCULL_CW);//включаем отсечение по часовой стрелке
    pDirect3DDevice -> SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE);//включаем z-буфер
    return S_OK;
    }



    void MyTextOut(long x1, long y1, long x2, long  y2)
    {
    D3DCOLOR FontColor = D3DCOLOR_ARGB (255,0,0,255);
       RECT pRect;            //переменная, которая будет задавать область вывода на экран
       D3DXCreateFont (pDirect3DDevice, 20, 0, FW_BOLD, 0, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, TEXT ("Arial"), &pFont);
       // координаты прямоугольнка
       pRect.left   = x1;
       pRect.top    = y1;
       pRect.right  = x2;
       pRect.bottom = y2;
       // Вывод текста
       pFont->DrawText(NULL, _T("Hello World"), -1, &pRect, 0, FontColor);
    }

    //рендеринг
    VOID RenderingDirect3D()
    {
    if (pDirect3DDevice == NULL) //проверяем было ли создано устройство без ошибок
    return;
    //очистка заднего буфера
    pDirect3DDevice -> Clear(0, //номер массива прямоугольников, подвергаюзихся очистке (0 - для очистки всех прямоугольников)
    NULL, //адрес массива прямоугольников
    D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, //флаги, какие из поверхностей нужно очищать
    D3DCOLOR_XRGB(172, 221, 101),//обычный цвет для очистки
    1.0f, //значение z-буфера
    0); //значение буфера трафарета
    //**************************************************************************************************
    pDirect3DDevice -> BeginScene(); //начало сцены


    //вывод текста на экран
    int ix=0;
        MyTextOut( 10, 10, 400, 400);
        pDirect3DDevice -> EndScene(); //конец сцены
    //**************************************************************************************************
    //вывод на экран отрисованного из заднего буфера на передний
    pDirect3DDevice -> Present(NULL, //указатель на структуру RECT исходной поверхности
       NULL, //указатель на структуру RECT поверхности адресата
       NULL, //указатель на окно адресата, чья клиентская часть взята, как адрес для этого параметра представления
       NULL); //не используется, оставлен для совместимости
    }

    //освобождение захваченных ресурсов
    VOID DeleteDirect3D()
    {
    if (pFont != NULL)
    pFont -> Release();
    if (pDirect3DDevice != NULL)
    pDirect3DDevice -> Release();
    if (pDirect3D != NULL)
    pDirect3D -> Release();
    }


    //обработка сообщений, посылаемых окну
    LRESULT CALLBACK MainWinProc(HWND hWnd,//дескриптор окна
    UINT msg,//идентификатор сообщения
    WPARAM wParam,//дополнительная информация
    LPARAM lParam)//дополнительная информация
    {
    switch(msg)
    {
    case WM_KEYDOWN://обработка нажатий клавиш
    {
    if (wParam == VK_ESCAPE)//если нажали Esc
    PostQuitMessage(0);//то закрываем приложение
    return 0;
    }
    case WM_PAINT:
    RenderingDirect3D(); //выполняем рендеринг всей сцены
    ValidateRect(hWnd, NULL); //прорисовка всей клиентской части окна
    break;
    case WM_DESTROY:
    {
    DeleteDirect3D(); //освобождаем ресурсы
    PostQuitMessage(0);
    return 0;
    } break;
    }
    return (DefWindowProc(hWnd, msg, wParam, lParam));
    }

    //=============================================================================
    //главная функция
    //=============================================================================
    //входная точка приложения
    INT WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, INT nCmdShow)
    {
    HWND hWnd;//дескриптор окна
    WNDCLASSEX WindowsClass;//класс окна
    MSG msg; //сообщение

    WindowsClass.cbSize = sizeof(WNDCLASSEX);//размер создаваемой структуры
    WindowsClass.style="CS_VREDRAW|CS_HREDRAW|CS_OWNDC|CS_DBLCLKS;//стили"
    WindowsClass.lpfnWndProc = MainWinProc;//указатель на функцию обратного вызова
    WindowsClass.cbClsExtra = 0;//дополнительная информация (в DirectX не используется)
    WindowsClass.cbWndExtra = 0;//дополнительная информация (в DirectX не используется)
    WindowsClass.hInstance = hInstance;//ссылка на окно
    WindowsClass.hIcon = LoadIcon(NULL,IDI_APPLICATION);//иконка приложения (пиктограмма)
    WindowsClass.hCursor = LoadCursor(NULL,IDC_ARROW);//курсор
    WindowsClass.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);//цвет фона окна
    WindowsClass.lpszMenuName = NULL; //указатель на меню окна
    WindowsClass.lpszClassName = _T("WINDOWSCLASS");//название класса окна для создаваемого приложения
    WindowsClass.hIconSm = LoadIcon(NULL,IDI_APPLICATION);//маленькая пиктограмма на панели задач

    if (!RegisterClassEx(&WindowsClass))//регистрируем класс окна
    return 0;

    //создаём окно
    if (!(hWnd = CreateWindowEx(NULL,//стиль окна
    _T("WINDOWSCLASS"),//класс
    _T("Orlan DirectX Application"),//название окна
    WS_OVERLAPPEDWINDOW|WS_VISIBLE,//стиль и поведение окна
    0,0,//левый верхний угол
    1024,768,//ширина и высота
    NULL,//дескриптор родительского окна
    NULL,//дескриптор меню
    hInstance,//дескриптор родительского приложения
    NULL))) //указатель на данные окна
    return 0;

    if (SUCCEEDED(InitialDirect3D(hWnd))) //если удалось удачно инициализировать Direct3D
    {

    ShowWindow(hWnd,nCmdShow);//показываем окно
    UpdateWindow(hWnd);//обновляем окно
    ZeroMemory(&msg, sizeof(msg));
    while(msg.message != WM_QUIT)//главный обработчик событий
    {
    if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
    {
    TranslateMessage(&msg);//преобразование клавиатурного ввода
    DispatchMessage(&msg);//обработка и пересылка сообщений в WinProc
    }
    else
    RenderingDirect3D();//рендеринг
    }

    }
    return 0;
    }




    И вот ошибки, если не трудно, отпишите как правИльно
    Код:
    Ошибка 1 error LNK2019: ссылка на неразрешенный внешний символ _Direct3DCreate9@4 в функции "long __cdecl InitialDirect3D(struct HWND__ *)" (?InitialDirect3D@@YAJPAUHWND__@@@Z) C:\Documents and Settings\Grosner\Мои документы\Visual Studio 2010\Projects\text\text.obj text
    Ошибка 2 error LNK2019: ссылка на неразрешенный внешний символ _D3DXCreateFontW@48 в функции "void __cdecl MyTextOut(long,long,long,long)" (?MyTextOut@@YAXJJJJ@Z) C:\Documents and Settings\Grosner\Мои документы\Visual Studio 2010\Projects\text\text.obj text
    Ошибка 3 error LNK1120: 2 неразрешенных внешних элементов C:\Documents and Settings\Grosner\Мои документы\Visual Studio 2010\Projects\Debug\text.exe 1 1 text
  • Программирование :: Java
  • Привет.
    Не могли бы мне помочь в описании метода...как их вбивать в set, подскажите плиз....
    /**
        * Метод возвращает набор имен методов для класса, помеченных идентификатором protected
        * @param clazz - класс
        * @throws NullPointerException - если claszz является null - ом
        * @return Набор имен методов
        * */   
       public Set<String> getProtectedFieldsNames(Class clazz);
  • Программирование :: Perl
  • Приветствую всех... Собственно, вот какой вопрос. Парсию я урлы на каком-нить сайте, вот код...
    Код:
    #!/usr/bin/perl

    $| = 1;

    use LWP::UserAgent;

    $ua = LWP::UserAgent->new;
    $ua->agent('Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)');
    $ua->default_header('Referer' => "http://google.ru/");
    $ua->default_header('Accept-Encoding' => "gzip,deflate");
    $ua->default_header('Accept-Language'=> "*/*");
    $ua->default_header('Accept'=> "text/html,*/*");
    $ua->default_header('Accept-Charset' => "windows-1251,utf-8");

    $response = $ua->get('http://site.ru/');

    $text = $response->decoded_content;

    my @refs = $text =~ m/\b[^>]*?\bhref="(http:\/\/site\.ru[^"]+)"[^>]*>/gi;

    for my $ref (@refs)
    {
    open (F, ">> refs.txt");
    print (F "$ref \n");
    close (F);
    }
    В результате, на сайте я могу встретить много раз одни и те же урлы, которые все прямехонько и сохранятся в лог... Есть ли какие нибудь способы, чтобы это обойти?
    Заранее спасибо, рад любой подсказке.
  • Программирование :: Программирование 1С :: 1С 7.x
  • Приветствую постояльцев форума, нужен Ваш совет.

    Путем проб и ошибок пишу свою конфигурацию в 1Сv7.7 по учёту квартир в обычных жилых многоэтажных домах...
    Суть такова: как только сдается дом, с N количеством квартир, я беру его на учет и в конце каждого месяца начисляю на него "налог" -> [сумма налога]*N а до 10ого числа этот налог должен быть погашен - т.е. к нам идёт приход денег и сумма ложится на определенный дом.., но как только жители выкупают квартиру X, она снимается с нашего обслуживания и количество квартир уменьшается N=N-X. Счёт на налог выписывается всему дому, а не каждой квартире - здесь количество квартир влияет лишь на сумму налога... 

    Вот и проблемка: как организовать решение данной структуры учёта квартир...

    Подумал так, что создам справочник домов:
    Дом №1 по ул. Такой-то
    ...
    Дом №Y по ул.К

    ... и, посредством документа "Принятие нового дома", организую для него проводки приход и вычет денежных средств со счёта Дома...

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

    Премного благодарен! 
  • Программирование :: Программирование 1С :: 1С 8.x
  • Есть такая проблема, в справочнике Комната есть реквизит Статус, и нужно чтоб при проведении документа Заселение, он становился - "занят", при проведении Бронирование - "забронирован", при проведении Аннулирование брони или Выселение - "свободен". А при проведении документа Переселение один номер становился "свободен", а другой "занят".
    Как это возможно реализовать? :zombypc:
  • Помогите создать отчет...Нужно, чтобы выводились все Основные средства на определенную дату и их остаточная стоимость.....Как это можно сделать???? Очень-очень надо...(
  • Сразу говорю 1с-ку знаю плохо!

    Моя слезная история:)
    жил был один хозяин магазина, у него стояла 1с 8.1
    ну и захотелось ему сделать сервер с удаленным доступом
    вот и настроил я сервак, поднял терминал, поставил 1с
    но захотелось ему что бы стояло на этом компе БП и УТ, и что бы был настроен обмен между этими конфами
    в общем сначала обмен не шел, но после обновления баз.... дело пошло на лад.

    БП 1.6: 1.6.26.3
    УТ 10.3: 10.3.13.2

    делаю обмен через подключение к базе-приемнику, проходит обмен данными, вроде бы все как надо!
    но при последующих обменах появляются ошибки:
    Отложенные движения документов в информационной базе ПРИЕМНИКЕ:
    Подключение к информационной базе ПРИЕМНИКА: Каталог информационной базы: E:\temp\ут

    Ошибка при проведении документа "Оприходование товаров 00000000001 от 01.11.2008 9:00:00"
    Ошибка при вызове метода контекста (Записать): Операция не выполнена!
    Ошибка при проведении документа "Оприходование товаров 00000000003 от 01.11.2008 9:00:01"
    Ошибка при вызове метода контекста (Записать): Операция не выполнена!
    Ошибка при проведении документа "Оприходование товаров 00000000002 от 01.11.2008 9:00:08"
    Ошибка при вызове метода контекста (Записать): Операция не выполнена!
    Ошибка при проведении документа "Расходный кассовый ордер 00000000001 от 01.11.2008 12:00:00"
    Ошибка при вызове метода контекста (Записать): Операция не выполнена!
    Ошибка при проведении документа "Поступление товаров и услуг 00000000001 от 01.11.2008 12:00:07"
    Ошибка при вызове метода контекста (Записать): Операция не выполнена!



    Добавлено через 3 минуты и 48 секунд:
    а при любого открытии документа "запасы(склад)-Перемещение товаров" выдает:
    Не указаны параметры учетной политики налогового учета (ИП Вася Пупкин) на 30 апреля 2009 г.
  • Программирование :: Python
  • Собираюсь в этой теме писать свои впечатления о Python. Ну, и если что-то будет не понятно, то и вопросы.

    Читаю книгу "Программирование на Python 3. Подробное руководство." Марка Саммерфилда.

    Т.к. я только начал читать, то конечно картина у меня очень ущербная и тем не менее возникают вопросы "на будущее".


    1. Встроенные типы. К ним относится только int и str, или bool, float и complex тоже?

    2. Прочел о неизменности встроенных объектов. Пояснение к вопросу:

    obj.x = 1
    a = obj.x
    obj.x = 2
    # a = 1, obj.x = 2

    Хочу, чтобы и a изменялось. Т.е. иметь ссылку в понимании других языков (C++, Perl, PHP). Иначе это просто принцип copy-on-write - создание нового объекта при изменении. По сути - присваивание по значению. Хочу полноценную ссылку. Такое тут есть?

    3. Комбинирование логических операторов.

    1 <= a <= 3 # понятный аналог из SQL: a between 1 and 3

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

    4. Оператор is. Я так понял, это похоже на === в Java и PHP. Правильно?

    5. Оператор in. Очень приятная неожиданность, что он не только с коллекциями работает, но и со строками. Хорошо ли это на самом деле - покажет практика.

    6. Как я понял, в Питоне нет автоматического приведения числовых и строковых типов, как во многих скриптовых языках. Это так?
  • помогите придумать список задач (можно большой) для объёмного изучения Django (соответственно Zope), Twisted и прочих фреймворков для Python.
  • Операционные системы :: Embedded systems
  • Привет всем!
    Столкнулся с проблемой включения WiFi адаптера.
    Адаптер AR6K_SD1 в реестре:

    [HKEY_LOCAL_MACHINE\Comm\AR6K_SD1]
    Display Name=AR6000 WLAN Adapter SD
    Group=NDIS
    ImagePath=ar6k_ndis_sdio.dll
    Wireless=1

    [HKEY_LOCAL_MACHINE\Comm\AR6K_SD1\Parms]
    powerSaveMode=2
    currentPowerState=1
    BusType=0
    BusNumber=0
    BtCoexAntConfig=0
    eepromFile=NULL

    Пытался через SetDevicePower(szName, POWER_NAME, PwrDeviceUnspecified) - включение, и SetDevicePower(szName, POWER_NAME, D4) - выключение.
    Где szName={98C5250D-C29A-4985-AE5F-AFE5367E5006}\AR6K_SD1.

    Проблема в том, что при перезагрузке, когда адаптер выключен, функция включения не работает. Если включить через навигатор WiFi, то SetDevicePower начинает работать и на включение, и на выключение.

    Как я понял проблема в том, что адаптер необходимо сначала активировать.
    Проверил регистр до включения WiFi и после - разница в том, что появляется новый ключ
    [HKEY_LOCAL_MACHINE\Drivers\Active\103]
    Hnd=3582778688
    Name=DRG1:
    Key=\Drivers\SDCARD\ClientDrivers\Custom\MANF-0271-CARDID-0201-FUNC-1
    BusParent=3489963616
    InterfaceType=0
    BusName=SDBus_1_0_1
    ClientInfo=686337

    Сам ключ [HKEY_LOCAL_MACHINE\Drivers\SDCARD\ClientDrivers\Custom\MANF-0271-CARDID-0201-FUNC-1] выглядит так
    Dll=ar6k_ndis_sdio.dll
    Prefix=DRG

    В общем, тогда пробовал до вызова SetDevicePower на включение вызывать
    handle = ActivateDevice(L"\\Drivers\\SDCARD\\ClientDrivers\\Custom\\MANF-0271-CARDID-0201-FUNC-1",NULL);
    на что выдовало handle=NULL, а GetLastError()=110(ERROR_OPEN_FAILED
    )

    В общем, больше пока ничего в голову не пришло.

    Если есть идеи, пишите, буду благодарен.
  • Направления программирования :: Drivers
  • При запуске минифильтра вылетает перезагружается комп в чем проблема так и не понял.
    Если же убрать из структуры FLT_OPERATION_REGISTRATION имя процедуры фильтрации MyFiltr и поставить NULL, то все нормально, драйвер нормально загружается и выгружается, есть связь  с с ним из win app программ, но естественно нет фильтрации, пожалуйста помогите новичку.

    Код:
    //=============================================================================
    // укороченная версия
    //=============================================================================
    #include <fltKernel.h>
    #include <dontuse.h>
    #include <suppress.h>
    //#include "VERSION.h"
    #pragma prefast(disable:__WARNING_ENCODE_MEMBER_FUNCTION_POINTER,"Not valid for kernel mode drivers")
    //-----------------------------------------------------------------------------
    #define NT_FILTER_NAME      L"\\Device\\NTName"
    #define WIN32_FILTER_NAME   L"\\DosDevices\\MYDRIVER"
    #define VERSION             "1.0001"
    //-----------------------------------------------------------------------------
    DRIVER_UNLOAD UnloadDriver;   // п/п выгрузки драйвера
    DRIVER_INITIALIZE DriverEntry;// главная
    //-----------------------------------------------------------------------------
    VOID UnloadDriver(IN PDRIVER_OBJECT pDriverObject);// п/п выгрузки драйвера
    //-----------------------------------------------------------------------------
    typedef struct _DEVICE_EXTENSION { // структура расширения драйвера
                                       PDEVICE_OBJECT fdo;
                                   UNICODE_STRING Win32_Filter_Name;
                                     } DEVICE_EXTENSION, *PDEVICE_EXTENSION;
    //---------------------------
    typedef struct _NULL_FILTER_DATA{ // структура фильтра
                                      PDRIVER_OBJECT DriverObject;
                                      PFLT_FILTER FilterHandle;
                                    } NULL_FILTER_DATA, *PNULL_FILTER_DATA;
    //*************************************************************************
    NTSTATUS DriverEntry ( // главная
                           __in PDRIVER_OBJECT DriverObject,
                           __in PUNICODE_STRING RegistryPath
                         );
    NTSTATUS FilterUnload (// функция выгрузки фильтра
                           __in FLT_FILTER_UNLOAD_FLAGS Flags
                          ) ;
    NTSTATUS QueryTeardown( // функция отсоединения фильтра
                            __in PCFLT_RELATED_OBJECTS FltObjects,
                            __in FLT_INSTANCE_QUERY_TEARDOWN_FLAGS Flags
                          );
    NTSTATUS InstanceSetup ( // функция подключения локальных томов
                             __in PCFLT_RELATED_OBJECTS FltObjects,
                             __in FLT_INSTANCE_SETUP_FLAGS Flags,
                             __in DEVICE_TYPE VolumeDeviceType,
                             __in FLT_FILESYSTEM_TYPE VolumeFilesystemType
                           );                           
    FLT_PREOP_CALLBACK_STATUS MyFiltr (// функция фильтрации
                                       __inout PFLT_CALLBACK_DATA Data,
                                       __in PCFLT_RELATED_OBJECTS FltObjects,
                                       __deref_out_opt PVOID *CompletionContext
                                      );
    //-----------------------------------------------------------------------------
    NULL_FILTER_DATA NullFilterData;
    //-----------------------------------------------------------------------------
    #ifdef ALLOC_PRAGMA
    #pragma alloc_text(INIT, DriverEntry)
    #pragma alloc_text(PAGE, FilterUnload)
    #pragma alloc_text(PAGE, QueryTeardown) 
    #pragma alloc_text(PAGE, InstanceSetup)
    #pragma alloc_text(PAGE, MyFiltr)
    #endif
    //-----------------------------------------------------------------------------
    const FLT_OPERATION_REGISTRATION FilterOperations[] =
        { 
           {IRP_MJ_CREATE,
            0,
            MyFiltr,// функция фильтрации
            NULL,
    NULL
           },
           { IRP_MJ_OPERATION_END}
        };
    typedef struct _SCANNER_STREAM_HANDLE_CONTEXT
                   { BOOLEAN RescanRequired;
                   } SCANNER_STREAM_HANDLE_CONTEXT, *PSCANNER_STREAM_HANDLE_CONTEXT;
    const FLT_CONTEXT_REGISTRATION ContextRegistration[] =
        {
          { FLT_STREAMHANDLE_CONTEXT,             // 1 ContextType
            0,                                    // 2 Flags
            NULL,                                 // 3 ContextCleanupCallback;
            sizeof(SCANNER_STREAM_HANDLE_CONTEXT),// 4 Size
            'chBS',                               // 5 PoolTag
            NULL,                                 // 6 ContextAllocateCallback
            NULL,                                 // 7 ContextFreeCallback
            NULL                                  // 8 Reserved1
          },
          { FLT_CONTEXT_END }
        };
    CONST FLT_REGISTRATION FilterRegistration =
        {
         sizeof( FLT_REGISTRATION ),         // 1 Size
         FLT_REGISTRATION_VERSION,           // 2 Version
         0,                                  // 3 Flags
         ContextRegistration,                // 4 ContextRegistration
         FilterOperations,                   // 5 OperationRegistration
         FilterUnload,                       // 6 FilterUnloadCallback
         InstanceSetup,                      // 7 InstanceSetupCallback 
         QueryTeardown,                      // 8 InstanceQueryTeardownCallback
         NULL,                               // 9 InstanceTeardownStartCallback
         NULL,                               // 10 InstanceTeardownCompleteCallback
         NULL,                               // 11 GenerateFileNameCallback
         NULL,                               // 12 NormalizeNameComponentCallback
         NULL                                // 13 NormalizeContextCleanupCallback
        };
    //=============================================================================
    NTSTATUS DriverEntry (__in PDRIVER_OBJECT DriverObject, // объект драйвера
                          __in PUNICODE_STRING RegistryPath // раздел реестра
                         )
    {
    PDEVICE_OBJECT pDeviceObject; // указатель на Functional Device Object (FDO)
    PDEVICE_EXTENSION dx;         // указатель на структуру расширения устройства
    NTSTATUS status;              // текущий статус выполненной операции
    UNICODE_STRING uniNtName;
    UNICODE_STRING uniWin32Name;
    UNREFERENCED_PARAMETER( RegistryPath );
    UNREFERENCED_PARAMETER( DriverObject );
    //-------------------------------
    RtlInitUnicodeString(&uniNtName,    NT_FILTER_NAME);
    RtlInitUnicodeString(&uniWin32Name, WIN32_FILTER_NAME);
    //--------------------- 
    DriverObject->DriverUnload = UnloadDriver;//п/п выгрузки драйвера
    //---------------------
    #if DBG
    DbgPrint("=FltF= ver. %s",VERSION );
    #endif
    //----------------------
    status=IoCreateDevice(DriverObject,
                          sizeof(DEVICE_EXTENSION),// size структуры расширения
                          &uniNtName,      // NT_FILTER_NAME
                          FILE_DEVICE_UNKNOWN,
                          0,
                          FALSE,           // без эксклюзивного доступа
                          &pDeviceObject   // cоздаем Functional Device Object (FDO)
                         );
    if(!NT_SUCCESS( status ))
      {
       #if DBG
       DbgPrint("=FltF= Error IoCreateDevice - DriverEntry");
       #endif   
       return(status);
      } 
    dx=(PDEVICE_EXTENSION)pDeviceObject->DeviceExtension;//структура расширения
    dx->fdo = pDeviceObject;  // обратный указатель
    RtlInitUnicodeString(&dx->Win32_Filter_Name, WIN32_FILTER_NAME);
    #if DBG
    DbgPrint("=FltF= DriverEntry - FDO %X, DevExt=%X.",pDeviceObject,dx);
    #endif
    //-----------------------------------------------------------------------------
    status=IoCreateSymbolicLink(&uniWin32Name,// видимое пользователю название
                                &uniNtName);// имя драйвера, созданный объект устройства
    if(!NT_SUCCESS( status ))
      {IoDeleteDevice(pDeviceObject);//удаляем Device Object и возвращаем управление
       #if DBG
       DbgPrint("=FltF= DriverEntry - Error IoCreateSymbolicLink");
       #endif
       return(status);
      }             
    //-------------------------- регистрация фильтра ------------------------------
    status = FltRegisterFilter( DriverObject,
                                &FilterRegistration,
                                &NullFilterData.FilterHandle
                              );
    if(!NT_SUCCESS( status ))
      {IoDeleteDevice(pDeviceObject);//удаляем Device Object и возвращаем управление
       #if DBG
       DbgPrint("=FltF= DriverEntry - Error FltRegisterFilter");
       #endif
       return(status); 
      }     
    #if DBG
    DbgPrint("=FltF= DriverEntry - OK FltRegisterFilter");
    #endif 
    status = FltStartFiltering( NullFilterData.FilterHandle );// запуск фильтра
    if(!NT_SUCCESS( status ))
      {FltUnregisterFilter( NullFilterData.FilterHandle ); // разрегистрируем фильтр
       IoDeleteDevice(pDeviceObject);//удаляем Device Object и возвращаем управление
       #if DBG
       DbgPrint("=FltF= DriverEntry - Error FltStartFiltering");
       #endif
       return(status);
      }
    #if DBG
    DbgPrint("=FltF= DriverEntry - Driver is successfully");
    #endif
    return(status);
    }// END DriverEntry(...)
    //-----------------------------------------------------------------------------
    NTSTATUS FilterUnload ( __in FLT_FILTER_UNLOAD_FLAGS Flags  )
    {
    UNREFERENCED_PARAMETER( Flags );
    PAGED_CODE();
    FltUnregisterFilter( NullFilterData.FilterHandle );
    #if DBG
    DbgPrint("=FltF= FilterUnload");       
    #endif
    return(STATUS_SUCCESS);
    }// END FilterUnload(...)
    //-----------------------------------------------------------------------------
    NTSTATUS QueryTeardown ( __in PCFLT_RELATED_OBJECTS FltObjects,
                             __in FLT_INSTANCE_QUERY_TEARDOWN_FLAGS Flags
                           )
    {
    UNREFERENCED_PARAMETER( FltObjects );
    UNREFERENCED_PARAMETER( Flags );
    PAGED_CODE();
    #if DBG
    DbgPrint("=FltF= QueryTeardown");         
    #endif
    return(STATUS_SUCCESS);
    }// END QueryTeardown(...)
    //-----------------------------------------------------------------------------
    VOID UnloadDriver(IN PDRIVER_OBJECT pDriverObject)
    {
    PDEVICE_OBJECT  pdeviceObject = pDriverObject->DeviceObject;
    PDEVICE_EXTENSION dx;
    UNREFERENCED_PARAMETER(pDriverObject);
    dx = (PDEVICE_EXTENSION)pdeviceObject->DeviceExtension;
    IoDeleteSymbolicLink(&dx->Win32_Filter_Name);
    IoDeleteDevice( pdeviceObject );
    #if DBG
    DbgPrint("=FltF= UnloadDriver  ver. %s",VERSION );   
    #endif   
    return;
    }// END UnloadDriver(...)
    //-----------------------------------------------------------------------------
    FLT_PREOP_CALLBACK_STATUS MyFiltr (
        __inout PFLT_CALLBACK_DATA Data,        // данные о файловой операции
        __in PCFLT_RELATED_OBJECTS FltObjects,  // не используется
        __deref_out_opt PVOID *CompletionContext//
        )
    {
    UNREFERENCED_PARAMETER( Data );
    UNREFERENCED_PARAMETER( FltObjects );
    UNREFERENCED_PARAMETER( CompletionContext );
    PAGED_CODE();
    #if DBG
    DbgPrint("=FltF= <<заглушка фильтрации>>");
    #endif     
    return FLT_PREOP_SUCCESS_WITH_CALLBACK; //  файл не блокируется
    }// END NullPreCreate(...)
    //-----------------------------------------------------------------------------
    NTSTATUS InstanceSetup ( __in PCFLT_RELATED_OBJECTS FltObjects,
                             __in FLT_INSTANCE_SETUP_FLAGS Flags,
                             __in DEVICE_TYPE VolumeDeviceType,
                             __in FLT_FILESYSTEM_TYPE VolumeFilesystemType
                           )
    {
    UNREFERENCED_PARAMETER( FltObjects );
    UNREFERENCED_PARAMETER( Flags );
    UNREFERENCED_PARAMETER( VolumeDeviceType );
    UNREFERENCED_PARAMETER( VolumeFilesystemType );
    PAGED_CODE();
    ASSERT( FltObjects->Filter == NullFilterData.FilterHandle );
    if (VolumeDeviceType == FILE_DEVICE_NETWORK_FILE_SYSTEM)
      {// не присоединять к сетевым томам
       DbgPrint("=FltF= == NullInstanceSetup ERR == 0x%08X",VolumeDeviceType);
       return(STATUS_FLT_DO_NOT_ATTACH);
      }
    DbgPrint("=FltF= == InstanceSetup OK  == 0x%08X",VolumeDeviceType); 
    return(STATUS_SUCCESS);
    }// END InstanceSetup(...)
    //-----------------------------------------------------------------------------

  • Привет всем.
    Мне в драйвере необходимо реализовать возможность отправки данных по TCP (с помощью TDI ) Но немогу найти примеры исходников где подобное было бы сделано. Нашёл такой отрывок
    Цитировать
    Для Windows до Vista задача сводиться к написанию TDI-клиента. Порядок действий примерно такой:
    1. ZwOpenFile ( \Device\Tcp или \Device\Udp ) - локальный адрес
    2. ZwOpenFile ( \Device\Tcp или \Device\Udp ) - удалённый узел
    3. ObReferenceObjectByHandle - на удалённый узел

    4. TdiBuildAssociateAddress, IoCallDriver
    5. TdiBuildSetEventHandler ( TDI_EVENT_RECEIVE ), IoCallDriver
    6. TdiBuildConnect, IoCallDriver
    7. TdiBuildSend, IoCallDriver

    8. Ждём данные. Будет вызвана наша функция, зарегистрированная на шаге 5.

    9. TdiBuildDisconnect, IoCallDriver
    10. TdiBuildDisassociateAddress, IoCallDriver
    11. TdiBuildSetEventHandler ( TDI_EVENT_RECEIVE == NULL ), IoCallDriver

    12. ObDereferenceObject - на удалённый узел
    13. ZwClose - удалённый узел
    14. ZwClose - локальный адрес
    Но несовсем понимаю как это сделать. На сайте rootkits.com Нашёл библиотеку "Kernel mode sockets library for the masses" но и в ней нет точного порядка действий + не все типы определены (некомпилируется).
    Может кто нить выложить какой нить полный образей который передаёт данные по Tcp из ядра.
    Заранее спасибо
  • Господа, разбираюсь с passthru. C переменным успехом.

    Написал в PtReceivePacket код, анализирующий протокол, и если это ARP,
    пытаюсь отправить его обратно в сеть.

    Код:
    PNDIS_PACKET  Pack2; 
    if(reverse_us(peth->ether_type) == 0x0806) // ARP
    {
    NdisAllocatePacket(&Status,
      &Pack2,
      pAdapt->SendPacketPoolHandle);

    if (Status == NDIS_STATUS_SUCCESS)
    {
    PSEND_RSVD SendRsvd;

    SendRsvd = (PSEND_RSVD)(Pack2->ProtocolReserved);
    SendRsvd->OriginalPkt = Packet;

    Pack2->Private.Flags = NdisGetPacketFlags(Packet);

    NDIS_GET_PACKET_MEDIA_SPECIFIC_INFO(Packet,
    &MediaSpecificInfo,
    &MediaSpecificInfoSize);

    if (MediaSpecificInfo || MediaSpecificInfoSize)
    {
    NDIS_SET_PACKET_MEDIA_SPECIFIC_INFO(Pack2,
    MediaSpecificInfo,
    MediaSpecificInfoSize);
    }

    NdisAllocateBufferPool(&Status, &PoolHandle, 1);
    DBGPRINT(("PtReceivePacket: Status = %d\n", Status));

    DBGPRINT(("PtReceivePacket: NdisAllocateBuffer\n"));
    NdisAllocateBuffer(&Status, &NdisBufAdd, PoolHandle, buf, NumberOfBytes);

    DBGPRINT(("PtReceivePacket: NdisChainBufferAtBack\n"));
    NdisChainBufferAtFront(Pack2, NdisBufAdd);

    GetBufFromPacket(Pack2,
     buf,
     sizeof(buf),
     &NumberOfBytes);

    DBGPRINT(("PtReceivePacket: Send from recieve!!!\n"));
    PrintBufer(buf, NumberOfBytes);

    //_asm {int 3};
    NdisSend(&Status,
    pAdapt->BindingHandle,
    Pack2);

    if (Status != NDIS_STATUS_PENDING)
    {
    NdisFreePacket(Pack2);
    }

    //return 0;
    }
    }

    Код:
    VOID PtSendComplete(IN NDIS_HANDLE   ProtocolBindingContext,
    IN  PNDIS_PACKET Packet,
    IN  NDIS_STATUS Status
    )
    {
    PADAPT pAdapt =(PADAPT)ProtocolBindingContext;
    PNDIS_PACKET Pkt;
    NDIS_HANDLE PoolHandle;
    ULONG NumberOfBytes;
    UCHAR buf[1518];
    UINT index = 0;

    #ifdef NDIS51
    PoolHandle = NdisGetPoolFromPacket(Packet);
    if (PoolHandle != pAdapt->SendPacketPoolHandle)
    {
    DBGPRINT(("PtSendComp: Adapt %p, Stacked Packet %p\n", pAdapt, Packet));

    NdisMSendComplete(pAdapt->MiniportHandle,
     Packet,
     Status);
    DBGPRINT(("\nPtSendComp: After NdisMSendComplete. Status = %d\n", Status));
    }
    else
    #endif // NDIS51
    {
    PSEND_RSVD SendRsvd;

    SendRsvd = (PSEND_RSVD)(Packet->ProtocolReserved);
    Pkt = SendRsvd->OriginalPkt;

    DBGPRINT(("\nPtSendComp: Befor NdisDprFreePacket\n"));
    NdisDprFreePacket(Packet);

    DBGPRINT(("\nPtSendComp: Befor NdisMSendComplete\n"));
    NdisMSendComplete(pAdapt->MiniportHandle,
    Pkt,
    Status);
    }
    DBGPRINT(("\nPtSendComp: EXIT"));
    }  

    Как я понял if (PoolHandle != pAdapt->SendPacketPoolHandle) разделяет пакеты, пришедшие от вышележащих драйверов
    и созданные мной. Когда я попадаю в else, получаю BSOD на NdisMSendComplete.

    Подскажите, что не так и куда копать.
  • Как можно инсталлировать Passthru драйвер без inf файла и постоянных перезагрузок. Остальные драйвера, для которых не надо нужна цифровая подпись,  спокойно устанавливаются с помощью KmdManager Русинович и INSTDRV. Но с ndis IM драйвером так не катит.... И получается, что после каждого внесения изменения в код passthru, для того чтоб проверить работу надо ребутить систему и устанавливать с помощью inf файла... =(

    как можно рещить эту проблему...

    П.С : Разработка жрай
  • Доброго времени суток! Знаю, что на данном форуме куча информации про NDIS драйвер и, в частности, про Passthru. Но вот есть такой вопрос. Я пишу дипломный проект Файрвол. Не хочется сдавать чужой проект, поэтому взялся за дело сам. Перелопатил ваши статьи да так и не нашел, как драйвер может сообщить о пришедшем пакете и передать его в программу, использующую этот драйвер.
    Использовал пример Passthru driver вот с этого сайта: h**p://www.wd-3.com/downloads/PassThru3.zip
    Отличный сайт, куча примеров, ну а теперь по порядку. Хочу написать кроссплатформенный файрвол. Низкоуровневую часть под Windows собираюсь реализовывать с помощью NDIS driver. Возможно ли в NDIS драйвере реализовать с помощью механизма событий или callback'ов передачу пакета в программу? Необходимо, чтобы при приходе любого пакета программа узнавала об этом и получала его.

    Заранее спасибо)
  • можно ли так проинициализировать юникод_стринг, когда нужен сринг ОПРЕДЕЛЕННОЙ длинны

       
    Код:
      UNICODE_STRING Name;
      NTSTATUS status = STATUS_SUCCESS;
      RtlZeroMemory ( &ObjectName, sizeof (UNICODE_STRING) );
      ObjectName->Length = 128;
      ObjectName->MaximumLength = ObjectName->Length;
      ObjectName->Buffer = (PWSTR) ExAllocatePoolWithTag( PagedPool,
                                                ObjectName->Length,
                                                TAG_NAME_BUFFER );
      RtlZeroMemory (ObjectName->Buffer, ObjectName->Length );


    потому-что насколько я понимаю обычный RtlInitUnicodeString() вроде как макрос, который просто инициирует поля структуры (проставляя указатель на строку вида L"unicode string constant")

    а то я что-то смущаюсь  :shuffle:
  • Направления программирования :: Web
  • День добрый, господа.
    Необходимо на сайте генерировать акт выполненных работ для последующего его вывода на печать.
    Попробовал выводить в отдельной HTML-форме. Отформатировал, как надо, с отступами и т.д. Но при печати выдает снизу адрес и сверху еще какую-то хрень. Нехорошо.

    Есть мысль в ворде формировать и сохранять юзеру на машину... Но это нужно офис ставить на сервер. Кто как решает такие проблемы?
  • Направления программирования :: Web :: Серверные скрипты
  • В PHP совершенно не продуманы операции работы с массивами. Они ориентированные на упорядоченные массивы и на не сохранение ключей элементов. В тоже время, массивы в PHP ассоциативные (хотя и упорядоченные).

    Потребовалось переместить срез массива в другую позицию в том же массиве с сохранением ключей всех элементов и я офигел от обилия необходимых действий.

    Вот тестовая задача.
    Имеется двухуровневое дерево. Все узлы дерева расположены в одном массиве в определенном порядке, причем дочерние узлы расположены сразу после родительского. Входные параметры: id узла и позиция элемента, за которым его следует расположить.

    Я сделал следующие действия:
    1. Поиск узла и его потомков и перемещение их во временный массив.
    2. Перемещение исходных узлов до позиции в результирующий массив.
    3. Перемещение временного массива в результирующий массив.
    4. Перемещение оставшихся исходных узлов в результирующий массив.

    Код: (php)
    <?php

    // Перемещение элемента массива между массивами. Сделано для удобства.
    function moveArrayItem($key, &$from, &$to)
    {
        
    $to[$key] = &$from[$key];
        unset(
    $from[$key]);
    }

    $what 8// Что перемещаем
    $placeAfter 0// После кого помещаем

    // Тестовый массив
    $src = array(
        
    "1" => array('id' => 1'parent' => 0),
        
    "3" => array('id' => 3'parent' => 1),
        
    "4" => array('id' => 4'parent' => 1),
        
    "6" => array('id' => 6'parent' => 0),
        
    "7" => array('id' => 7'parent' => 6),
        
    "8" => array('id' => 8'parent' => 0),
        
    "9" => array('id' => 9'parent' => 8),
    );

    // Массив результата
    $result = array();


    // Переносим перемещаемое во временный массив
    $tmp = array();
    $trigger false;

    foreach (
    $src as $k => $v)
    {
        
    $found = ($k == $what || $v['parent'] == $what);
        
    $trigger $trigger || $found;

        if (
    $found)
            
    moveArrayItem($k$src$tmp);
        elseif (
    $trigger)
            break;
    }


    // Перемещаем элементы до позиции
    if ($placeAfter)
    {
        
    $trigger false;

        foreach (
    $src as $k => $v)
        {
            
    $found = ($k == $placeAfter || $v['parent'] == $placeAfter);
            
    $trigger $trigger || $found;

            if (
    $found || !$trigger)
                
    moveArrayItem($k$src$result);
            else
                break;
        }
    }


    // Перемещаем временный массив в результат
    foreach ($tmp as $k => $v)
        
    moveArrayItem($k$tmp$result);


    // Перемещаем оставшиеся элементы в результат
    foreach ($src as $k => $v)
        
    moveArrayItem($k$src$result);

    // Вывод
    print_r($result);

    ?>


    На мой взгляд это очень громоздко. Может ли кто предложить более простой способ?

  • Практические разделы :: Базы данных
  • Когда количество строк в таблице начинает приближаться к 4 миллионам, обновление записей при вставке новой порции данных вызывает катастрофическое падение производительности базы.

    Вот структура таблицы:
    Код:
    create table `traffic_cur`
    (
            `date` datetime not null,
            `srcIp` int unsigned not null,
            `dstIp` int unsigned not null,
            `dstPort` int not null,
            `pId` tinyint not null,
            `inBytes` int unsigned not null,
            `outBytes` int unsigned not null,
            key `key1` (`date`),
            key `key2` (`srcIp`, `date`)
    ) engine = MyISAM;

    Вот лог медленных запросов MySQL:
    Код:
    # Time: 101014 23:55:03
    # User@Host: kkk[kkk] @ localhost []
    # Query_time: 8  Lock_time: 3  Rows_sent: 0  Rows_examined: 0
    use trafstat;
    update traffic_cur set inBytes = inBytes + 0, outBytes = outBytes + 1296
            where date = '2010-10-14 11:30:0' && srcIp = '3232235650' && dstIp = '2915158597' && dstPort = '80' && pId = '1';
    # Time: 101015  0:29:38
    # User@Host: kkk[kkk] @ localhost []
    # Query_time: 10  Lock_time: 4  Rows_sent: 0  Rows_examined: 0
    update traffic_cur set inBytes = inBytes + 0, outBytes = outBytes + 972
            where date = '2010-10-14 11:30:0' && srcIp = '3232235650' && dstIp = '3161599592' && dstPort = '14445' && pId = '1';
    # Time: 101015  0:53:21
    # User@Host: kkk[kkk] @ localhost []
    # Query_time: 9  Lock_time: 3  Rows_sent: 0  Rows_examined: 0
    update traffic_cur set inBytes = inBytes + 0, outBytes = outBytes + 868
            where date = '2010-10-14 11:30:0' && srcIp = '3232235650' && dstIp = '1832751900' && dstPort = '15720' && pId = '1';
    # Time: 101015  1:22:08
    # User@Host: kkk[kkk] @ localhost []
    # Query_time: 10  Lock_time: 4  Rows_sent: 0  Rows_examined: 0
    update traffic_cur set inBytes = inBytes + 95, outBytes = outBytes + 0
            where date = '2010-10-14 15:30:0' && srcIp = '3232235650' && dstIp = '1401841941' && dstPort = '40646' && pId = '2';
    # Time: 101015  2:45:23
    # User@Host: kkk[kkk] @ localhost []
    # Query_time: 8  Lock_time: 3  Rows_sent: 0  Rows_examined: 0
    update traffic_cur set inBytes = inBytes + 200, outBytes = outBytes + 0
            where date = '2010-10-14 11:30:0' && srcIp = '3232235650' && dstIp = '1296210733' && dstPort = '16465' && pId = '1';
    /usr/libexec/mysqld, Version: 5.0.67-log (Source distribution). started with:
    Tcp port: 0  Unix socket: /var/run/mysql/mysql.sock
    Time                 Id Command    Argument

    Подскажите как быть? Может можно как то разбить таблицу на более мелкие? Или переходить на PostgreSQL?
  • Учимся программировать :: Срочно пАмАгите!!!
  • Люди, подскажите, как быть. Мне надо сделать программу на Dev-cpp, но нЕмного не понимаю как.

    Дана строка. Исключить из нее подстроку, расположенную между самой левой открывающейся скобкой «(» и самой правой закрывающейся скобкой «)». Сами скобки должны быть также исключены.

    Как сделать массив от '(' до ')' ?
    В общем, помогите кто чем может?
    Я начал
    Код: (c++)
    #include <string.h>
    #include <stdio.h>
    #include <conio.h>
    #include <stdlib.h>
    #define SIZE 255
    int main()
    {
        char s[SIZE], sn[SIZE], sk[SIZE];
        
        printf ("введите буквенные элементы строки перед, после и в самих скобках \n");
        scanf ("%s",s);
        for(int i=0; i<strlen(s); i++)
        {
    if(s[i]=='(');

    if (s[i]==')');
        
        }    
        
    getch();
    return 0;
        
    }
  • Учимся программировать :: Начинающим
  • Меня интересует реализация одного технического решения с использованием, возможно, СОМ порта. В информатике и программировании я не силен.
    Поэтому хотелось бы спросить людей знающих, насколько возможно написать программу, чтобы она выполняла такую функцию:

        имееются точки с координатами Х и У:
        1(х1, у1); 2(х2,у2); 3(х3, у3) ..... N(xn,yn)

        соответственные перемещения :
            между точками 1 и 2:
                по х = х2 - х1
                по у = у2 - у1
            между точками 2 и 3:
                по х = х3 - х2
                по у = у3 - у2

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

    программа высчитывает эти перемещения между точками и отсылает на  какие-то выводы( как я предполагаю COM порта ) количество импульсов,  соответствующее этим перемещениям, если перемещение положительно, то одной полярности, если перемещение отрицательно, то по тем же выводам - другой полярности. Если полярность на выводах изменить нельзя, то можно послать эти  отрицательные" импульсы по другим выводам, имея общий "-", т.е. землю.

    Импульсы от перемещений по Х отсылаются на одну пару выводов
                     от перемещений по У - на другую пару.

    Под парой выводов я подразумеваю + и -, откуда можно запитаться (насколько мне известно, там есть GND и др входы-выходы).

    перед отсылкой следующего импульса программа ждет сигнала готовности, принятого всё с того же СОМ порта (хотя это можно и отбросить, если вместо этого будет обеспечено, например, закорачивание клавиши ENTER при управлении из VBasic)

    Но все это только немного упорядоченная куча моих мыслей и догадок.

    Заранее благодарен за возможный ответ.
  • Здравствуйте!
    Я начинающий программер на Си. Мне попалась такая задача:

    Введите 2 числа и посчитать сумму всех чисел между ними.

    Решебник предлагает такое решение:

    Код:
    #include<stdio.h>
    void main()
    {
    int i,n,m,sum=0;
    printf("Vvedite dva chelix chisla:");
    scanf("%d%d",&n,&m);
    if(n>m)
            {
               i=n;
       n=m;
       m=i;
            }

    for (i=n;i<=m;i++);
    {
                if(i!=n)
                   printf("%+d",i);
        else
                   printf("%d",i);
       sum+=i;
            }
    printf("=%d\n",sum);

    }


    Синтаксических ошибок здесь, но решение неадекватное. Мне кажется, в этом коде содержится ошибка. Может, кто подскажет, где?
  • Добрый день! вопрос такой:
    Надо сделать такие выборки:

    1.   Вывести список лицевых счетов тех абонентов, у которых нет долга.
    2.   Вывести список лицевых счетов абонентов, у которых за последний период израсходовано более 100м3 горячей и 200м3 холодной воды.
    3.   Вывести список ФИО тех абонентов, у которых нет телефонов и не указано в каких городах они живут.
    4.   Вывести список ФИО тех абонентов,  которые проживают в собственных домах (нет номеров квартир).
    5.   Вывести абонентов мужского пола (использовать идентификатор пола равный 21), не имеющих телефонов

    семантика:

    Таблица CLIENT – данные об абонентах.
    ∙   N_CLIENT – лицевой счет
    ∙   C_FIRST_NAME – имя
    ∙   C_SECOND_NAME – отчество
    ∙   C_LAST_NAME – фамилия
    ∙   N_SEX – идентификатор пола
    ∙   N_CITY – идентификатор города или поселка
    ∙   N_STREET – идентификатор улицы
    ∙   C_HOUSE – номер дома и номер корпуса
    ∙    N_FLAT – номер квартиры
    ∙   N_PHONE – номер телефона

    Таблица SEX – справочник пола
    ∙   N_SEX – идентификатор пола
    ∙   C_SEX – название пола

    Таблица STREET – справочник улиц
    ∙   N_STREET – идентификатор улицы
    ∙   C_STREET – название улицы

    Таблица CITY – справочник городов и поселков
    ∙   N_CITY – идентификатор города или поселка
    ∙   C_CITY – название города или поселка

    Таблица PAYMENT – оплата абонента
    ∙   N_CLIENT – лицевой счет абонента
    ∙   D_PAY – дата оплаты
    ∙   N_SUM – сумма оплаты
    ∙   N_SIGN – признак(1 – оплата учтена при начислении, 0 – оплата не учтена)

    Таблица COMPUTATION – начисления абонентов
    ∙   N_COMPUTATION – идентификатор начисления
    ∙   N_CLIENT – лицевой счет абонента
    ∙   D_COMPUTATION – дата начисления
    ∙   N_INFO_HOT – текущие показания счетчика горячей воды
    ∙   N_INFO_COLD – текущие показания счетчика холодной воды
    ∙   N_DIFFERENCE_HOT – разница текущих и предыдущих показаний счетчика горячей воды
    ∙   N_DIFFERENCE_COLD – разница текущих и предыдущих показаний счетчика холодной воды
    ∙   N_TARIFF – идентификатор тарифов на горячую и холодную воду
    ∙   N_SUM_HOT – начисление за горячую воду за текущий период
    ∙   N_SUM_HOT – начисление за холодную воду за текущий период
    ∙   N_DEBT – долг на начало периода
    ∙   N_PAY – оплата за предыдущий период
    ∙   N_TOTAL – итоговая сумма на конец месяца

    Таблица TARIFF – тарифы на горячую и холодную воду
    ∙   N_TARIFF – идентификатор тарифов по холодной и горячей воде
    ∙   D_TARIFF – дата смены тарифов на новые
    ∙   N_TARIFF_HOT – тариф на горячую воду (в руб.)
    ∙   N_TARIFF_COLD – тариф на холодную воду (в руб.)

    Пишу вот это:
    1. Select  N_CLIENT
    FROM payment
    WHERE  N_SUM is NULL
    2. Select  N_CLIENT, N_INFO_HOT, N_INFO_COLD
    FROM computation
    WHERE  N_INFO_HOT>100 and N_INFO_COLD>200
    3. Select  C_LAST_NAME, C_FIRST_NAME, C_SECOND_NAME
    FROM client
    WHERE  N_CITY AND N_PHONE is NULL
    4. Select  C_LAST_NAME, C_FIRST_NAME, C_SECOND_NAME
    FROM client
    WHERE  N_FLAT is NULL
    5. Select  C_LAST_NAME, C_FIRST_NAME, C_SECOND_NAME, N_PHONE
    FROM client
    WHERE  N_SEX = 21 AND N_PHONE IS NULL

    Подскажите, правильно ли я мыслю?
  • Посоветуйте или подскажите другое решение.
    Для организации диалога в программе использую UpdateData(true/false), чтобы почитать введенные значения и обновить экран.
    И в этой же программе строю графики, используя MoveTo, PolyLineTo и др.
    Чаще всего график выводится(визуализируется) только на второй раз, если до этого был вывод на экран  Edit с помощью UpdateData(false).

А теперь прощаемся с Вами до следующего выпуска.


С уважением, команда Клуба.


В избранное