Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2005.02.13;
Скачать: [xml.tar.bz2];

Вниз

Неправильные параметры при вызове WinApi функций   Найти похожие ветки 

 
Piter ©   (2005-01-21 23:57) [0]

Мне вот что интересно. Не знаю как в 9x, но в NT некоторые области ВАП процесса заблокированы для чтения/записи самим процессом. Например, явно защищена таблица описателей.

Так вот, что будет, если в качестве параметра в WinApi функцию передать адрес этой области как буфер для записи? Что сделает функция?

Есть ли такие функции, которые записывают в каком-нибудь другом режиме привелегий? Ведь тогда они смогут перезаписать эту системную область? Я думаю этого не должно произойти...

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


 
Nous Mellon ©   (2005-01-22 00:04) [1]


> ибо не знаю как определить адрес той же самой таблицы описателей...

Руссиновича так и не нашел, а то там было по-моему? С уверенностью говорить не могу ибо мозги затуманены прошедшей сессией.


 
AlterEgo of WondeRu ©   (2005-01-22 00:18) [2]

Piter ©   (21.01.05 23:57)
Так вот, что будет, если в качестве параметра в WinApi функцию передать адрес этой области как буфер для записи? Что сделает функция?


тупо!


 
Piter ©   (2005-01-22 01:15) [3]

Nous Mellon ©   (22.01.05 0:04) [1]
Руссиновича так и не нашел, а то там было по-моему?


нет, не нашел. То есть, даже в общем и не искал, тоже времени не особо. И денег нету к тому же :(


 
Piter ©   (2005-01-22 01:16) [4]

AlterEgo of WondeRu ©   (22.01.05 0:18) [2]
тупо


что тупо?


 
AlterEgo of WondeRu ©   (2005-01-22 01:23) [5]

Piter ©   (22.01.05 1:16) [4]
что тупо?


"все тупо" (с) Керк

AV будет по любому!!!


 
Piter ©   (2005-01-22 01:34) [6]

AlterEgo of WondeRu ©   (22.01.05 1:23) [5]
AV будет по любому!!!


AV? :))))
Да неужто? Прямо таки и вылезет исключение Access Violation, да?


 
AlterEgo of WondeRu ©   (2005-01-22 01:38) [7]

Piter ©   (22.01.05 1:34) [6]
AV? :))))
Да неужто? Прямо таки и вылезет исключение Access Violation, да?


Систему по С2 лохи сертифицировали, да?


 
Просто Джо ©   (2005-01-22 02:28) [8]

AlterEgo of WondeRu ©   (22.01.05 01:38) [7]

Вот это тупо.


 
Piter ©   (2005-01-22 02:50) [9]

AlterEgo of WondeRu ©   (22.01.05 1:38) [7]
Систему по С2 лохи сертифицировали, да?


сколько умных слов...

Вообщем, могу тебя заверить, что AV не выскочит, если ты вообще понимаешь что такое AV.


 
jack128 ©   (2005-01-22 02:55) [10]

Piter ©   (21.01.05 23:57)
А что тогда вернет WinApi функция или GetLastError, что неправильный указатель?


С чего AV должно возникныть я не понял, но по идее ERROR_ACCESS_DENIED ...


 
GuAV ©   (2005-01-22 03:14) [11]

GetWindowRect(Handle, TRect(Pointer(0)^)); - ничего
GetSystemTime(TSystemTime(Pointer($88888888)^)); - ошибка 87 - параметр задан неверо
GetMessage(TMsg(Pointer(1312321)^),0,0,0) - Программа PROJECT2 вызвала сбой при обращении к странице памяти ...

GetWindowRect(Handle, TRect(Pointer($88888888)^)); -  тупо вылетает

GetVersionEx(TOSVersionInfo(Pointer($88888888)^));
А тут уже AV, как и ожидалось

Короче, самая разная реакция.

PS: w98


 
jack128 ©   (2005-01-22 03:37) [12]

GuAV ©   (22.01.05 3:14) [11]
лудше создай read only mmf и на нем тестируй..  У меня, например (win2k), если на GetMessage подать nil - AV, а если read only mmf, то ERROR_NOACCESS


 
jack128 ©   (2005-01-22 03:39) [13]

Что в общем то логично -)  Правда на GetWindowRect всегда AV вылетает..


 
Alex Konshin ©   (2005-01-22 04:22) [14]

Так ведь доступ поверяется железно, т.е. самим процессором.
На самом деле аппаратно отслеживается доступ при любой операции с памятью. Например, даже если вам разрешено куда-то писать, но на странице не стоит dirty бит, то произодет прерывание и система создаст копию страницы, поставит на ней dirty бит и подсунет вам, что вы туда писали. Именно так работает разделение системных DLL и работа с MMF.
У меня правда сейчас путаница в голове, я с Windows CE на Hitachi SH-4 ковыряюсь, могу и напутать, где как. Но даже в Windows CE на страницы можно установить права доступа и они будут соблюдаться. Те же функции Win32 API сначала работают в адресном пространстве самого процесса и в пользовательском режиме. Сначала это просто функции в некой DLL. Даже системные вызовы ядра могут исполнятся в адресном пространстве вызывающего процесса, а могут и переключится на системный процесс.

Кстати, занятно, что по крайней мере в WinCE нити пользовательских процессов могут передаваться к системным процессам. Т.е. указатель на текущую нить остается прежним, а указатель на процесс меняется на системный. То есть находясь в одной нити можно побывать в разных адресных пространствах. Для меня это было откровением. Вообще занятные вещи там можно увидеть.


 
AlterEgo of WondeRu ©   (2005-01-22 13:05) [15]

Piter ©   (22.01.05 2:50) [9]
Вообщем, могу тебя заверить, что AV не выскочит, если ты вообще понимаешь что такое AV.


см.выше)))
AV - Access Violation, частая обшибка в твоем клиенте))) но я не жалуюсь)))


 
Digitman ©   (2005-01-22 13:44) [16]


> Piter


именно AV-исключение и будет в дан.случае.
некая страница некоего региона в ВАП целевого процесса имеет некие права для доступа к ней, и ты их нарушаешь, что и приводит к исключению access violation, которое как раз и переводится ккак "попытка нарушения прав доступа"


 
GuAV ©   (2005-01-22 13:54) [17]


> лудше создай read only mmf и на нем тестируй..


Не делает разницы.

procedure TForm1.Button1Click(Sender: TObject);
var h: THandle; P: Pointer;
begin
 h := CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READONLY,
  0, 4096, nil);
 try
   P := MapViewOfFile(h, FILE_MAP_READ, 0, 0, 0);
   try
     Memo1.Lines.Add("GetVersionEx");
     Memo1.Lines.Add(BoolToStr(
       GetVersionEx(TOSVersionInfo(P^)), True));  // false
     Memo1.Lines.Add(SysErrorMessage(GetLastError)); // 0 - успешно
     with TOSVersionInfo(P^) do
       Memo1.Lines.Add(Format("%d %d %d",
         [dwMajorVersion, dwMinorVersion, dwBuildNumber])); // 0 0 0

     {
     Memo1.Lines.Add("GetWindowRect");
     Memo1.Lines.Add(BoolToStr(
     GetWindowRect(Handle, TRect(P^)), True));
     Memo1.Lines.Add(SysErrorMessage(GetLastError));
     }

     // на GetWindowRect тупо вылетает.

     {
     Application.ProcessMessages;
      PostMessage(Handle, WM_NULL, 0, 0);
      Memo1.Lines.Add(BoolToStr(GetMessage(TMsg(P^),0,0,0), True));
      }

     // Программа PROJECT1 вызвала сбой при обращении к странице памяти

     GetSystemTime(TSystemTime(P^));
     Memo1.Lines.Add(SysErrorMessage(GetLastError));

     // 87 - параметр задан неверно

   finally
     UnmapViewOfFile(P);
   end;
 finally
   CloseHandle(h);
 end;
end;


 
GuAV ©   (2005-01-22 13:55) [18]

Digitman ©   (22.01.05 13:44) [16]

Я тоже так думал, что будет AV. Но оказвается не всегда, см [17]. Счас проверю в ХР...


 
Digitman ©   (2005-01-22 14:02) [19]


> GuAV ©   (22.01.05 13:55) [18]


а ты различешь случаи тестирования данной программы автономно и подо встр.отладчиком ?


 
GuAV ©   (2005-01-22 14:11) [20]

XP ведёт себя лучше. Либо ERROR_ACCESS_DENIED = 5 либо AV.


> а ты различешь случаи тестирования данной программы
> автономно и подо встр.отладчиком ?


Этот момент сейчас проверил. Разница есть только там где под отладчиком вылетало, без него
>Программа PROJECT1 вызвала сбой при обращении к странице памяти


 
Digitman ©   (2005-01-22 14:34) [21]


> Piter



> не знаю как определить адрес той же самой таблицы описателей


на sysinternals.com ты найдешь программные примеры обращения к системным таблицам, в т.ч. и к таблицам описателей

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


 
AlterEgo of WondeRu ©   (2005-01-22 14:38) [22]

Digitman ©   (22.01.05 14:34) [21]
зачем тебе потребовалось модифицировать таблицу описателей ? если, конечно, это не чистое любопытство ..


все думает, как бы качество клиента повысить)


 
Piter ©   (2005-01-22 18:08) [23]

jack128 ©   (22.01.05 2:55) [10]
С чего AV должно возникныть я не понял


так и я не понял! Я как раз и говорю о том, что AV не будет

GuAV ©   (22.01.05 3:14) [11]

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

Короче, самая разная реакция

это зависит, видимо, от того, защищена ли эта область от чтения/записи или под эту виртуальную область вообще не выделена память

jack128 ©   (22.01.05 3:37) [12]
У меня, например (win2k), если на GetMessage подать nil - AV


эх, чувствую, что ты совершаешь ту же ошибку, что и GuAV - каким образом ты можешь вызвать GetMessage с nil?!?!?!

а если read only mmf, то ERROR_NOACCESS

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

AlterEgo of WondeRu ©   (22.01.05 13:05) [15]
AV - Access Violation, частая обшибка в твоем клиенте))) но я не жалуюсь)))


то, что ты меня пытаешься подколоть, вовсе не означает, что ты разбираешься что такое AV

Digitman ©   (22.01.05 13:44) [16]
именно AV-исключение и будет в дан.случае


ну от тебя не ожидал. Как может произойти AV при работе WinApi функций?! AV - чисто дельфовое исключение и произойти оно может только с откомпилированным Дельфовым кодом, если он обратится куда-нибудь не туда...

GuAV ©   (22.01.05 13:55) [18]
Я тоже так думал, что будет AV.


и ты туда же! Ну ПОДУМАЙ, как может произойти AV, если ошибку доступа вызывают WinApi функции?!

Digitman ©   (22.01.05 14:34) [21]
если, конечно, это не чистое любопытство


чистое любопытство

sysinternals.com ты найдешь программные примеры обращения к системным таблицам, в т.ч. и к таблицам описателей

а по конкретнее ссылочек нету?


 
Kerk ©   (2005-01-22 18:14) [24]

Piter ©   (22.01.05 18:08) [23]
ну от тебя не ожидал. Как может произойти AV при работе WinApi функций?! AV - чисто дельфовое исключение и произойти оно может только с откомпилированным Дельфовым кодом, если он обратится куда-нибудь не туда...


Да. Табличка "Access violation" не появится. Но это дела не меняет. AV может происходить независимо от ЯП.

LMD


 
AlterEgo of WondeRu ©   (2005-01-22 18:14) [25]

Piter ©   (22.01.05 18:08) [23]
то, что ты меня пытаешься подколоть, вовсе не означает, что ты разбираешься что такое AV


мало ли что может быть... гадать я не люблю, я предсказываю :)) А обижаться не стоит)))

Piter ©   (22.01.05 18:08) [23]
Как может произойти AV при работе WinApi функций?! AV - чисто дельфовое исключение и произойти оно может только с откомпилированным Дельфовым кодом, если он обратится куда-нибудь не туда...


все больше и больше узнаю об архитектуре винды... пора Рихтера в помойку выкидывать!


 
Kerk ©   (2005-01-22 18:26) [26]

Piter ©   (22.01.05 18:08) [23]
Ошибка происходит еще на стадии разыименовывания указателя

А что есть разыменование указателя? Помедитируй над этим:

mov eax,[123]

можно ли считать этот код разыменованием указателя? будет ли здесь AV?


 
Piter ©   (2005-01-22 18:37) [27]

AlterEgo of WondeRu ©   (22.01.05 18:14) [25]
мало ли что может быть... гадать я не люблю, я предсказываю


ну если ты в программировании привык гадать - мои поздравления...

AlterEgo of WondeRu ©   (22.01.05 18:14) [25]
А обижаться не стоит


а кто обижался?

пора Рихтера в помойку выкидывать

а причем здесь Рихтер? Рихтер скорее всего и не подозревает о таком типе исключения - AV

Kerk ©   (22.01.05 18:26) [26]
А что есть разыменование указателя?


чтение памяти, куда указывает этот указатель

Kerk ©   (22.01.05 18:26) [26]
Помедитируй над этим


если хочешь - сам медитируй.
А если ты не понял, что я хотел сказать - что я могу поделать?


 
Kerk ©   (2005-01-22 18:42) [28]

Так же советую тебе иногда заглядывать в MSDN.
Посмотри что МСДНу (Platform SDK: Debugging and Error Handling) известно о EXCEPTION_RECORD structure

EXCEPTION_ACCESS_VIOLATION
The thread tried to read from or write to a virtual address for which it does not have the appropriate access.


 
Piter ©   (2005-01-22 18:45) [29]

Kerk ©   (22.01.05 18:42) [28]

И что? Как связаны виндовые исключения и дельфовые?


 
Kerk ©   (2005-01-22 18:46) [30]

Piter ©   (22.01.05 18:45) [29]
Причем тут дельфовые исключения? Мы же про WinAPI говорим. Или ты не знаешь что такое MSDN и Platform SDK ?


 
begin...end ©   (2005-01-22 18:48) [31]

> [29] Piter ©   (22.01.05 18:45)

А кто говорил про дельфовые исключения?


 
Kerk ©   (2005-01-22 18:48) [32]

AV есть? есть. факт. и Рихтера зря обидел.


 
AlterEgo of WondeRu ©   (2005-01-22 18:48) [33]

Piter ©   (22.01.05 18:37) [27]
пора Рихтера в помойку выкидывать

а причем здесь Рихтер? Рихтер скорее всего и не подозревает о таком типе исключения - AV


да он вообще странный чел (Рихтер), учит тому чего сам не знает ;)


 
Piter ©   (2005-01-22 19:30) [34]

Ну я над вами фигею...

Kerk ©   (22.01.05 18:14) [24]
Да. Табличка "Access violation" не появится


Конечно, не появится.
Да только на мое замечание:

Piter ©   (22.01.05 1:34) [6]
Да неужто? Прямо таки и вылезет исключение Access Violation, да?


Мне дали понять, что типа да, так и будет.

Kerk ©   (22.01.05 18:14) [24]
LMD


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

Piter ©   (22.01.05 18:45) [29]
Причем тут дельфовые исключения?


что значит причем? Access Violation - ДЕЛЬФОВОЕ ИСКЛЮЧЕНИЕ. Модуль SysUtils:

EAccessViolation = class(EExternal);

Я не знаю почему сюда приплясали AV. Я то как раз говорил про ошибку доступа к памяти, которую могут вызвать WinApi функции, если будут обращаться к защищенным областям памяти процесса. На что МНЕ СТАЛИ ГОВОРИТЬ ОБ ИСКЛЮЧЕНИИ ACCESS VIOLATION, вероятно забыв, что AV - чисто дельфовое исключение и не может быть вызвано WinApi функциями.

Тот же GuAV приводил примеры:

GetVersionEx(TOSVersionInfo(Pointer($88888888)^));

и говорил, что здесь AV. Правильно, здесь AV, но как это связано с темой ошибкой доступа WinApi функций? Здесь AV будет и без всякой попытки вызвать WinApi Функцию GetVersionEx:

procedure TForm1.Button1Click(Sender: TObject);
var
 VI: TOSVersionInfo;
begin
 VI := TOSVersionInfo(Pointer($88888888)^); // ЗДЕСЬ БЛИН БУДЕТ AV!
 //Хотя здесь нет никакого вызова функции
end;


begin...end ©   (22.01.05 18:48) [31]
А кто говорил про дельфовые исключения?


А ты прочитай тему заново и посмотри, кто первым завел разговор про AV. Насколько я понял, AlterEgo of WondeRu завел разговор про AV и стал говорить, что они будут возникать при вызове WinApi функций. На что я стал ему доказывать, что AV НЕ МОЖЕТ возникнуть при вызове WinApi функций, потом вы подключились, пытаясь втереть мне абсолютно известные мне факты. Цитирую:

AlterEgo of WondeRu ©   (22.01.05 1:23) [5]
AV будет по любому!!!


Piter ©   (22.01.05 1:34) [6]
AV? :))))
Да неужто? Прямо таки и вылезет исключение Access Violation, да?


Piter ©   (22.01.05 2:50) [9]
Вообщем, могу тебя заверить, что AV не выскочит, если ты вообще понимаешь что такое AV


AlterEgo of WondeRu ©   (22.01.05 13:05) [15]
AV - Access Violation, частая обшибка в твоем клиенте))) но я не жалуюсь)))


Из этих цитат очевидно, что AlterEgo of WondeRu не знает что такое Access Violation и почему он возникает, раз считает что при вызове WinApi функций это исключение может появиться.

Как же задалбливает говорить одно и тоже.

Kerk ©   (22.01.05 18:48) [32]
AV есть? есть. факт


а вот еще один человек, который демонстрирует незнание того, что такое AV. Он даже не посмотрел на примеры или их не понял. Потому что там AV возникает, ДА! Но возникает НЕ ПРИ ВЫЗОВЕ WINAPI ФУНКЦИЙ.

AlterEgo of WondeRu ©   (22.01.05 18:48) [33]
да он вообще странный чел (Рихтер), учит тому чего сам не знает


мне твои потрясающие фразы уже надоели, честное слово. Если не знаешь - изучи, чего ты ссылаешься на Рихтера? Рихтер о EAccessViolation, я думаю, никогда не писал и не напишет. Твои постоянные ссылки на литературу озадачивают. Смотрю в книгу - вижу фигу?


 
AlterEgo of WondeRu ©   (2005-01-22 19:54) [35]

Piter ©   (22.01.05 19:30) [34]
Рихтер о EAccessViolation, я думаю, никогда не писал и не напишет


сейчас буду материться!!!

глава из Рихтера:
Явный вызов функции UnhandledExceptionFilter

Функция UnhandledExceptionFilter полностью задокументирована, и Вы можете сами вызывать ее в своих программах. Вот пример ее использования:

void Funcadelic()
{
__try
{
...
}
__except (ExpFltr(GetExceptionTnformation()))
{
...
}
}
LONG ExpFltr(PEXCEPTION_POINTERS pEP)
{
DWORD dwExceptionCode - pEP->ExceptionRecord.ExceptionCode;
if (dwExceptionCode == EXCEPTION_ACCESS_VIOLATION)
{
// что-то делаем здесь...
return(EXCEPTION_CONTINUE_EXFCUTION);
}
return(UnhandledExceptionFilter(pEP));
}
Исключение в блоке try функции Funcadelic приводит к вызову ExpFltr. Ей переда ется значение, возвращаемое GetExceptionlnformation. Внутри фильтра определяется код исключения и сравнивается с EXCEPTION_ACCESS_VIOLATION. Если было нару шение доступа, фильтр исправляет ситуацию и возвращает EXCEPTION_CONTI NUE_EXECUTION. Это значение заставляет систему возобновить выполнение програм мы с инструкции, вызвавшей исключение.

Если произошло какое-то другое исключение, ExpFltr вызывает UnhandledExcep tionFilter, передавая ей адрес структуры EXCEPTION_POINTERS. Функция Unhandled ExceptionFilter открывает окно, позволяющее завершить процесс или начать отладку. Ее возвращаемое значение становится и результатом функции ExpFltr.



 
AlterEgo of WondeRu ©   (2005-01-22 20:00) [36]

и еще:
Исключения, связанные с памятью
EXCEPTION_ACCESS_VIOLATION Поток пьтался считать или записать по виртуальному адресу, не имея на то необходимых прав. Это самое распрост раненное исключение.


давай прекратим А? каждый останется при своем!


 
Kerk ©   (2005-01-22 20:34) [37]

Piter ©   (22.01.05 19:30) [34]
Я не знаю почему сюда приплясали AV. Я то как раз говорил про ошибку доступа к памяти, которую могут вызвать WinApi функции, если будут обращаться к защищенным областям памяти процесса. На что МНЕ СТАЛИ ГОВОРИТЬ ОБ ИСКЛЮЧЕНИИ ACCESS VIOLATION, вероятно забыв, что AV - чисто дельфовое исключение и не может быть вызвано WinApi функциями.


Ты тупой, да? В Platform SDK оно тоже в связи с дельфями упоминается?

Умей признать свою ошибку. Смешно уже, ей богу. :)

LMD


 
Kerk ©   (2005-01-22 20:43) [38]

Piter ©   (22.01.05 19:30) [34]
ой как хочется использовать эту аббревиатуру, да? Ну прямо дайте кому-нибудь, да влепить...


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


 
AlterEgo of WondeRu ©   (2005-01-22 20:46) [39]

Kerk ©   (22.01.05 20:43) [38]
Керк, я те клаву подарю, она сразу "LMD" одной клавишей вставляет)))


 
Kerk ©   (2005-01-22 20:46) [40]

AlterEgo of WondeRu ©   (22.01.05 20:46) [39]

заметано!



Страницы: 1 2 3 вся ветка

Форум: "Потрепаться";
Текущий архив: 2005.02.13;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.58 MB
Время: 0.074 c
1-1107233486
Алексей Петухов
2005-02-01 07:51
2005.02.13
WMF PlayBack


4-1104165294
FreeFighter
2004-12-27 19:34
2005.02.13
ShellExexute


1-1106881630
gsformat
2005-01-28 06:07
2005.02.13
как отловить утечку памяти


3-1105448998
Doctor Deejay
2005-01-11 16:09
2005.02.13
Где и как прописывать алиасы при запуске на компе без Делфи


1-1106811370
s_pavell
2005-01-27 10:36
2005.02.13
Интересный модуль GraphicEx





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский