Função CcPrepareMdlWrite (ntifs.h)
A rotina CcPrepareMdlWrite fornece acesso direto à memória de arquivo armazenada em cache para que o chamador possa gravar dados no arquivo.
Sintaxe
void CcPrepareMdlWrite(
[in] PFILE_OBJECT FileObject,
[in] PLARGE_INTEGER FileOffset,
[in] ULONG Length,
[out] PMDL *MdlChain,
[out] PIO_STATUS_BLOCK IoStatus
);
Parâmetros
[in] FileObject
Ponteiro para um objeto de arquivo para o arquivo armazenado em cache.
[in] FileOffset
Ponteiro para uma variável que especifica o deslocamento de bytes inicial dentro do arquivo armazenado em cache em que os dados devem ser gravados.
[in] Length
Comprimento em bytes dos dados a serem gravados no cache do sistema.
[out] MdlChain
Uma cadeia de uma ou mais listas de descritores de memória (MDL) que descreve as páginas nas quais os dados devem ser gravados.
[out] IoStatus
Ponteiro para uma estrutura de IO_STATUS_BLOCK. Se a chamada para CcPrepareMdlWrite for bem-sucedida, IoStatus.Status será definido como STATUS_SUCCESS. Caso contrário, ele será definido como um código de erro NTSTATUS apropriado. IoStatus.Information é definido como o número real de bytes que foram bloqueados com êxito na cadeia de MDL.
Retornar valor
Nenhum
Comentários
CcPrepareMdlWrite é semelhante a CcCopyWrite, exceto que os dados não são copiados para o arquivo armazenado em cache. Em vez disso, as páginas físicas a serem substituídas no cache do sistema são bloqueadas na memória e CcPrepareMdlWrite retorna uma ou mais listas de descritores de memória (MDL) que descrevem o intervalo de bytes especificado. Essas páginas permanecem bloqueadas na memória até que CcMdlWriteComplete ou CcMdlWriteAbort seja chamado. Portanto, cada chamada para CcPrepareMdlWrite deve ser seguida por uma chamada para CcMdlWriteComplete ou CcMdlWriteAbort.
Observe que as páginas descritas pelo MDL estão bloqueadas na memória, mas não mapeadas no espaço do sistema. O chamador pode executar esse mapeamento chamando MmGetSystemAddressForMdlSafe.
Observe que, mesmo que a chamada para CcPrepareMdlWrite falhe, um ou mais MDLs podem ter sido alocados. O chamador pode examinar o valor de IoStatus.Information para determinar se isso ocorreu. Se tiver, o chamador deverá chamar CcMdlWriteComplete para liberar os MDLs alocados.
Se ocorrer alguma falha, CcPrepareMdlWrite gerará uma exceção status para essa falha específica. Por exemplo, se ocorrer uma falha de alocação de pool, CcPrepareMdlWrite gerará uma exceção STATUS_INSUFFICIENT_RESOURCES; se ocorrer um erro de E/S, CcPrepareMdlWrite gerará a exceção status do erro de E/S. Portanto, para obter controle se ocorrer uma falha, o driver deverá encapsular a chamada para CcPrepareMdlWrite em uma instrução try-except ou try-finally .
Para armazenar em cache um arquivo, use CcInitializeCacheMap.
Requisitos
Requisito | Valor |
---|---|
Plataforma de Destino | Universal |
Cabeçalho | ntifs.h (inclua Ntifs.h) |
Biblioteca | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | < DISPATCH_LEVEL |