Ситуация следующая.
Открываем файла, создаем маппинг CreateFileMapping() этого файла
далее файл сносим на уровне OS, далее маппим кусок файла на память
MapViewOfFile(), при этом указатель получаем не NULL, но он ссылается на чужую память
и при копировании этой памяти в другую CopyMemory() получаем зависание.
Вопрос.
Как проверить указатель который получаем в рез-те выполнения MapViewOfFile().
На NULL не пойдет ,т.к. он не NULL.
Проверять корректность HANDLE файла не пойдет.
21.09.05 17:12: Перенесено модератором из 'C/C++' — Павел Кузнецов
Здравствуйте, 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) Козьма Прутков
Здравствуйте, bviktor, Вы писали:
B>Ситуация следующая. B>Открываем файла, создаем маппинг CreateFileMapping() этого файла B>далее файл сносим на уровне OS, далее маппим кусок файла на память B>MapViewOfFile(), при этом указатель получаем не NULL, но он ссылается на чужую память B>и при копировании этой памяти в другую CopyMemory() получаем зависание. B>Вопрос. B>Как проверить указатель который получаем в рез-те выполнения MapViewOfFile(). B>На NULL не пойдет ,т.к. он не NULL. B>Проверять корректность HANDLE файла не пойдет.
открывать файл с эксклюзивными правами, чтобы нельзя было удалить
Здравствуйте, sadomovalex, Вы писали:
S>Здравствуйте, bviktor, Вы писали:
B>>Ситуация следующая. B>>Открываем файла, создаем маппинг CreateFileMapping() этого файла B>>далее файл сносим на уровне OS, далее маппим кусок файла на память B>>MapViewOfFile(), при этом указатель получаем не NULL, но он ссылается на чужую память B>>и при копировании этой памяти в другую CopyMemory() получаем зависание. B>>Вопрос. B>>Как проверить указатель который получаем в рез-те выполнения MapViewOfFile(). B>>На NULL не пойдет ,т.к. он не NULL. B>>Проверять корректность HANDLE файла не пойдет.
S>открывать файл с эксклюзивными правами, чтобы нельзя было удалить
Отвалиться модет если сдох винт на котором он валяется.
Нет так и задумано, что файл может отвалиться, мне нужно проверить именно
что файл отвалился и маппинг на память прошел, но указатель на память "плохой".
Здравствуйте, 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");
...добивая ногами психиатра: "Это кто нервный?! Это я нервный?!!"
Здравствуйте, 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