Вопрос для Ms Rem!!!!

Тема в разделе "WASM.WIN32", создана пользователем LuckyDevil, 19 май 2005.

  1. LuckyDevil

    LuckyDevil New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2005
    Сообщения:
    278
    Адрес:
    Uzbekistan
    Ms Rem, доброго!!!

    прочитал твои статьи, хороший материал, скорей всего он будет использован мной в будущем.

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

    И так, я пытаюсь открыть файл-лог из драйвера, но не получается, ZwCreateFile возвращает этот код ERROR_PATH_NOT_FOUND, путь я задаю так

    const

    DEFAULT_LOG_FILE_NAME = '\?\C:\avsd.log';

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

    ниже код:
    Код (Text):
    1.  
    2. function DVRH_Log: Boolean;
    3. const
    4.      DEFAULT_LOG_FILE_NAME   = '\?\C:\avsd.log';
    5. var
    6.     Length: ULONG;
    7.     messagebuf: array[0..256-1] of char;
    8.     IoStatus: IO_STATUS_BLOCK;
    9.     objectAttributes: OBJECT_ATTRIBUTES;
    10.     status: NTSTATUS;
    11.     FileHandle: HANDLE;
    12.     fileName: UNICODE_STRING;
    13.     buf: array[0..300-1] of CHAR;
    14.     time: LARGE_INTEGER;
    15. begin
    16.     RtlInitUnicodeString( @fileName, DEFAULT_LOG_FILE_NAME );
    17.     InitializeObjectAttributes (@objectAttributes,
    18.                                 @fileName,
    19.                                 OBJ_CASE_INSENSITIVE or OBJ_KERNEL_HANDLE,
    20.                                 0,
    21.                                 nil );
    22.  
    23.     status := ZwCreateFile( @FileHandle,
    24.                            GENERIC_READ or GENERIC_WRITE or SYNCHRONIZE,
    25.                            @objectAttributes,
    26.                            @IoStatus,
    27.                            nil,
    28.                            FILE_ATTRIBUTE_NORMAL,
    29.                            FILE_SHARE_READ  or FILE_SHARE_WRITE,
    30.                            FILE_OPEN_IF,
    31.                            FILE_SYNCHRONOUS_IO_NONALERT,
    32.                            0,
    33.                            0);
    34.     if ERROR_PATH_NOT_FOUND = status then
    35.     begin
    36.          DbgPrint('ERROR_PATH_NOT_FOUND');
    37.          DbgPrint(#13#10);
    38.     end;
    39.     if( NT_SUCCESS(status) )then
    40.     begin
    41.         Length := 300;
    42.         buf[0] := '1';
    43.         buf[1] := '2';
    44.         buf[2] := '3';
    45.  
    46.         ZwWriteFile( FileHandle, 0, nil, nil, @IoStatus, @buf, Length, nil, nil);
    47.  
    48.         ZwClose( FileHandle );
    49.     end;
    50.  
    51.     Result := NT_SUCCESS(STATUS_SUCCESS);
    52. end;
    53.  
     
  2. LuckyDevil

    LuckyDevil New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2005
    Сообщения:
    278
    Адрес:
    Uzbekistan
    обманул немножко, не ERROR_PATH_NOT_FOUND, а STATUS_OBJECT_PATH_NOT_FOUND
     
  3. LuckyDevil

    LuckyDevil New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2005
    Сообщения:
    278
    Адрес:
    Uzbekistan
    вроде вот так работает

    DEFAULT_LOG_FILE_NAME = '\Device\HarddiskVolume1\avsd.log';



    но неужто нельзя, что-то попроще??????

    почему не проходит этот вариант \?\C:\avsd.log????
     
  4. vinnie_pooh

    vinnie_pooh New Member

    Публикаций:
    0
    Регистрация:
    30 июн 2004
    Сообщения:
    98
    \??\C:\avsd.log
     
  5. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    Вариант с \??\C:\avsd.log должен работать.

    И вообще, я тебе не советую в драйвере привязываться к буквам дисков, лучше работать с каталогом Windows, он всегда доступен по пути \SystemRoot\, независимо от того, на каком диске стоит система.



    И для упрощения работы с файлами создай функции тапа:
    Код (Text):
    1. ULONG MyGetFileSize(HANDLE hFile)
    2. {
    3.     FILE_STANDARD_INFORMATION Info;
    4.     IO_STATUS_BLOCK IoStatusBlock;
    5.    
    6.     ZwQueryInformationFile(hFile, &IoStatusBlock,
    7.                            &Info, sizeof(Info),
    8.                            FileStandardInformation);
    9.    
    10.     return Info.EndOfFile.LowPart;
    11. }
    12.  
    13. NTSTATUS MyReadFile(
    14.             IN HANDLE hFile,
    15.             OUT PVOID lpBuffer,
    16.             IN ULONG nNumberOfBytesToRead)
    17. {
    18.     IO_STATUS_BLOCK IoStatusBlock;
    19.    
    20.     return ZwReadFile(hFile, NULL, NULL,
    21.                       NULL, &IoStatusBlock,
    22.                       lpBuffer, nNumberOfBytesToRead,
    23.                       NULL, NULL);
    24. }
    25.  
    26. NTSTATUS MyWriteFile(
    27.             IN HANDLE hFile,
    28.             IN PVOID  lpBuffer,
    29.             IN ULONG  nNumberOfBytesToWrite)
    30. {
    31.     IO_STATUS_BLOCK IoStatusBlock;
    32.    
    33.     return ZwWriteFile(hFile, NULL, NULL,
    34.                        NULL, &IoStatusBlock,
    35.                        lpBuffer, nNumberOfBytesToWrite,
    36.                        NULL, NULL);
    37. }
     
  6. LuckyDevil

    LuckyDevil New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2005
    Сообщения:
    278
    Адрес:
    Uzbekistan
    Ms Rem, работает.

    За совет по функциям, большущий фэнкс.

    Лог файл мне нужен для отладки, потому как не все я могу увидеть через DbgPrint, да и при BSOD, в дампе почему-то не всегда присутсвует отладочная информация.
     
  7. NeuronViking

    NeuronViking New Member

    Публикаций:
    0
    Регистрация:
    29 окт 2004
    Сообщения:
    476
    Адрес:
    где-то в Сиднее




    а почему именно так не пробовал узнать? ;)
     
  8. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    Кстати, у Dbgview есть функция восстановления из аварийного дампа информации выведенной через DbgPrint.

    Работает эта фича 100%, главное делать полный дамп памяти ядра.
     
  9. LuckyDevil

    LuckyDevil New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2005
    Сообщения:
    278
    Адрес:
    Uzbekistan
    Ms Rem. "Dbgview" ну так я о ней и говорил. что не работает, весь прикол заключается в том, что там может быть совершенно устаревшая информация, и мне не понятно почему это происходит
     
  10. LuckyDevil

    LuckyDevil New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2005
    Сообщения:
    278
    Адрес:
    Uzbekistan
    Ms Rem, очередной вопрос:

    почему функцию RtlUnicodeStringToAnsiString возращает не корректный результат

    RtlUnicodeStringToAnsiString(@astring,@buffer,FALSE)

    где

    buffer: array[0..1024] of Char;

    на момент выполнения данной функции в буфере находиться следующая информация:

    8 байт "служебной" информации, а все остальное строка в представлении Unicode

    по структуре напоминает
    Код (Text):
    1.  
    2. UNICODE_STRING =  record
    3.   Length : UShort;
    4.   MaximumLength : UShort;
    5.   Buffer : PWideChar;
    6.   end;
    7.  


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

    в astring я получаю "Y\MACHINE\HARDWARE\DESCRIPTION\SYSTEM\MultifunctionAdapter", т.е. отсекается 8 байт.

    в чем может быть проблема?
     
  11. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    Во первых: что за криворукий способ с buffer: array[0..1024] of Char? когда я писал дрова на дельфи и передавал указатель на UNICODE_STRING то все у меня работало.

    Во вторых: проверь как у тебя описана структура ANSI_STRING. Правильно будет так:
    Код (Text):
    1. PANSI_STRING = ^ANSI_STRING;
    2. ANSI_STRING = packed record
    3.   Length: USHORT;
    4.   MaximumLength : USHORT;
    5.   Buffer: PChar;
    6. end;


    В третьих: после служебных данных у тебя в буфере находится строка, а куда указывает Buffer : PWideChar? Он должен указывать на начало строки, независимо от того где она находится.

    В четвертых: сколько раз говорить, что структуры надо описывать как packed record?



    И вообще, если решил писать серьезные дрова на дельфи, то надо избавляться от кривых мест типа buffer: array[0..1024] of Char; и десять раз перепроверять описания всех структур и функций, а иначе получится черт знает что. Если у тебя это и так компилится и работает, то это не означает что все описано правильно. Так что мой совет - ЕЩЕ РАЗ ВСЕ ПЕРЕПРОВЕРИТЬ.
     
  12. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    И еще один совет:

    Надо четко понять разницу между строками и указателями, например array[0..255] of Char это строка, а PChar - это указатель. Поэтому работа с строками в динамической памяти будет выглядеть так:
    Код (Text):
    1.  
    2. var
    3.  Str: PUNICODE_STRING;
    4.  Len: dword;
    5. begin
    6.  // пусть Len - длина создаваемой строки в символах
    7.  Str := ExAllocatePool(PagedPool, SizeOf(UNICODE_STRING) + SizeOf(WideChar) * Len);
    8.  Str^.Buffer := pointer(ulong(@Str) + SizeOf(UNICODE_STRING));
    9. end;
    10.  


    В этом случае мы выделяем память и под структуру и под строку одновременно.

    Или так:
    Код (Text):
    1.  
    2. const
    3.  String: PWideChar = 'MyString';
    4. var
    5.  Str: UNICODE_STRING;
    6. begin
    7.  RtlInitUnicodeString(Str, String);
    8. end;
    9.  


    Так следует поступать с константной строкой.



    И вообще, забудь что пишешь на дельфи, думай и пиши так, как это делается на си.
     
  13. LuckyDevil

    LuckyDevil New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2005
    Сообщения:
    278
    Адрес:
    Uzbekistan
    Ms Rem ANSI_STRING у меня объявлена эта структура так
    Код (Text):
    1.  
    2. type
    3.   PString = ^TString;
    4.   _STRING = record
    5.     Length: USHORT;
    6.     MaximumLength: USHORT;
    7.     Buffer: PCHAR;
    8.   end;
    9.   TString = _STRING;
    10.  
    11.   ANSI_STRING = _STRING;
    12.   PANSI_STRING = ^_STRING;
    13.  


    по поводу кривого способа Uchar buffer[1024], этот спсобо из оригbнальной версии кода, и там этот кривой способ работает, я в данный момент не могу судить о кривости, но если ты так думаешь, то соглашусь.

    по поводу упаковки структур, первоначально я так и делал, но в процесси работы, не все структуры работали, после чего я убрал packed record, не скажу что именно из-за этого у меня все стало работать, но и без packed record тоже работает, на данного момент отлично.

    все же по твоему совету добавил packed , но результат остался не изменным.

    остается все еще раз перепроверить.

    ))) отругал ты меня как мальчишку )))
     
  14. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    LuckyDevil

    Вроде структура ANSI_STRING описана правильно.

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

    Могу здесь посоветовать только поставить айс и прогнать под ним оригинальную и твою версии дров. И внимательно посмотреть какие структуры передаются апишкам и какие ими возвращаются.

    По достижении успехов в написании дров на дельфи, с тебя статья об этом :)

    Я думаю. что эта тема была бы многим интересна.
     
  15. LuckyDevil

    LuckyDevil New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2005
    Сообщения:
    278
    Адрес:
    Uzbekistan
    Ms Rem,

    <font color="red]"багов метафизического порядка"</font><!--color--> вот именно, учитывая мою природную рассеянность, то получаются вешалки на все 100%, да еще какие, про нецензурную брань... лучше ничего не говорить.

    А поповоду статьи, быть может... хотя мало вероятно.

    Зато можно будет сделать полную хронологию из постов форума )))), учитывая что я тут выкладываю практический весь свой код, правда в моей не корректной интерпретации :).
     
  16. LuckyDevil

    LuckyDevil New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2005
    Сообщения:
    278
    Адрес:
    Uzbekistan
    Ms Rem кстати по поводу данной функции ExAllocatePool, у меня возникают проблемы,

    так она у меня объявлена:
    Код (Text):
    1. function ExAllocatePool(
    2.     PoolType: POOL_TYPE;
    3.     NumberOfBytes: SIZE_T):PVOID; stdcall; external NTOSKrnl name '_ExAllocatePool@8';
    4.  
    5. procedure ExFreePool(
    6.     P: PVOID
    7.     );stdcall; external NTOSKrnl name '_ExFreePool@4';
    8.  


    где-то здесь у меня ошибка, ткни пальцем что не так.

    структура POOL_TYPE:
    Код (Text):
    1. type
    2.     _POOL_TYPE =
    3.        (NonPagedPool,
    4.         PagedPool,
    5.         NonPagedPoolMustSucceed,
    6.         DontUseThisType,
    7.         NonPagedPoolCacheAligned,
    8.         PagedPoolCacheAligned,
    9.         NonPagedPoolCacheAlignedMustS
    10.         );
    11.     POOL_TYPE = _POOL_TYPE;
    12.  
     
  17. LuckyDevil

    LuckyDevil New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2005
    Сообщения:
    278
    Адрес:
    Uzbekistan
    Я тут панику зря подня по поводу того что RtlInitUnicodeString(@buf_un,@buffer) работает как-то не корректно, я был не прав работает, проблема в другом ...


    Код (Text):
    1. if(NT_SUCCESS(RtlUnicodeStringToAnsiString(@astring,@buf_un,FALSE))) then // <- @buffer[0]
    2.  begin
    3.   DVRH_LogMessage(astring.Buffer,astring.Length);
    4.   PDOB_NAME_STRING(out_buffer)^.name :=  astring;
    5.   PDOB_NAME_STRING(out_buffer)^.status := 1;
    6.   [b]Irp^.IoStatus.Information := Irp^.IoStatus.Information + 8 +
    7.     PDOB_NAME_STRING(out_buffer)^.name.Length;[/b]
    8.  end;
    9.  


    Проблема кажется тут Irp^.IoStatus.Information := Irp^.IoStatus.Information + 8 + PDOB_NAME_STRING(out_buffer)^.name.Length;
     
  18. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    ХМ. Вроде все правильно.

    Тут тебе может помочь только софтайс. Ставь и медитируй...
     
  19. wish3

    wish3 New Member

    Публикаций:
    0
    Регистрация:
    31 янв 2005
    Сообщения:
    29
    Адрес:
    Ukraine
    Ms Rem



    Как в SoftIce увидеть Дельфовский исходник??

    Какие опции(директивы) нужно выставить в Дельфи?? Что мы получим и как энто загрузить в сайс??

    Сам мучилса над этой проблемой, но у меня то вобше не находило отладоной инфы, то никак на нее не реагировало..(всеже там стоит Include TD32 debug info)
     
  20. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    Где-то видал про конвертацию TD32 debug info в отладочные символы, но сам не юзал.

    А понять в чем проблема поможет и асм листинг, внимание следует обратить на то что передается апишкам и что они возвращают. Тогда и косяк свой найти можно.