Compartilhar via


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

Confira também

CcCopyWrite

CcInitializeCacheMap

CcMdlWriteAbort

CcMdlWriteComplete

IoAllocateMdl

IoBuildPartialMdl

MmGetMdlByteCount

MmGetMdlByteOffset

MmGetMdlPfnArray

MmGetMdlVirtualAddress

MmGetSystemAddressForMdl

MmGetSystemAddressForMdlSafe

MmInitializeMdl

MmMapLockedPages

MmPrepareMdlForReuse

MmProbeAndLockPages

MmUnlockPages

MmUnmapLockedPages