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

Вниз

ERROR_MR_MID_NOT_FOUND и как с ней бороться ?   Найти похожие ветки 

 
Riply ©   (2007-04-27 02:06) [0]

Здравствуйте !
В последнее время, GetLastError повадился часто выдавать САБЖ - ую ошибку:
"The system cannot find message text for message number 0x%1 in the message file for %2."
(Наверное, ему просто лень искать :)
Причем после простейших операций типа: GetOverlappedResult, ReadFileEx и т.п.
Подскажите, пожалуйста, с чем это может быть связано и как бороться ?


 
Германн ©   (2007-04-27 02:21) [1]

А Гугль что говорит по этому поводу?
Если уж ты перешла от learn к ripe, то должна научиться пользоваться поисковиками. :)


 
{RASkov} ©   (2007-04-27 02:50) [2]

http://megalib.com/books/26/appx/appx1.htm


 
Riply ©   (2007-04-27 02:50) [3]

> [1] Германн ©   (27.04.07 02:21)
А Гугл выдает какие-то странные советы типа:
ERROR_MR_MID_NOT_FOUND
This is a misleading error because the kernel driver error
is STATUS_ILL_FORMED_SERVICE_ENTRY which exactly describes the problem:
A registry entry of Direct I/O is damaged.
But Microsoft didn"t manage to translate this error to user mode.
Solution: Reinstall Direct I/O.

Что-то такие советы мне не совсем понятны и совсем не нравяться :)


 
Riply ©   (2007-04-27 02:57) [4]

>[2] {RASkov} ©   (27.04.07 02:50)
>http://megalib.com/books/26/appx/appx1.htm
Спасибо, конечно, но перевести эту строчку:
"The system cannot find message text for message" на русский я и так была в состоянии :)


 
Riply ©   (2007-04-27 03:08) [5]

>[0] Riply ©   (27.04.07 02:06)
Наверное, я опять плохо объяснила :(
Меня интересует почему, вместо "нормальных" ошибок (типа ERROR_INVALID_HANDLE)
по которым понятно "что не так",
GetLastError часто стал возвращать именно ее ?


 
Джо ©   (2007-04-27 03:15) [6]

> [5] Riply ©   (27.04.07 03:08)
> GetLastError часто стал возвращать именно ее ?

А вообще контекст действий-то какой?


 
{RASkov} ©   (2007-04-27 03:21) [7]

> [5] Riply ©   (27.04.07 03:08)
> Меня интересует почему, вместо "нормальных" ошибок (типа ERROR_INVALID_HANDLE)
> по которым понятно "что не так",
> GetLastError часто стал возвращать именно ее ?

Ну так может это как раз то:

> ERROR_MR_MID_NOT_FOUND
> This is a misleading error because the kernel driver error
> is STATUS_ILL_FORMED_SERVICE_ENTRY which exactly describes the problem:
> A registry entry of Direct I/O is damaged.
> But Microsoft didn"t manage to translate this error to user mode.
> Solution: Reinstall Direct I/O.


 
Riply ©   (2007-04-27 03:45) [8]

> [6] Джо ©   (27.04.07 03:15)
>А вообще контекст действий-то какой?
Общаются клиент и сервер при помощи ReadFile(Ex), WriteFile(Ex) и BindIoCompletionCallback.
GetLastError стал возвращать эту ошибку после вызова различных функций, например после вызова ReadFileEx
пытаюсь получить ошибку ERROR_MORE_DATA, а получаю САБЖ. Также это бывает и после вызова GetOverlappedResult


 
Riply ©   (2007-04-27 03:49) [9]

>[7] {RASkov} ©   (27.04.07 03:21)
>Ну так может это как раз то:
This is a misleading error because the kernel driver error
is STATUS_ILL_FORMED_SERVICE_ENTRY which exactly describes the problem:
A registry entry of Direct I/O is damaged.
But Microsoft didn"t manage to translate this error to user mode.
Solution: Reinstall Direct I/O.
Вот это "мне не совсем понятно и совсем не нравяться" :)
Можно "на пальцах" объяснить "что это еще за чертовщина" ? :)


 
Сергей М. ©   (2007-04-27 08:46) [10]


> Riply ©   (27.04.07 03:45) [8]


ПРиведи реальный фрагмент кода, где происходит сабж ..


 
Игорь Шевченко ©   (2007-04-27 10:29) [11]


> В последнее время, GetLastError повадился часто выдавать
> САБЖ - ую ошибку:
> "The system cannot find message text for message number
> 0x%1 in the message file for %2."


Наверное у тебя в программе ошибка


 
Riply ©   (2007-04-27 12:46) [12]

>[10] Сергей М. © (27.04.07 08:46)
>ПРиведи реальный фрагмент кода, где происходит сабж ..
function TChannel._ReadPipeEx(const pData: PByte; const cbData: DWord;
                             const pCallBack: FARPROC; var ReadErr: DWord): Boolean;
var
AddedSize: DWord;
begin
if ReadFileEx(FhPipe, pData, cbData, @FOverLapRead, pCallBack)
 then
  begin
   ReadErr := GetLastError;
   Post_PipeError(ReadErr, "TChannel._ReadPipeEx--->ReadFileEx--->True");
   if ReadErr = ERROR_MORE_DATA then
    begin// ни разу сюда не попала, хотя и отправляла заведомо больший объем данных
     if PeekNamedPipe(FhPipe, nil, 0, nil, nil, @AddedSize) then
      begin
       // Здесь планирую разбираться с "лишними данными"
      end
     else
      begin
       ReadErr := GetLastError;
       Post_PipeError(ReadErr, "TChannel._ReadPipeEx--->PeekNamedPipe");
      end;
    end;
   ReadErr := ERROR_SUCCESS;// Временная мера из-за ERROR_MR_MID_NOT_FOUND
  end
 else ReadErr := GetLastError;
Result := IsErrorOverlapped(ReadErr);
if not Result then
 begin
  FLastErr := ReadErr;
  SetLastCallBackEvent(True);
 end
else inc(FRequest);
end;


>[11] Игорь Шевченко © (27.04.07 10:29)
>Наверное у тебя в программе ошибка
:)
А можно хотя бы намек на тип ошибки, которую надо искать и
которая себя проявляет столь необычным образом :)


 
Сергей М. ©   (2007-04-27 13:11) [13]


> Riply ©   (27.04.07 12:46) [12]


Вот твоя "засада":

if ReadFileEx(..) then
  begin // <- функция ReadFileEx выполнена успешно
     ReadErr := GetLastError; <- о каком же коде какой ошибки при этом может идти речь ?


 
Сергей М. ©   (2007-04-27 13:25) [14]

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


 
Игорь Шевченко ©   (2007-04-27 13:26) [15]

Сергей М. ©   (27.04.07 13:11) [13]


> if ReadFileEx(..) then
>   begin // <- функция ReadFileEx выполнена успешно
>      ReadErr := GetLastError; <- о каком же коде какой ошибки
> при этом может идти речь ?


"When using ReadFileEx you should check GetLastError even when the function returns "success" to check for conditions that are "successes" but have some outcome you might want to know about. For example, a buffer overflow when calling ReadFileEx will return TRUE, but GetLastError will report the overflow with ERROR_MORE_DATA. If the function call is successful and there are no warning conditions, GetLastError will return ERROR_SUCCESS."

(с) Platform SDK

Riply ©   (27.04.07 12:46) [12]


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


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


> В последнее время, GetLastError повадился часто выдавать
> САБЖ - ую ошибку:
> "The system cannot find message text for message number
> 0x%1 in the message file for %2."


GetLastError в принципе не может выдавать подобную ошибку, GetLastError выдает 32-х битное число, а не текст.


> ERROR_MR_MID_NOT_FOUND


Эта ошибка является внутренней ошибкой NT и связана с невозможностью преобразовать значение NTSTATUS в ошибку Win32.


 
Riply ©   (2007-04-27 13:27) [16]

> [13] Сергей М. © (27.04.07 13:11)
>Вот твоя "засада":
>if ReadFileEx(..) then
>begin // <- функция ReadFileEx выполнена успешно
>ReadErr := GetLastError; <- о каком же коде какой ошибки при этом может идти речь ?
Я, как прилежный и старательный ученик, делаю все "по Help"у" :)
"When using ReadFileEx you should check GetLastError even when the function returns "success"
to check for conditions that are "successes" but have some outcome you might want to know about.
For example, a buffer overflow when calling ReadFileEx will return TRUE,
but GetLastError will report the overflow with ERROR_MORE_DATA.
If the function call is successful and there are no warning conditions,
GetLastError will return ERROR_SUCCESS."


 
Riply ©   (2007-04-27 13:38) [17]

>[14] Сергей М. ©   (27.04.07 13:25)
>Кстати, тебе на заметку - начиная с Vista и Longhorn появилась оч полезная ф-ция CancelIoEx, позволяющая >потоку прерывать и синхронные и асинхронные операции ввода-вывода, стартованные в других потоках тек.процесса. >Отныне можно не заморачиваться асинхронными пайп-операциями.
Я на Visty, пока еще не накопила:)
А кто такой "Longhorn" ?


 
Riply ©   (2007-04-27 13:45) [18]

>[15] Игорь Шевченко © (27.04.07 13:26)
>Ты не привела код, где возникает указанная тобой ошибка, разве я могу сказать, где надо искать ?
Она возникает после ReadFileEx, когда он возвращает True.
>GetLastError в принципе не может выдавать подобную ошибку,
>GetLastError выдает 32-х битное число, а не текст.
:) Ну я просто привела ее описание(чтобы не надо было искать)
>> ERROR_MR_MID_NOT_FOUND
>Эта ошибка является внутренней ошибкой NT и связана с
>невозможностью преобразовать значение NTSTATUS в ошибку Win32.
И что же надо умудрится натворить, чтобы она стала появляться ?


 
Игорь Шевченко ©   (2007-04-27 13:51) [19]

Riply ©   (27.04.07 13:45) [18]


> Она возникает после ReadFileEx, когда он возвращает True.


Я не увидел в коде где ты убеждаешься, что возникает именно эта ошибка


 
Riply ©   (2007-04-27 13:57) [20]

> [19] Игорь Шевченко ©   (27.04.07 13:51)
>Я не увидел в коде где ты убеждаешься, что возникает именно эта ошибка
Приношу извинения, что не пояснила смысл всех функций.
ReadErr := GetLastError;
Post_PipeError(ReadErr, "TChannel._ReadPipeEx--->ReadFileEx--->True");
Отправляет ошибку "на эран" и записывает в лог.


 
Сергей М. ©   (2007-04-27 13:59) [21]


> Riply ©   (27.04.07 13:27) [16]


> Я, как прилежный и старательный ученик, делаю все "по Help"у"


Ты замечательный ученик, но в этот раз ты, думаю, облажалась - именно в Help"е (по кр.мере - Д7) нет  такого комментария. Оной действительно имеется в соотв.топике в MSDN, но там явно указаны условия :

Server  
Requires Windows Server "Longhorn", Windows Server 2003, Windows 2000 Server, or Windows NT Server.

Ты их "соблюла" ?
Вряд ли)..


 
Riply ©   (2007-04-27 14:00) [22]

Может имеет смысл перехватить GetLastError и попробовать узнать когда эта ошибка появляется впервые ?
Или это бред "сивой кобылы" ?


 
Riply ©   (2007-04-27 14:03) [23]

> [21] Сергей М. ©   (27.04.07 13:59)
> именно в Help"е (по кр.мере - Д7) нет  такого комментария
Я это вычитала из Help"а к BDS 2006.
>Ты их "соблюла" ?
>Вряд ли)..
Пошла изучать Help :)


 
Сергей М. ©   (2007-04-27 14:06) [24]

Имеет смысл не устанавливать буферы непотребного размера)

Ориентируйся на буферы (и на кл. и на серв. стороне) размерами кратными 4k (дифолтный размер страницы), но размера, соответствующего гранулярности сегмента (по дифолту - 64к)


 
Сергей М. ©   (2007-04-27 14:07) [25]


> из Help"а к BDS 2006


За BDS2006, извини, ничего не скажу.
Тольео вплоть до Д7.


 
Игорь Шевченко ©   (2007-04-27 14:19) [26]


> Post_PipeError(ReadErr, "TChannel._ReadPipeEx--->ReadFileEx-
> -->True");
> Отправляет ошибку "на эран" и записывает в лог.


1. Код в студию.
2. Что говорит отладчик, если узнать значение переменной ReadErr перед вызовом этой процедуры ?


 
Riply ©   (2007-04-27 14:30) [27]

> [24] Сергей М. ©   (27.04.07 14:06)
>Имеет смысл не устанавливать буферы непотребного размера)
Буферы у меня - 4KB. Для получения ERROR_MORE_DATA пытаюсь отправить (MAXWORD + 1) shl 1 байт.
Считываю первые 4KB и смотрю на возвращаемую ошибку(надеясь на ERROR_MORE_DATA),
но получаю ERROR_MR_MID_NOT_FOUND :(
В Help"е у меня написано:
Requirements
Client: Included in Windows XP, Windows 2000 Professional, Windows NT Workstation,
       Windows Me, Windows 98, and Windows 95.
Server: Included in Windows Server 2003, Windows 2000 Server, and Windows NT Server.

Стоит Windows XP SP2. Ошибку ловлю на стороне клиента. Я "соблюла" условия, или я их неправильно понимаю ?


 
Сергей М. ©   (2007-04-27 14:32) [28]


> Буферы у меня - 4KB


Тогда и не пытайся читать/писать зараз более 4-х кбайт - вот и проблем не будет)


 
Riply ©   (2007-04-27 14:41) [29]

> [26] Игорь Шевченко ©   (27.04.07 14:19)
>1. Код в студию.
В коде у меня много вложенных собственно-лапно написанных функций(кирпичиков). :)
Попробую привести его в нормальный вид.
>2. Что говорит отладчик, если узнать значение переменной ReadErr перед вызовом этой процедуры ?
Сейчас посмотрю, но не понимаю какое это имеет значение. Ведь ReadErr мы получаем так:
if ReadFileEx(FhPipe, pData, cbData, @FOverLapRead, pCallBack)
then
 begin
  ReadErr := GetLastError;
  Post_PipeError(ReadErr, "TChannel._ReadPipeEx--->ReadFileEx--->True");

Если только ReadFileEx не всегда использует SetLastError


 
Игорь Шевченко ©   (2007-04-27 15:53) [30]


> Сейчас посмотрю, но не понимаю какое это имеет значение.
>  Ведь ReadErr мы получаем так:


Между тем, что показывает отладчик, и тем, что происходит в твоей (не выложенной) процедуре может быть какая-то разница. В конце концов можно сразу после получения ReadErr вывести ее значение (хоть через ShowMessage)


 
Riply ©   (2007-04-27 16:05) [31]

>[28] Сергей М. © (27.04.07 14:32)
>Тогда и не пытайся читать/писать зараз более 4-х кбайт - вот и проблем не будет)
Да-а-а, а вруг кто-то нерадивый(или злоумышленник) отправит более 4-х кбайт ?
Мне тогда вылетать с каким-нибудь AV ?  :)

>[26] Игорь Шевченко © (27.04.07 14:19)
>2. Что говорит отладчик, если узнать значение переменной ReadErr перед вызовом этой процедуры ?
Вы, впочем как и всегда, оказались правы. :)
Поднялась вверх по коду в поисках места, где впервые возникает ERROR_MR_MID_NOT_FOUND.
Добралась аж до самого начала:
while not Terminated do
 begin
  Result := CreateFile(PChar(FPipeName),
                       GENERIC_WRITE or GENERIC_READ,
                       FILE_SHARE_READ or FILE_SHARE_WRITE,
                       pSecurAttr, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0);
  if Result <> INVALID_HANDLE_VALUE then Exit;//<---!!!
  Result := 0;
  FLastErr := GetLastError;
  if FLastErr <> ERROR_PIPE_BUSY
   then Exit
   else
    if WaitNamedPipe(PChar(FPipeName), FDefaultTimeOut) then Continue;
  FLastErr := GetLastError;
 end;
На строчке, помеченной "!!!"  я выхожу не инициализируя FLastErr.
Потом (спустя некоторое время) пытаюсь получить SysErrorMessage(FLastErr)
и забиваю значение GetLastError-а сабжевой ошибкой,
которая успешно сохраняется до вызова ReadFileEx :)
Всем огромное спасибо !
P.S. Значит, анализируя GetLastError после ReadFileEx, надо учитывать,
что эта функция может и не менять LastError, если возвращает True :)
Что не есть, imho, правильно. А вдруг LastError до нее имеет значение ERROR_MORE_DATA ?


 
clickmaker ©   (2007-04-27 16:32) [32]


> анализируя GetLastError после ReadFileEx, надо учитывать,
>
> что эта функция может и не менять LastError, если возвращает
> True

можно перед ReadFileEx сказать SetLastError(ERROR_SUCCESS)


 
Сергей М. ©   (2007-04-27 16:35) [33]


> Riply ©   (27.04.07 16:05) [31]


Ах ты ж горемычная наша !)

Ты ж, разумеется, не в состоянии запросить N раз по не более чем K байт, вместо требования "дай мне сразу все N * M байт"


 
Игорь Шевченко ©   (2007-04-27 16:43) [34]

Riply ©   (27.04.07 16:05) [31]

Never attribute to malice which can be adequately explained by stupidity.

Без обид, ничего личного :)


 
Игорь Шевченко ©   (2007-04-27 16:47) [35]


> Значит, анализируя GetLastError после ReadFileEx, надо учитывать,
>  
> что эта функция может и не менять LastError, если возвращает
> True :)


Если MS рекомендует вызывать GetLastError при любом значении,возвращаемом функцией ReadFileEx, значит эта функция всегда устанавливает LastError

Проверить впрочем дело 2-х минут:

SetLastError(66666666);
ReadFileEx (.....)
ShowMessageFmt("%d", [GetLastError]);


 
Сергей М. ©   (2007-04-27 16:48) [36]

Ну вот и Игорь не выдержал)


 
Riply ©   (2007-04-27 17:11) [37]

>[33] Сергей М. © (27.04.07 16:35)
>Ах ты ж горемычная наша !)
"горемычной" я была, пока не понимала в чем дело.
Теперь "не горемычная" до следующей ошибки :)

> [34] Игорь Шевченко © (27.04.07 16:43)
>Без обид, ничего личного :)
Какие могут быть обиды - абсолютно верное утверждение :)

>[32] clickmaker © (27.04.07 16:32)
>можно перед ReadFileEx сказать SetLastError(ERROR_SUCCESS)
Как все просто, а я уж собралась анализировать LastError и перед ReadFileEx :)


 
Riply ©   (2007-04-27 17:13) [38]

>[35] Игорь Шевченко ©   (27.04.07 16:47)
>Проверить впрочем дело 2-х минут:
Пойду проверять еще раз.


 
Riply ©   (2007-04-27 17:23) [39]

Проверила:
SetLastError(666);
if ReadFileEx(FhPipe, pData, cbData, @FOverLapRead, pCallBack)
then
 begin
  ReadErr := GetLastError;
  ShowMessage(IntToStr(ReadErr));

Показывает "666"


 
Игорь Шевченко ©   (2007-04-27 17:26) [40]


> Показывает "666"


Значит использовать совет [32]



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

Форум: "Начинающим";
Текущий архив: 2007.05.20;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.57 MB
Время: 0.046 c
15-1176839735
Чапаев
2007-04-17 23:55
2007.05.20
PL/SQL. Что почитать?


2-1177586261
allucard
2007-04-26 15:17
2007.05.20
Как напечатать форму, не открывая её полностью?


3-1171964797
Megabyte
2007-02-20 12:46
2007.05.20
MySQL и PHP, работа с датой/временем


2-1178272434
ppcumax
2007-05-04 13:53
2007.05.20
Загрузка рисунка


15-1176436333
MBo
2007-04-13 07:52
2007.05.20
Пятничные задачки. Вася Пупкин returns...





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский