Привет очень нужна помощь
От: bviktor  
Дата: 21.09.05 08:53
Оценка:
Ситуация следующая.
Открываем файла, создаем маппинг CreateFileMapping() этого файла
далее файл сносим на уровне OS, далее маппим кусок файла на память
MapViewOfFile(), при этом указатель получаем не NULL, но он ссылается на чужую память
и при копировании этой памяти в другую CopyMemory() получаем зависание.
Вопрос.
Как проверить указатель который получаем в рез-те выполнения MapViewOfFile().
На NULL не пойдет ,т.к. он не NULL.
Проверять корректность HANDLE файла не пойдет.


21.09.05 17:12: Перенесено модератором из 'C/C++' — Павел Кузнецов
Re: На вскидку.
От: ZAMUNDA Земля для жалоб и предложений
Дата: 21.09.05 09:14
Оценка:
Здравствуйте, bviktor, Вы писали:
Я не волшебник, я тока учусь -- так шо если сламерну, простите.

B>Открываем файла, создаем маппинг CreateFileMapping() этого файла

B>далее файл сносим на уровне OS, далее маппим кусок файла на память
B>MapViewOfFile(), при этом указатель получаем не NULL, но он ссылается на чужую память
B>и при копировании этой памяти в другую CopyMemory() получаем зависание.
А если сначала MapViewOfFile, а потом сносить?

B>Вопрос.

B>Как проверить указатель который получаем в рез-те выполнения MapViewOfFile().
B>На NULL не пойдет ,т.к. он не NULL.
Посмотреть GetLastError, посмотреть что IsBadReadPtr/IsBadWritePtr скажет, посмотреть что в dwNumberOfBytesToMap записалось.
Вообщета MSDN говорит, что MapViewOfFile или вернёт чё надо или вернёт NULL. Старнно как-то...

PS: лучше это в WinAPI форуме спросить -- там по этому поводу народ по-подкованнее.
Наука изощряет ум; ученье вострит память.
(c) Козьма Прутков
Re: Привет очень нужна помощь
От: sadomovalex Россия http://sadomovalex.blogspot.com
Дата: 21.09.05 11:25
Оценка: +1
Здравствуйте, bviktor, Вы писали:

B>Ситуация следующая.

B>Открываем файла, создаем маппинг CreateFileMapping() этого файла
B>далее файл сносим на уровне OS, далее маппим кусок файла на память
B>MapViewOfFile(), при этом указатель получаем не NULL, но он ссылается на чужую память
B>и при копировании этой памяти в другую CopyMemory() получаем зависание.
B>Вопрос.
B>Как проверить указатель который получаем в рез-те выполнения MapViewOfFile().
B>На NULL не пойдет ,т.к. он не NULL.
B>Проверять корректность HANDLE файла не пойдет.

открывать файл с эксклюзивными правами, чтобы нельзя было удалить
"Что не завершено, не сделано вовсе" Гаусс
Re[2]: Привет очень нужна помощь
От: bviktor  
Дата: 21.09.05 16:56
Оценка:
Здравствуйте, sadomovalex, Вы писали:

S>Здравствуйте, bviktor, Вы писали:


B>>Ситуация следующая.

B>>Открываем файла, создаем маппинг CreateFileMapping() этого файла
B>>далее файл сносим на уровне OS, далее маппим кусок файла на память
B>>MapViewOfFile(), при этом указатель получаем не NULL, но он ссылается на чужую память
B>>и при копировании этой памяти в другую CopyMemory() получаем зависание.
B>>Вопрос.
B>>Как проверить указатель который получаем в рез-те выполнения MapViewOfFile().
B>>На NULL не пойдет ,т.к. он не NULL.
B>>Проверять корректность HANDLE файла не пойдет.

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

Отвалиться модет если сдох винт на котором он валяется.

Нет так и задумано, что файл может отвалиться, мне нужно проверить именно
что файл отвалился и маппинг на память прошел, но указатель на память "плохой".
Re[3]: Привет очень нужна помощь
От: Skipy Rich Россия  
Дата: 21.09.05 18:12
Оценка:
Здравствуйте, bviktor, Вы писали:

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

B>что файл отвалился и маппинг на память прошел, но указатель на память "плохой".

SEH
имхо, самый логичный путь.
Также можно воспользоваться функцией IsBadReadPtr — проверил при маппинге файла на CD:

    CAtlFile file;
    file.Create("G:\\autorun.inf", GENERIC_READ, FILE_SHARE_WRITE|FILE_SHARE_READ|FILE_SHARE_DELETE, OPEN_EXISTING);
    ULONGLONG len;
    file.GetSize(len);
    printf("eject disk and press enter");
    getchar();

    CAtlFileMapping<BYTE> mp;
    mp.MapFile(file);
    void *ptr = mp.GetData();
    BOOL bad = IsBadReadPtr(ptr, len);
    printf("ptr is %s\n", bad?"bad":"good");

...добивая ногами психиатра: "Это кто нервный?! Это я нервный?!!"
fb2k: Sepultura - Nomad
Re[4]: Привет очень нужна помощь
От: gear nuke  
Дата: 22.09.05 04:37
Оценка:
Здравствуйте, Skipy Rich, Вы писали:

SR>SEH

SR>имхо, самый логичный путь.
SR>Также можно воспользоваться функцией IsBadReadPtr

IsBadReadPtr в общем-то и реализована через SEH .
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.