Помогите справиться с MountManager под Win2k

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

  1. rav

    rav New Member

    Публикаций:
    0
    Регистрация:
    19 июл 2004
    Сообщения:
    159
    Адрес:
    Москва
    Всем привет!



    Пишу драйвер динамически подключаемого диска. Для его подключения в систему я использую последовательность:


    Код (Text):
    1. NTSTATUS MountManagerMount (char *NativeDeviceName,UCHAR DriveNumber)
    2. {
    3.     NTSTATUS ntStatus;
    4.     WCHAR arrVolume[200];
    5.     char buf[200];
    6.     PMOUNTMGR_TARGET_NAME in = (PMOUNTMGR_TARGET_NAME) buf;
    7.     PMOUNTMGR_CREATE_POINT_INPUT createPoint;
    8.     ULONG createPointSize;
    9.  
    10.     ANSI_STRING aString;
    11.     UNICODE_STRING uString;
    12.     UNICODE_STRING ntName,dosName;
    13.  
    14.     RtlInitAnsiString(&aString,NativeDeviceName);
    15.  
    16.     RtlAnsiStringToUnicodeString(&uString,&aString,TRUE);
    17.  
    18.     wcscpy(arrVolume,uString.Buffer);
    19.  
    20.     RtlFreeUnicodeString(&uString);
    21.    
    22.     in->DeviceNameLength = (USHORT) wcslen (arrVolume) * sizeof(WCHAR);
    23.     wcscpy(in->DeviceName, arrVolume);
    24.  
    25.     ntStatus = TCDeviceIoControl (MOUNTMGR_DEVICE_NAME,
    26.         IOCTL_MOUNTMGR_VOLUME_ARRIVAL_NOTIFICATION,
    27.         in,sizeof (in->DeviceNameLength) + in->DeviceNameLength, 0, 0);
    28.  
    29.     if(ntStatus)
    30.         return ntStatus;
    31.  
    32.     memset (buf, 0, sizeof(buf));
    33.  
    34.     swprintf((WCHAR*)buf, L"\\DosDevices\\%C:", 'A'+DriveNumber);
    35.     RtlInitUnicodeString(&dosName, (PCWSTR)buf);
    36.     RtlInitUnicodeString(&ntName, arrVolume);
    37.     createPointSize = sizeof(MOUNTMGR_CREATE_POINT_INPUT) +
    38.                       dosName.Length + ntName.Length;
    39.     createPoint = (PMOUNTMGR_CREATE_POINT_INPUT)
    40.                   ExAllocatePool(PagedPool,
    41.                   createPointSize);
    42.     createPoint->SymbolicLinkNameOffset =
    43.                   sizeof(MOUNTMGR_CREATE_POINT_INPUT);
    44.     createPoint->SymbolicLinkNameLength = dosName.Length;
    45.     createPoint->DeviceNameOffset =
    46.         createPoint -> SymbolicLinkNameOffset +
    47.         createPoint -> SymbolicLinkNameLength;
    48.     createPoint->DeviceNameLength = ntName.Length;
    49.     RtlCopyMemory((PCHAR) createPoint +
    50.                   createPoint -> SymbolicLinkNameOffset,
    51.                   dosName.Buffer, dosName.Length);
    52.     RtlCopyMemory((PCHAR) createPoint +
    53.                   createPoint->DeviceNameOffset,
    54.                   ntName.Buffer, ntName.Length);
    55.  
    56.     ntStatus = TCDeviceIoControl (MOUNTMGR_DEVICE_NAME,
    57.                     IOCTL_MOUNTMGR_CREATE_POINT, createPoint,
    58.                     createPointSize, 0, 0);
    59.  
    60.     ExFreePool(createPoint);
    61.  
    62.     return ntStatus;
    63. }




    Везде возвращается 0.



    Для отключения же я использую IOCTL_MOUNTMGR_DELETE_POINTS


    Код (Text):
    1. /////////////////////////////////////////////////////////////////////
    2.  
    3.  
    4. NTSTATUS MountManagerUnmount (int DriveNumber)
    5. {
    6.     NTSTATUS ntStatus;
    7.     char buf[300], out[300];
    8.     PMOUNTMGR_MOUNT_POINT in = (PMOUNTMGR_MOUNT_POINT) buf;
    9.  
    10.     PMOUNTDEV_NAME name = (PMOUNTDEV_NAME)buf;
    11.  
    12.     memset (buf, 0, sizeof buf);
    13.  
    14.     swprintf((PWSTR) &in[1], L"\\DosDevices\\%C:", 'A'+DriveNumber);
    15.  
    16.     in->SymbolicLinkNameOffset = sizeof (MOUNTMGR_MOUNT_POINT);
    17.     in->SymbolicLinkNameLength = (USHORT) wcslen ((PWCHAR) &in[1]) * 2;
    18.  
    19.     ntStatus = TCDeviceIoControl (MOUNTMGR_DEVICE_NAME, IOCTL_MOUNTMGR_DELETE_POINTS,
    20.         in, sizeof(MOUNTMGR_MOUNT_POINT) + in->SymbolicLinkNameLength, out, sizeof out);
    21.  
    22.     return ntStatus;
    23. }




    Тоже возвращает 0.



    Проблема- под Win2k подключаем-отключаем диск. После повторного подключения к той же букве в свойствах диска исчезают две вкладки, а система не видит файловой системы диска и его метки. Перепробовал всё, что только пришло в голову. Ничего не получилось. Нужна помощь.



    Обработчики сообщений от MauntManager такие:


    Код (Text):
    1. case IOCTL_MOUNTDEV_QUERY_DEVICE_NAME:
    2. {
    3.  
    4.         ANSI_STRING aString;
    5.         UNICODE_STRING uString;
    6.  
    7.         PMOUNTDEV_NAME MountdevName;
    8.         USHORT Len;
    9.  
    10.  
    11.         // Check output buffer length
    12.         if (IrpSp->Parameters.DeviceIoControl.OutputBufferLength < sizeof(MOUNTDEV_NAME) )
    13.         {
    14.             status = STATUS_INVALID_PARAMETER;
    15.             Irp->IoStatus.Information = 0;
    16.             break;
    17.         }
    18.  
    19.         // Set pointer to return buffer
    20.         MountdevName = (PMOUNTDEV_NAME)Irp->AssociatedIrp.SystemBuffer;
    21.  
    22.         MountdevName->NameLength = strlen(DeviceExtension->szDevicePath) * sizeof(WCHAR);
    23.         Len = MountdevName->NameLength + sizeof(USHORT);
    24.        
    25.         // Check output buffer length
    26.         if (IrpSp->Parameters.DeviceIoControl.OutputBufferLength < Len)
    27.         {
    28.             KdPrint(("SDPRT: IOCTL_MOUNTDEV_QUERY_DEVICE_NAME input buffer too small\n"));
    29.             status = STATUS_BUFFER_OVERFLOW;
    30.             Irp->IoStatus.Information = sizeof(MOUNTDEV_NAME);
    31.             break;
    32.         }
    33.  
    34.         RtlInitAnsiString(&aString,DeviceExtension->szDevicePath);
    35.  
    36.         RtlAnsiStringToUnicodeString(&uString,&aString,TRUE);
    37.  
    38.         wcscpy(MountdevName->Name,uString.Buffer);
    39.  
    40.         RtlFreeUnicodeString(&uString);
    41.  
    42.         RtlInitUnicodeString(&uString,MountdevName->Name);
    43.  
    44.         MountdevName->NameLength=uString.Length;
    45.  
    46.         status = STATUS_SUCCESS;
    47.         Irp->IoStatus.Information = Len;
    48. }
    49. break;
    50.  
    51.  
    52. case IOCTL_MOUNTDEV_QUERY_UNIQUE_ID:
    53. {
    54.     PMOUNTDEV_UNIQUE_ID pMountID;
    55.     char temp[100]={0};
    56.     USHORT Len;
    57.  
    58.     if (IrpSp->Parameters.DeviceIoControl.OutputBufferLength < sizeof(MOUNTDEV_UNIQUE_ID) )
    59.     {
    60.         status = STATUS_INVALID_PARAMETER;
    61.         Irp->IoStatus.Information = 0;
    62.         break;
    63.     }
    64.  
    65.     pMountID = (PMOUNTDEV_UNIQUE_ID)Irp->AssociatedIrp.SystemBuffer;
    66.  
    67.     sprintf(temp,"GDISK%C",'A'+DeviceExtension->dwDriveNumber);
    68.  
    69.     pMountID->UniqueIdLength = strlen(temp);
    70.     Len = pMountID->UniqueIdLength + sizeof(USHORT);
    71.  
    72.     if (IrpSp->Parameters.DeviceIoControl.OutputBufferLength < Len)
    73.     {                  
    74.         Irp->IoStatus.Information = sizeof (MOUNTDEV_UNIQUE_ID);
    75.         status = STATUS_BUFFER_OVERFLOW;
    76.         break;
    77.     }
    78.  
    79.     strcpy(pMountID->UniqueId,temp);
    80.  
    81.     status = STATUS_SUCCESS;
    82.     Irp->IoStatus.Information = Len;
    83.  
    84. }
    85. break;
    86.  
    87.             case IOCTL_MOUNTDEV_QUERY_SUGGESTED_LINK_NAME:
    88. {
    89.     PMOUNTDEV_SUGGESTED_LINK_NAME pSuggestedLink;
    90.     USHORT Len;
    91.     UNICODE_STRING uString;
    92.     WCHAR temp[200]={0};
    93.  
    94.     if (IrpSp->Parameters.DeviceIoControl.OutputBufferLength < sizeof(MOUNTDEV_SUGGESTED_LINK_NAME) )
    95.     {
    96.         status = STATUS_INVALID_PARAMETER;
    97.         Irp->IoStatus.Information = 0;
    98.         break;
    99.     }
    100.  
    101.     pSuggestedLink = (PMOUNTDEV_SUGGESTED_LINK_NAME)Irp->AssociatedIrp.SystemBuffer;
    102.  
    103.     swprintf(temp,L"\\DosDevices\\%C:",'A'+DeviceExtension->dwDriveNumber  );
    104.  
    105.     pSuggestedLink->NameLength=wcslen(temp)*sizeof(WCHAR);
    106.  
    107.     Len=pSuggestedLink->NameLength+FIELD_OFFSET(MOUNTDEV_SUGGESTED_LINK_N  AME,Name);
    108.  
    109.     if(IrpSp->Parameters.DeviceIoControl.OutputBufferLength < Len)
    110.     {
    111.         Irp->IoStatus.Information = sizeof (MOUNTDEV_SUGGESTED_LINK_NAME);
    112.         status = STATUS_BUFFER_OVERFLOW;
    113.         break;
    114.     }
    115.  
    116.     pSuggestedLink->UseOnlyIfThereAreNoOtherLinks=FALSE;
    117.  
    118.     wcscpy(pSuggestedLink->Name,temp);
    119.  
    120.     RtlInitUnicodeString(&uString,pSuggestedLink->Name);
    121.  
    122.     pSuggestedLink->NameLength=uString.Length;
    123.  
    124.     status = STATUS_SUCCESS;
    125.     Irp->IoStatus.Information=uString.Length + FIELD_OFFSET(MOUNTDEV_SUGGESTED_LINK_NAME,Name);
    126. }
    127. break;
     
  2. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    rav

    Подсказать особо ничего не могу, только идеи.

    Если идет работа с диском, особенно запись,

    Винда как-то помечает незавершенные операции

    и если такой диск "на ходу" размонтировать,

    то его без chkdsk уже не подключишь...

    Рой в этом направлении. Вряд ли функция

    размонтирования такие вещи проверяет.

    МС и более простые проверки не делает :)
     
  3. ams007

    ams007 New Member

    Публикаций:
    0
    Регистрация:
    28 апр 2007
    Сообщения:
    86
    Мне вот просто смонтировать диск надо через mountmgr, чтоб в эксплорере показывало.
    Этот код с явно необходимыми исправлениями НЕ работает.
    Помимо описанных IOCTL, приходят к драйверу - клиенту следующие:
    IOCTL_MOUNTDEV_CHANGE_UNIQUE_ID_NOTIFY,
    IOCTL_MOUNTDEV_LINK_CREATED.

    Написал на них обработку - по МСДНу(правильно вроде) - НЕ работает.

    Кто знает - напишите про эту тему, в т.ч. как обрабатывать все эти IOCTL., или работающий примерчик, пожалуйста.
    Задолбался уже .
     
  4. ams007

    ams007 New Member

    Публикаций:
    0
    Регистрация:
    28 апр 2007
    Сообщения:
    86
    P.S: а что эта тема в этом разделе вообще делает???