Por que os gerenciadores de partição precisam de seus próprios drivers?

1

Por que tantas ferramentas de gerenciamento de partição, como o EASEUS Partition Master, o Acronis Disk Director, etc. exigem seus próprios drivers para executar?

Em outras palavras, o que eles precisam fazer isso não pode ser realizado sem um driver dedicado?

O acesso direto ao disco é totalmente possível a partir do modo de usuário no Windows, então estou curioso para saber por que essas ferramentas insistem em instalar um driver personalizado para fazer seu trabalho. Qual é a razão por trás disso?

    
por Mehrdad 13.05.2012 / 06:19

2 respostas

3

@ David Schwartz sugeriu que é porque eles estão interceptando todo o acesso ao disco. Isso certamente parece credível para mim. Mas eu estou querendo saber se essa é a história toda. Eu estive bisbilhotando o driver EaseUS, empmntdrv.sys . Algumas coisas a serem observadas:

  1. Ele é carregado assim que eu inicio a interface do usuário, não particionando nada.

  2. Os fóruns do EaseUS têm muitas postagens de pessoas reclamando que nenhuma partição é exibida quando ela é inicializada, e a resposta do material do suporte do EaseUS é: reinstale o driver. Isso me faz pensar que está sendo usado para realmente ler a tabela.

  3. Trouxe as armas grandes: PE Explorer para desmontar o arquivo do driver. Principalmente grego para mim, claro, mas algumas coisas saltam fora. Primeiro, a tabela de símbolos mostra a lista de chamadas do sistema feitas para ntoskrnel.exe , e isso inclui mucking com links simbólicos:

    ; Imports from ntoskrnl.exe
        extrn DbgPrint
        extrn ExAllocatePoolWithTag
        extrn ExFreePoolWithTag
        extrn IoBuildAsynchronousFsdRequest
        extrn IoBuildDeviceIoControlRequest
        extrn IoCreateDevice
        extrn IoCreateSymbolicLink
        extrn IoDeleteDevice
        extrn IoDeleteSymbolicLink
        extrn IoFreeIrp
        extrn IoFreeMdl
        extrn IoGetAttachedDeviceReference
        extrn IoGetDeviceObjectPointer
        extrn IofCallDriver
        extrn IofCompleteRequest
        extrn KeBugCheckEx
        extrn KeInitializeEvent
        extrn KeSetEvent
        extrn KeTickCount
        extrn KeWaitForSingleObject
        extrn MmMapLockedPagesSpecifyCache
        extrn MmUnlockPages
        extrn ObfDereferenceObject
        extrn ObfReferenceObject
        extrn RtlAnsiCharToUnicodeChar
        extrn RtlInitUnicodeString
        extrn RtlUnicodeStringToInteger
        extrn memcpy
        extrn memset
    

    Note também que estas não são as rotinas de driver de filtro, elas são I / O de baixo nível. (Não FltGetDiskDeviceObject , em vez IoGetDeviceObjectPointer .

  4. Ainda mais bisbilhotando encontrou algumas constantes que poderiam dar mais pistas. Como a maioria dos códigos compilados do Windows, há uma referência ao arquivo PDB, geralmente com o caminho no computador que o criou:

    h: \ epm2.0 \ 01_projectarea \ 00_source \ epm2 \ mod.windiskaccessdriver \ windiskaccessdriver \ objfre_wxp_x86 \ i386 \ epmntdrv.pdb

    Esse é provavelmente o nome do projeto do desenvolvedor: "win driver de acesso ao disco" Eu acho que eles precisam do driver para realmente ler a tabela de uma forma que seja útil para eles.

  5. Depois, há essa constante, que realmente parece interessante:

    \Device\Harddisk%u\Partition0
    

    Isso pareceu interessante o suficiente para que eu rastreasse onde ele era referenciado no código desmontado, o que me levou aqui:

     0001051E  68C6190100                       push    L000119C6
     00010523  6A78                             push    00000078h
     00010525  50                               push    eax
     00010526  E85BFFFFFF                       call    SUB_L00010486
     0001052B  83C420                           add esp,00000020h
     0001052E  85C0                             test    eax,eax
     00010530  7404                             jz  L00010536
     00010532                           L00010532:
     00010532  33C0                             xor eax,eax
     00010534  EB43                             jmp L00010579
     00010536                           L00010536:
     00010536  8D4584                           lea eax,[ebp-7Ch]
     00010539  50                               push    eax
     0001053A  8D8574FFFFFF                     lea eax,[ebp-0000008Ch]
     00010540  50                               push    eax
     00010541  FF15941A0100                     call    [ntoskrnl.exe!RtlInitUnicodeString]
     00010547  8D4580                           lea eax,[ebp-80h]
     0001054A  50                               push    eax
     0001054B  8D857CFFFFFF                     lea eax,[ebp-00000084h]
     00010551  50                               push    eax
     00010552  56                               push    esi
     00010553  8D8574FFFFFF                     lea eax,[ebp-0000008Ch]
     00010559  50                               push    eax
     0001055A  FF15901A0100                     call    [ntoskrnl.exe!IoGetDeviceObjectPointer]
    
  6. Então, que coisa mágica faz IoGetDeviceObjectPointer , que só está disponível em modo kernel, avisam quando você o chama em \Device\Harddisk0\Partition0 ?

    De um poste antigo para comp.os.ms-windows.programmer. nt.kernel-mode :

    If you get the pointer to \device\harddisk(n)\partition(n) using IoGetDeviceObjectPointer(), you will get a pointer to the partitions device object. If you want the physical disk device object, you need to get the pointer to \device\harddisk(n)\partition0.

    Então o partition0 nos permite acessar o disco físico

    E isso nos dá muitas métricas de desempenho e contadores que estão abaixo do nível lógico do disco.

  7. Finalmente, tentando encontrar um horário que eu achei que poderia estar usando o driver. Fiz um "teste de superfície" do EaseUS e vejo estatísticas sobre o desempenho. Eles poderiam estar fazendo isso do nível do usuário, mas no Process Explorer, quando eu um instantâneo, de repente eu vi o Device.mo dll ativo: presumivelmente a parte do sistema que fala com o motorista.

Ainda não tenho certeza se essa é uma boa resposta para a pergunta. Mas foi divertido explorar, de qualquer maneira! Obrigado pela leitura.

    
por 13.05.2012 / 11:42
2

Eles precisam interceptar todos os acessos ao disco. Por exemplo, suponha que você esteja no processo de clonar uma partição. Se alguma gravação for feita no disco durante o processo de clonagem, o setor gravado deve ser clonado antes de permitir que a gravação passe, caso contrário, o clone resultante será inconsistente.

    
por 13.05.2012 / 07:44