Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Заполнение буфера из спроецированного файла 
:(
    Опции темы
freezeman
Дата 4.4.2012, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 21.1.2011

Репутация: нет
Всего: нет



Здравствуйте, подскажите, пожалуйста!

Есть перехваченная функция ReadFile. Файл, который считывает эта функция спроецирован в память, как заполнить буфер LPVOID lpBuffer с учетом смещения LPOVERLAPPED lpOverlapped ?

Если можно пример, но и теория не помешает. Проекция, перехват все сделал, только само заполнение со смещением из проекции нужно...
PM MAIL   Вверх
xvr
Дата 4.4.2012, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



Код

LPOVERLAPPER ovl;
LPVOID lpBuffer;
DWORD Size;
LPDWORD ResuiltSize;

char* image_buffer;
__int64 image_size;

__int64 shift = __int64(ovl->Pointer);
if (shift+Size>image_size) Size=image_size-shift;
// check for Size<0 too
memcpy(lpBuffer,image_buffer+shift,Size);
if (ResultSize) *ResuiltSize=Size;



PM MAIL   Вверх
freezeman
Дата 4.4.2012, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 21.1.2011

Репутация: нет
Всего: нет



Цитата(xvr @ 4.4.2012,  13:01)
Код

LPOVERLAPPER ovl;
LPVOID lpBuffer;
DWORD Size;
LPDWORD ResuiltSize;

char* image_buffer;
__int64 image_size;

__int64 shift = __int64(ovl->Pointer);
if (shift+Size>image_size) Size=image_size-shift;
// check for Size<0 too
memcpy(lpBuffer,image_buffer+shift,Size);
if (ResultSize) *ResuiltSize=Size;


Поясните, пожалуйста, 13 строчку...
PM MAIL   Вверх
xvr
Дата 4.4.2012, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



Цитата(freezeman @  4.4.2012,  15:13 Найти цитируемый пост)
Поясните, пожалуйста, 13 строчку... 

У ReadFile есть параметр (я его обозвал тут ResuiltSize), через который он возвращает количество реально прочтенных байтов

PM MAIL   Вверх
freezeman
Дата 4.4.2012, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 21.1.2011

Репутация: нет
Всего: нет



Цитата(xvr @ 4.4.2012,  15:51)
Цитата(freezeman @  4.4.2012,  15:13 Найти цитируемый пост)
Поясните, пожалуйста, 13 строчку... 

У ReadFile есть параметр (я его обозвал тут ResuiltSize), через который он возвращает количество реально прочтенных байтов

Точно, точно...понял, спасибо огромное!!!!
PM MAIL   Вверх
freezeman
Дата 8.5.2012, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 21.1.2011

Репутация: нет
Всего: нет



Цитата(xvr @ 4.4.2012,  13:01)
Код

LPOVERLAPPER ovl;
LPVOID lpBuffer;
DWORD Size;
LPDWORD ResuiltSize;

char* image_buffer;
__int64 image_size;

__int64 shift = __int64(ovl->Pointer);
if (shift+Size>image_size) Size=image_size-shift;
// check for Size<0 too
memcpy(lpBuffer,image_buffer+shift,Size);
if (ResultSize) *ResuiltSize=Size;


Попробовал использовать Ваш код в dll, ошибок не возвращает, но и не считывает файл в приложении...

Это сообщение отредактировал(а) freezeman - 8.5.2012, 18:06
PM MAIL   Вверх
xvr
Дата 10.5.2012, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



Цитата(freezeman @  8.5.2012,  17:33 Найти цитируемый пост)
 но и не считывает файл в приложении...

А вы уверены, что файл открыт в Overlepped режиме? И что этот файл действительно файл?

PM MAIL   Вверх
freezeman
Дата 10.5.2012, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 21.1.2011

Репутация: нет
Всего: нет



Цитата(xvr @ 10.5.2012,  14:17)
Цитата(freezeman @  8.5.2012,  17:33 Найти цитируемый пост)
 но и не считывает файл в приложении...

А вы уверены, что файл открыт в Overlepped режиме? И что этот файл действительно файл?

overlapped == NULL, я проверил на условие и смещение shift установли в 0.

Да, уверен... я ему конкретный файл подсовываю, спроецированный ранее. 

Я никакое значение не возвращаю после заполнения, может быть в этом проблема?
Если предположить, что в целевом приложении после вызова ReadFile проверяется результат операции на true/false, а я ничего не возвращаю, то и ничего не грузится...
PM MAIL   Вверх
xvr
Дата 10.5.2012, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



Цитата(freezeman @  10.5.2012,  14:46 Найти цитируемый пост)
overlapped == NULL, я проверил на условие и смещение shift установли в 0.

Это не правильно. Если Overlapped==NULL, то это обычный последовательный режим чтения, и читать нужно с текущей файловой позиции, которая после чтения должна увеличится на размер прочитанного

Цитата(freezeman @  10.5.2012,  14:46 Найти цитируемый пост)
Я никакое значение не возвращаю после заполнения, может быть в этом проблема?

Может. ReadFile возвращает признак ошибки. Если вы ничего не вернули, то в качестве результата будет использован мусор, что вполне может соотвествовать ошибке чтения

PM MAIL   Вверх
freezeman
Дата 10.5.2012, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 21.1.2011

Репутация: нет
Всего: нет



Цитата

Если Overlapped==NULL, то это обычный последовательный режим чтения, и читать нужно с текущей файловой позиции, которая после чтения должна увеличится на размер прочитанного

Я так и считываю, просто shift (смещение, насколько я понимаю) устанавливаю в 0, если Overlapped==NULL  и получается такого вида копирование: memcpy(lpBuffer, image_buffer+0, Size); Позиция должна измениться на размер прочитанного... это lpNumberOfBytesRead (число прочитанных байтов) нужно установить в количество прочитанных байт, я правильно понимаю?

PM MAIL   Вверх
freezeman
Дата 10.5.2012, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 21.1.2011

Репутация: нет
Всего: нет



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

Код то же, только после считывания добавил return true;

Блокнот загружает один и тот же файл в цикле каком-то( добавляя собержимое и файл загружается N раз....

Это сообщение отредактировал(а) freezeman - 10.5.2012, 17:49
PM MAIL   Вверх
GremlinProg
Дата 11.5.2012, 07:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(freezeman @  10.5.2012,  19:46 Найти цитируемый пост)
В чем может быть загвоздка?

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

Добавлено через 1 минуту и 56 секунд
к сожалению, в таком случае помочь тебе может только 
freezeman  smile 


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
freezeman
Дата 11.5.2012, 10:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 21.1.2011

Репутация: нет
Всего: нет



Цитата(GremlinProg @ 11.5.2012,  07:22)

ну, загвоздка все в том же: на протяжении уже порядка 20 тем, ты не показываешь проблемного кода

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

static int (WINAPI * RealReadFile)(HANDLE,LPVOID,DWORD,LPDWORD,LPOVERLAPPED) = ReadFile;

BOOL WINAPI MyReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped)
{
            //----Проверить на наличие файла в проекции-Н-------------
            HANDLE hMapCachFile;
            hMapCachFile = OpenFileMapping(
                FILE_MAP_ALL_ACCESS,   
                FALSE,             
                Name); // имя проекции, созданной в другом приложении. ФАЙЛ ПОЛНОСТЬЮ СПРОЕЦИРОВАН, проекция открывается без ошибок!
            if (hMapCachFile != NULL)
            {
                char* image_buffer;
                image_buffer = (char *)MapViewOfFile(
                    hMapCachFile, 
                    FILE_MAP_ALL_ACCESS, 
                    0,
                    0,
                    0);

                //--ЗАПОЛНЕНИЕ БУФЕРА!!!-Н------------------
                __int64 image_size = strlen(image_buffer);
                __int64 shift;
                if (lpOverlapped != NULL)
                    shift = __int64(lpOverlapped->Pointer);
                else
                    shift = 0;

                if (shift+nNumberOfBytesToRead>image_size) 
                    nNumberOfBytesToRead=image_size-shift;

                memcpy(lpBuffer,image_buffer+shift,nNumberOfBytesToRead);
                if (lpNumberOfBytesRead) 
                    *lpNumberOfBytesRead=nNumberOfBytesToRead;
                return true;
                //--ЗАПОЛНЕНИЕ БУФЕРА!!!-К------------------
            }
            //----Проверить на наличие файла в проекции-К-------------
        }
               else
               RealReadFile(hFile, lpBuffer, nNumberOfBytesToRead, lpNumberOfBytesRead, lpOverlapped);
}


Это сообщение отредактировал(а) freezeman - 11.5.2012, 10:00
PM MAIL   Вверх
xvr
Дата 11.5.2012, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



Цитата(freezeman @  10.5.2012,  16:38 Найти цитируемый пост)
Я так и считываю, просто shift (смещение, насколько я понимаю) устанавливаю в 0, если Overlapped==NULL

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

Цитата(freezeman @  10.5.2012,  16:38 Найти цитируемый пост)
Позиция должна измениться на размер прочитанного... это lpNumberOfBytesRead (число прочитанных байтов) нужно установить в количество прочитанных байт, я правильно понимаю?

Почти - не установить, а прибавить к своей переменной.

Цитата(freezeman @  10.5.2012,  17:46 Найти цитируемый пост)
Возвращаю значение в перехватившей функции, видит нужный файл, работает правильно, но файл, который я подсовываю (т.е. который спроецирован) как-бы зацикливается при его открытии.

Разумеется, ты же его каждый ReadFile с начала читаешь, а надо продолжать чтение с последней позиции и дальше.

Добавлено через 1 минуту и 14 секунд
Цитата(freezeman @  11.5.2012,  10:00 Найти цитируемый пост)
                __int64 image_size = strlen(image_buffer);

Ой! Для бинарного файла это в корне неверно.


Это сообщение отредактировал(а) xvr - 11.5.2012, 11:04
PM MAIL   Вверх
freezeman
Дата 11.5.2012, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 21.1.2011

Репутация: нет
Всего: нет



Я немного поправил код и выяснил, что при перехвате функции ReadFile выполнится мой код, я заполняю буфер, 
а потом ВЫЗЫВАЕТСЯ ПЕРВОНАЧАЛЬНАЯ ФУНКЦИЯ ReadFile, которую я и перехватывал, что происходить не должно!

Может я неправильно запускаю перехват?

Код:
Код

#include "stdafx.h"
#include <windows.h>
#include <detours.h>
#pragma comment (lib, "detours.lib")
...

static int (WINAPI * RealReadFile)(HANDLE,LPVOID,DWORD,LPDWORD,LPOVERLAPPED) = ReadFile;

BOOL WINAPI MyReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped)
{
        if (запрашиваемый файл спроецирован в память)
        {
                 // Выполняем заполнения буфера  
                 return true; // в случае успеха, иначе False
                 /* Если условие выполнится и код корректно отработает и вернет true, почему вызывается первоначальная функция REadFile, 
                 которую я перехватил и начинает отрабатывать так как планировала??!!(( */
         }
        else
         RealReadFile(hFile, lpBuffer, nNumberOfBytesToRead, lpNumberOfBytesRead, lpOverlapped); // Вызываем оригинал функции
}

BOOL WINAPI DllMain(HINSTANCE hinst, DWORD dwReason, LPVOID reserved)
{
    if (dwReason == DLL_PROCESS_ATTACH) {
        // До перехвата можно использовать оригинальный адрес функции
        DetourTransactionBegin();
        DetourUpdateThread(GetCurrentThread());
        DetourAttach(&(PVOID&)RealReadFile, MyReadFile);
        DetourTransactionCommit();
    }
    else if (dwReason == DLL_PROCESS_DETACH) {
        // После перехвата - только тот, что нам дала функция DetourAttach
        // (иначе вызовем перехватчик, а не оригинал функции)
        DetourTransactionBegin();
        DetourUpdateThread(GetCurrentThread());
        DetourDetach(&(PVOID&)RealReadFile, MyReadFile);
        DetourTransactionCommit();
    }
    return TRUE;
}



Это сообщение отредактировал(а) freezeman - 11.5.2012, 16:54
PM MAIL   Вверх
feodorv
Дата 11.5.2012, 19:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 9
Всего: 45



Цитата(freezeman @  11.5.2012,  17:53 Найти цитируемый пост)
BOOL WINAPI MyReadFile

Интересно, что возвращает эта функция.

Большая просьба к freezeman обращать внимания не только на ошибки компиляции, но и на предупреждения...

Добавлено @ 19:50
Цитата(freezeman @  11.5.2012,  17:53 Найти цитируемый пост)
а потом ВЫЗЫВАЕТСЯ ПЕРВОНАЧАЛЬНАЯ ФУНКЦИЯ ReadFile

Как Вы это определили?

Это сообщение отредактировал(а) feodorv - 11.5.2012, 19:50


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
freezeman
Дата 11.5.2012, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 21.1.2011

Репутация: нет
Всего: нет



Цитата

Интересно, что возвращает эта функция.

Я пробовал и VOID тип указывать... при BOOL возвращаю TRUE или FALSE в зависимости от результата заполнения...

Цитата

Цитата(freezeman @  11.5.2012,  17:53 Найти цитируемый пост)
а потом ВЫЗЫВАЕТСЯ ПЕРВОНАЧАЛЬНАЯ ФУНКЦИЯ ReadFile

Как Вы это определили?


Я считываю определенный файл, прежде спроецированный в память и возвращаю true... но если изменить файл на диске (т.е. спроецированный и на диске отличаются), то программа считывает файл на ЖД, хотя код заполнения буфера выполняется...

Код

__int64 image_size = ... // размер файла 
                __int64 shift;
                if (lpOverlapped != NULL)
                {
                    shift = __int64(lpOverlapped->Pointer);
                }
                else
                {
                    shift = 0;
                }
                if (shift+nNumberOfBytesToRead>image_size) 
                    nNumberOfBytesToRead=image_size-shift;
                memcpy(lpBuffer,image_buffer+shift,nNumberOfBytesToRead);
                if (lpNumberOfBytesRead) 
                    *lpNumberOfBytesRead+=nNumberOfBytesToRead;
                return true;

PM MAIL   Вверх
feodorv
Дата 11.5.2012, 23:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 9
Всего: 45



Цитата(freezeman @  11.5.2012,  21:04 Найти цитируемый пост)
Я пробовал и VOID тип указывать...

Зачем? Вам ведь нужно всё указать так же как у оригинальной ReadFile. А там стоит однозначное BOOL smile 

Цитата(freezeman @  11.5.2012,  21:04 Найти цитируемый пост)
при BOOL возвращаю TRUE или FALSE в зависимости от результата заполнения...

Для своей обработки, да, возвращаете. А здесь:
Цитата(freezeman @  11.5.2012,  17:53 Найти цитируемый пост)
...
        else
         RealReadFile(hFile, lpBuffer, nNumberOfBytesToRead, lpNumberOfBytesRead, lpOverlapped); // Вызываем оригинал функции
}

???

Цитата(freezeman @  11.5.2012,  21:04 Найти цитируемый пост)
Я считываю определенный файл, прежде спроецированный в память и возвращаю true... но если изменить файл на диске (т.е. спроецированный и на диске отличаются), то программа считывает файл на ЖД, хотя код заполнения буфера выполняется...

Так вывод сделать очень сложно, так как после внесения изменений в файл они скорее всего отразятся и на проекции файла (станут когерентными). Windows не гарантирует когерентности, но, тем не менее, скорее всего когерентность будет. Но тут я Вам сказать ничего определённого не смогу, так как с Detour не знаком...

Добавлено через 56 секунд
Цитата(freezeman @  11.5.2012,  21:04 Найти цитируемый пост)
                    shift = 0;

Всегда?


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
freezeman
Дата 12.5.2012, 07:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 21.1.2011

Репутация: нет
Всего: нет



Цитата

Для своей обработки, да, возвращаете. А здесь:
Цитата(freezeman @  11.5.2012,  17:53 Найти цитируемый пост)
...
        else
         RealReadFile(hFile, lpBuffer, nNumberOfBytesToRead, lpNumberOfBytesRead, lpOverlapped); // Вызываем оригинал функции
}

???

Здесь вызывается оригинальная функция, если файл, с которого происходит чтение, не найден в проекции.

Цитата

Так вывод сделать очень сложно, так как после внесения изменений в файл они скорее всего отразятся и на проекции файла (станут когерентными). Windows не гарантирует когерентности, но, тем не менее, скорее всего когерентность будет.

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

Я когда изучал перехват, рассматривал примеры, читал документацию, я так понял, что функция перехватывается, т.е. заменяется оригинальная на мою, а не сначала моя функция ReadFile отрабатывает, потом оригинал.... Думаю здесь что-то не так в перехвате, не может перехват таким образом работать, это очень не полезно!!
PM MAIL   Вверх
freezeman
Дата 12.5.2012, 08:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 21.1.2011

Репутация: нет
Всего: нет



Вынесу в отдельную тему сюда (( а то первоначально была о другом ...
PM MAIL   Вверх
feodorv
Дата 12.5.2012, 09:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 9
Всего: 45



Цитата(freezeman @  12.5.2012,  08:49 Найти цитируемый пост)
Здесь вызывается оригинальная функция, если файл, с которого происходит чтение, не найден в проекции.

А где return значения, которое возвращается из оригинальной функции? Или всё равно, что она вернула? Тогда какое возвращаемое значение уйдёт пользователю из MyReadFile? Компилятор разве не вопит, что не все "control paths return a value"?


Так же важный вопрос:
Цитата(feodorv @  12.5.2012,  00:22 Найти цитируемый пост)
Цитата(freezeman @  11.5.2012,  21:04 Найти цитируемый пост)
                    shift = 0;

Всегда? 



Цитата(freezeman @  12.5.2012,  08:49 Найти цитируемый пост)
к файлу на диске проекция не привязана...

Что ж... Тут я не советчик...


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
freezeman
Дата 12.5.2012, 10:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 21.1.2011

Репутация: нет
Всего: нет



Цитата

А где return значения, которое возвращается из оригинальной функции? Или всё равно, что она вернула? Тогда какое возвращаемое значение уйдёт пользователю из MyReadFile? Компилятор разве не вопит, что не все "control paths return a value"?

Не вопит, я проверял и так: return RealReadFile...

Цитата

shift = 0; 
Всегда?

Нет, если режим Overlapped, то получаем смещение.

Это сообщение отредактировал(а) freezeman - 12.5.2012, 11:03
PM MAIL   Вверх
feodorv
Дата 12.5.2012, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 9
Всего: 45



Цитата(freezeman @  12.5.2012,  11:14 Найти цитируемый пост)
Не вопит, я проверял и так: return RealReadFile...

Странный, однако, у Вас компилятор. Обязательно нужно return RealReadFile...


Цитата(freezeman @  12.5.2012,  11:14 Найти цитируемый пост)
если режим Overlapped, то получаем смещение. 

А если не Overlapped, то смещение всегда 0???


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
freezeman
Дата 12.5.2012, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 21.1.2011

Репутация: нет
Всего: нет



Цитата

Странный, однако, у Вас компилятор. Обязательно нужно return RealReadFile...

да, это правильно.

Цитата

А если не Overlapped, то смещение всегда 0???

Ну я думаю, что да. Неправильно?

По поводу перехвата ReadFile... Я выяснил, что считывание происходит через так называемую прослойку ntdll.dll, поэтому и перехват был некорректный...

Это сообщение отредактировал(а) freezeman - 12.5.2012, 14:27
PM MAIL   Вверх
xvr
Дата 12.5.2012, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



Цитата(freezeman @  12.5.2012,  14:27 Найти цитируемый пост)
Ну я думаю, что да. Неправильно?

Разумеется неправильно, о чем я вам уже неоднократно писал  smile 
PM MAIL   Вверх
freezeman
Дата 12.5.2012, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 21.1.2011

Репутация: нет
Всего: нет



Цитата(xvr @ 12.5.2012,  16:04)
Цитата(freezeman @  12.5.2012,  14:27 Найти цитируемый пост)
Ну я думаю, что да. Неправильно?

Разумеется неправильно, о чем я вам уже неоднократно писал  smile

Ахха)) Значит я неправильно понял))
PM MAIL   Вверх
feodorv
Дата 12.5.2012, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 9
Всего: 45



Цитата(freezeman @  12.5.2012,  15:27 Найти цитируемый пост)
Неправильно?

Неправильно. Нужно узнать смещение из описателя файла (пользуясь функцией SetFilePointer) smile 

Цитата(freezeman @  12.5.2012,  15:27 Найти цитируемый пост)
поэтому и перехват был некорректный...

Удалось исправить?


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
freezeman
Дата 12.5.2012, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 21.1.2011

Репутация: нет
Всего: нет



Цитата

Удалось исправить?

Нет, но я знаю как... пока времени нет на исправление

Цитата

Неправильно. Нужно узнать смещение из описателя файла (пользуясь функцией SetFilePointer)

Спасибо, попробую...
Нужно узнать смещение и исходя из него считывать (позиция будет в мой shift записана), так?
PM MAIL   Вверх
feodorv
Дата 12.5.2012, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 9
Всего: 45



Цитата(freezeman @  12.5.2012,  17:25 Найти цитируемый пост)
Нужно узнать смещение и исходя из него считывать (позиция будет в мой shift записана), так? 

Конечно. Аналогично Overlapped, только придётся повозиться, чтобы узнать смещение...

Цитата(freezeman @  12.5.2012,  17:25 Найти цитируемый пост)
но я знаю как...

Когда исправишь, напиши, что и как исправил, ладно?


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
freezeman
Дата 12.5.2012, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 21.1.2011

Репутация: нет
Всего: нет



Цитата

Когда исправишь, напиши, что и как исправил, ладно?

Ок, обязательно. 

Спасибо за помощь.
PM MAIL   Вверх
GremlinProg
Дата 14.5.2012, 08:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(feodorv @  12.5.2012,  18:07 Найти цитируемый пост)
Неправильно. Нужно узнать смещение из описателя файла (пользуясь функцией SetFilePointer)  

Цитата(freezeman @  12.5.2012,  18:25 Найти цитируемый пост)
Нужно узнать смещение и исходя из него считывать (позиция будет в мой shift записана), так?

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

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

следует для каждой нити использовать уникальный файловый указатель (переменную) и на него опираться при расчете смещения в проекции для операции чтения,
так что поддержу скорее xvr

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


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
freezeman
Дата 14.5.2012, 09:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 21.1.2011

Репутация: нет
Всего: нет



Цитата

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

Получить значение shift с помощью SetFilePointer и затем прибавить к lpNumberOfBytesRead? Так заработет?
PM MAIL   Вверх
GremlinProg
Дата 14.5.2012, 09:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(freezeman @  14.5.2012,  11:25 Найти цитируемый пост)
Получить значение shift с помощью SetFilePointer и затем прибавить к lpNumberOfBytesRead? Так заработет?

нет, не заработает

надо на всякий CreateFile создавать уникальный ресурс, который будет хранить файловый указатель (изначально инициируемый в 0) и указатель на проекцию этого файла

а при всяком чтении - обращаться к этому ресурсу, определяя, какая для него текущая позиция,
SetFilePointer тут вообще не пригодится, по моему


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
feodorv
Дата 14.5.2012, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 9
Всего: 45



Цитата(GremlinProg @  14.5.2012,  09:29 Найти цитируемый пост)
сильно сомневаюсь, что это правильный путь, т.к. в теории, такая проекция файла может кешировать данные между потоками и процессами,
ну раз эмулируется повторное открытие файла - точно, ситуация может сложиться такая, что в нескольких нитях один и тот же файл будет читаться параллельно

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

Добавлено @ 10:53
Цитата(freezeman @  14.5.2012,  10:25 Найти цитируемый пост)
Получить значение shift с помощью SetFilePointer и затем прибавить к lpNumberOfBytesRead?

Думаю, это значение потом нужно засунуть обратно в файловый описатель...

Это сообщение отредактировал(а) feodorv - 14.5.2012, 10:53


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
freezeman
Дата 14.5.2012, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 21.1.2011

Репутация: нет
Всего: нет



Скорее всего я что-то не допоминаю... У меня есть спроецированное содержимое файла, т.е. я сначала считал файл, а потом поместил считанные данные в проекцию.
При считывании не с ЖД, мне кажется, что если получить текущую файловую позицию, начиная с неё заполнить буфер, а потом сместить указатель должно заработать. Разве нет?
(на мое видение решения проблемы повлиял xvr)
PM MAIL   Вверх
GremlinProg
Дата 14.5.2012, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(feodorv @  14.5.2012,  12:50 Найти цитируемый пост)
но сам файловый описатель не разделяется между процессами (даже при наследовании), а следовательно и файловый указатель

как-то не задумывался, если честно )

как и не особо задумывался над вопросом: "как же тогда MapViewOfFile считывает данные из файла, если не через тот же самый ReadFile?"
по моему, если дескриптор отдан в CreateFileMapping то о файловой позиции в нем можно уже забыть,

так или иначе, опираться на этот дескриптор для получения позиции бессмысленно
Цитата(feodorv @  14.5.2012,  12:50 Найти цитируемый пост)
Указанная проблема, на мой взгляд, актуальна лишь в рамках одного процесса, и может быть устранена применением именованного мьютекса...

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

задача должна быть прозрачной


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
feodorv
Дата 14.5.2012, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 9
Всего: 45



Цитата(GremlinProg @  14.5.2012,  12:57 Найти цитируемый пост)
как и не особо задумывался над вопросом: "как же тогда MapViewOfFile считывает данные из файла, если не через тот же самый ReadFile?"
по моему, если дескриптор отдан в CreateFileMapping то о файловой позиции в нем можно уже забыть,

Это да. Но у меня такое впечатление, что мы говорим о разном. smile 

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

Перехватываться detours'ом при этом будут запросы на чтение файла в пользовательском режиме (никак не в режиме ядра). А MapViewOfFile вместе с остальной механикой будет ссылаться на системные вызовы, не затрагивая вызов ReadFile с тем же описателем файла. Поэтому все манипуляции пользователя с файловой проекцией того файла, который обслуживается freezeman'ом, пройдут для него незамеченными (мимо изобретаемого им механизма). И никакого указателя...

Добавлено через 1 минуту и 14 секунд
Цитата(GremlinProg @  14.5.2012,  12:57 Найти цитируемый пост)
один процесс ничего не знает о проекции и о том, что файл, который он только что открыл, тут же вполне может открть другой процесс,
так что мьютекс - конечно хорош, но о том что он нужен при проекции, готовые приложения еще не знают, и не должны знать, по большому счету

Мьютекс, конечно, имелся в виду, исключительно в ведении freezeman...


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
freezeman
Дата 14.5.2012, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 21.1.2011

Репутация: нет
Всего: нет



Цитата

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

Имменно так)

Цитата

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


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

Это сообщение отредактировал(а) freezeman - 14.5.2012, 12:29
PM MAIL   Вверх
GremlinProg
Дата 14.5.2012, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(feodorv @  14.5.2012,  14:23 Найти цитируемый пост)
Если я правильно понял задачу, то freezeman хочет создать разделяемую между процессами именованную файловую проекцию в файле подкачки (то есть даже не связанную с конкретным файлом на диске), в которой будет находится этакая база данных избранных файлов вместе с их содержимым. Содержимое файлов будет грубо скопировано в эту память и никак не привязано к реальным файлам.Перехватываться detours'ом при этом будут запросы на чтение файла в пользовательском режиме (никак не в режиме ядра). А MapViewOfFile вместе с остальной механикой будет ссылаться на системные вызовы, не затрагивая вызов ReadFile с тем же описателем файла. Поэтому все манипуляции пользователя с файловой проекцией того файла, который обслуживается freezeman'ом, пройдут для него незамеченными (мимо изобретаемого им механизма). И никакого указателя...

а зачем в таком случае вообще открывать файл?
если все файлы уже в памяти, достаточно просто ресурса, который будет ссылаться на нужную проекцию и все, о файлах можно забыть,правда такое решение уже есть, это RAM-диск

я в принципе смотрю по совокупности тем freezeman'а,
он же изначально хотел кешировать именно вызовы на чтение данных, а не в целом - файлов
Цитата(feodorv @  14.5.2012,  14:23 Найти цитируемый пост)
Это да. Но у меня такое впечатление, что мы говорим о разном.  

выходит так


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
freezeman
Дата 14.5.2012, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 21.1.2011

Репутация: нет
Всего: нет



Цитата

он же изначально хотел кешировать именно вызовы на чтение данных, а не в целом - файлов

Я собирал статистику по обращениям к файлам, затем кэшировал файлы исходя из этой статистики.

Цитата

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

Можно подробнее?
PM MAIL   Вверх
feodorv
Дата 14.5.2012, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 9
Всего: 45



Цитата(GremlinProg @  14.5.2012,  13:34 Найти цитируемый пост)
а зачем в таком случае вообще открывать файл?
если все файлы уже в памяти, достаточно просто ресурса, который будет ссылаться на нужную проекцию и все, о файлах можно забыть,правда такое решение уже есть, это RAM-диск

Видимо, задача стоИт написать всё самому. Detours - слишком слабое для этой цели средство, но оно доступно, писать соответствующие драйверы не нужно, поэтому и CreateFile, ReadFile и так по порядку...


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
freezeman
Дата 14.5.2012, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 21.1.2011

Репутация: нет
Всего: нет



Цитата(feodorv @ 14.5.2012,  13:01)
Цитата(GremlinProg @  14.5.2012,  13:34 Найти цитируемый пост)
а зачем в таком случае вообще открывать файл?
если все файлы уже в памяти, достаточно просто ресурса, который будет ссылаться на нужную проекцию и все, о файлах можно забыть,правда такое решение уже есть, это RAM-диск

Видимо, задача стоИт написать всё самому. Detours - слишком слабое для этой цели средство, но оно доступно, писать соответствующие драйверы не нужно, поэтому и CreateFile, ReadFile и так по порядку...

Это все слишком для моих целей... не успею по срокам, все почти готово, как-то работает, осталось заполнить этот буфер, чтобы чтение происходило) А потом уже все перепишу, если потребуется...
PM MAIL   Вверх
xvr
Дата 14.5.2012, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



Цитата(freezeman @  14.5.2012,  11:02 Найти цитируемый пост)
При считывании не с ЖД, мне кажется, что если получить текущую файловую позицию, начиная с неё заполнить буфер, а потом сместить указатель должно заработать. Разве нет?

Угу, но как говорится 'дьявол кроется в деталях'  smile Все зависит от того, в какую программу вы это все внедряете. Если в совершенно произвольную, то вам придется самому проэмулировать всю работу с файлом. Для этого придется устроить у себя функциональную копию файлового дескриптора (вместе с позицией файла), затем перехватить все вызовы, которые могут работать с файловыми HANDLE'ами, и [возможно] отработать их самому. А это гораздо, нет ГОРАЗДО, нет ГОРАЗДО больше, чем простой перехват ReadFile  smile 

PM MAIL   Вверх
freezeman
Дата 14.5.2012, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 21.1.2011

Репутация: нет
Всего: нет



Цитата(xvr @ 14.5.2012,  13:47)
Цитата(freezeman @  14.5.2012,  11:02 Найти цитируемый пост)
При считывании не с ЖД, мне кажется, что если получить текущую файловую позицию, начиная с неё заполнить буфер, а потом сместить указатель должно заработать. Разве нет?

Угу, но как говорится 'дьявол кроется в деталях'  smile Все зависит от того, в какую программу вы это все внедряете. Если в совершенно произвольную, то вам придется самому проэмулировать всю работу с файлом. Для этого придется устроить у себя функциональную копию файлового дескриптора (вместе с позицией файла), затем перехватить все вызовы, которые могут работать с файловыми HANDLE'ами, и [возможно] отработать их самому. А это гораздо, нет ГОРАЗДО, нет ГОРАЗДО больше, чем простой перехват ReadFile  smile

Вот спасибо, вы меня "обрадовали")
PM MAIL   Вверх
freezeman
Дата 14.5.2012, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 21.1.2011

Репутация: нет
Всего: нет



Если получить файловую позицию, а после заполнения буфера сместить её с помощью lseek? Так должно работать если не учитывать все описанные детали?

PM MAIL   Вверх
feodorv
Дата 14.5.2012, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 9
Всего: 45



Цитата(freezeman @  14.5.2012,  16:40 Найти цитируемый пост)
Если получить файловую позицию, а после заполнения буфера сместить её с помощью lseek?

А что, lseek уже с HANDLE работает?

Цитата(freezeman @  14.5.2012,  16:40 Найти цитируемый пост)
Так должно работать если не учитывать все описанные детали?

Если глаза на всё закрывать всё плотнее и плотнее, то да, сработает))) Смелее!


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.1242 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.