ntOpenFile + (Io)RtlVolumeDeviceToDosName = зависание...

Тема в разделе "WASM.NT.KERNEL", создана пользователем Progr, 26 ноя 2006.

  1. Boola

    Boola New Member

    Публикаций:
    0
    Регистрация:
    28 дек 2004
    Сообщения:
    24
    Адрес:
    Russia
    Nouzoi
    если перехват осуществлялся через SDT, а RtlVolumeDeviceToDosName делает вызов напрямую, то какие тогда могут быть проблемы?

    не напрямую, посмотри отладчиком (RtlVolumeDeviceToDosName не содержит фиксированного адреса NtOpenFile)


    Begemot

    Боюсь, что "нечто общее" здесь только "/Device/blah blah blah"...
    Но это не для каждого случая подойдет.


    Для некоторых случаев подойдет фильтр по Create(Open)Options


    Сразу возникает вопрос: как обеспечить безопасный доступ к общим областям памяти(список, адрес первого элемента, возможно что-то еще)? Т.е. пока один поток работает с данными, обеспечить их неизменность и сохранность (и как при этом поведут себя остальные "претенденты"?)...

    Попробуй мьютексы http://www.wasm.ru/article.php?article=drvw2k13.
     
  2. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    ntos\rtl\dev2dos.c:
    Код (Text):
    1. NTSTATUS
    2. RtlVolumeDeviceToDosName(
    3.     IN  PVOID           VolumeDeviceObject,
    4.     OUT PUNICODE_STRING DosName
    5.     )
    6.  
    7. /*++
    8.  
    9. Routine Description:
    10.  
    11.     This routine returns a valid DOS path for the given device object.
    12.     This caller of this routine must call ExFreePool on DosName->Buffer
    13.     when it is no longer needed.
    14.  
    15. Arguments:
    16.  
    17.     VolumeDeviceObject  - Supplies the volume device object.
    18.  
    19.     DosName             - Returns the DOS name for the volume
    20.  
    21. Return Value:
    22.  
    23.     NTSTATUS
    24.  
    25. --*/
    26.  
    27. {
    28.     PDEVICE_OBJECT  volumeDeviceObject = VolumeDeviceObject;
    29.     PMOUNTDEV_NAME  name;
    30.     CHAR            output[512];
    31.     KEVENT          event;
    32.     PIRP            irp;
    33.     IO_STATUS_BLOCK ioStatus;
    34.     NTSTATUS        status;
    35.     UNICODE_STRING  deviceName;
    36.     WCHAR           buffer[30];
    37.     UNICODE_STRING  driveLetterName;
    38.     WCHAR           c;
    39.     UNICODE_STRING  linkTarget;
    40.     LIST_ENTRY      devicesInPath;
    41.  
    42.     name = (PMOUNTDEV_NAME) output;
    43.     KeInitializeEvent(&event, NotificationEvent, FALSE);
    44.     irp = IoBuildDeviceIoControlRequest(IOCTL_MOUNTDEV_QUERY_DEVICE_NAME,
    45.                                         volumeDeviceObject, NULL, 0, name, 512,
    46.                                         FALSE, &event, &ioStatus);
    47.     if (!irp) {
    48.         return STATUS_INSUFFICIENT_RESOURCES;
    49.     }
    50.  
    51.     status = IoCallDriver(volumeDeviceObject, irp);
    52.     if (status == STATUS_PENDING) {
    53.         KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, NULL);
    54.         status = ioStatus.Status;
    55.     }
    56.  
    57.     if (!NT_SUCCESS(status)) {
    58.         return status;
    59.     }
    60.  
    61.     deviceName.MaximumLength = deviceName.Length = name->NameLength;
    62.     deviceName.Buffer = name->Name;
    63.  
    64.     swprintf(buffer, L"\\??\\C:");
    65.     RtlInitUnicodeString(&driveLetterName, buffer);
    66.  
    67.     for (c = 'A'; c <= 'Z'; c++) {
    68.         driveLetterName.Buffer[4] = c;
    69.  
    70.         status = QuerySymbolicLink(&driveLetterName, &linkTarget);
    71.         if (!NT_SUCCESS(status)) {
    72.             continue;
    73.         }
    74.  
    75.         if (RtlEqualUnicodeString(&linkTarget, &deviceName, TRUE)) {
    76.             ExFreePool(linkTarget.Buffer);
    77.             break;
    78.         }
    79.  
    80.         ExFreePool(linkTarget.Buffer);
    81.     }
    82.  
    83.     if (c <= 'Z') {
    84.         DosName->Buffer = ExAllocatePool(PagedPool, 3*sizeof(WCHAR));
    85.         if (!DosName->Buffer) {
    86.             return STATUS_INSUFFICIENT_RESOURCES;
    87.         }
    88.         DosName->MaximumLength = 6;
    89.         DosName->Length = 4;
    90.         DosName->Buffer[0] = c;
    91.         DosName->Buffer[1] = ':';
    92.         DosName->Buffer[2] = 0;
    93.         return STATUS_SUCCESS;
    94.     }
    95.  
    96.     for (c = 'A'; c <= 'Z'; c++) {
    97.         driveLetterName.Buffer[4] = c;
    98.         InitializeListHead(&devicesInPath);
    99.         status = FindPathForDevice(&driveLetterName, &deviceName,
    100.                                    &devicesInPath, DosName);
    101.  
    102.         if (NT_SUCCESS(status)) {
    103.             DosName->Length -= 4*sizeof(WCHAR);
    104.             RtlMoveMemory(DosName->Buffer, &DosName->Buffer[4],
    105.                           DosName->Length);
    106.             DosName->Buffer[DosName->Length/sizeof(WCHAR)] = 0;
    107.             return status;
    108.         }
    109.     }
    110.  
    111.     return status;
    112. }
    ps: отлаживать ядро я не научился