Função CcPreparePinWrite (ntifs.h)

A rotina CcPreparePinWrite fixa o intervalo de bytes especificado de um arquivo armazenado em cache para acesso de gravação.

Sintaxe

BOOLEAN CcPreparePinWrite(
  [in]  PFILE_OBJECT   FileObject,
  [in]  PLARGE_INTEGER FileOffset,
  [in]  ULONG          Length,
  [in]  BOOLEAN        Zero,
  [in]  ULONG          Flags,
  [out] PVOID          *Bcb,
  [out] PVOID          *Buffer
);

Parâmetros

[in] FileObject

Ponteiro para um objeto de arquivo para o arquivo armazenado em cache no qual os dados devem ser gravados.

[in] FileOffset

Ponteiro para uma variável que especifica o deslocamento de bytes inicial dentro do arquivo em que os dados devem ser gravados.

[in] Length

Comprimento dos dados desejados em bytes.

[in] Zero

Defina como TRUE se o buffer deve ser zerado no retorno. Esse parâmetro será ignorado se o sinalizador PIN_CALLER_TRACKS_DIRTY_DATA estiver definido no parâmetro Flags .

[in] Flags

Máscara de bits de sinalizadores especificando como a operação de fixação deve ser executada. Combinação ORed de um ou mais dos seguintes valores:

Valor Significado
PIN_WAIT O chamador pode ser colocado em um estado de espera até que os dados sejam fixados.
PIN_EXCLUSIVE O BCB (bloco de controle de buffer) deve ser adquirido exclusivamente.
PIN_NO_READ Somente as páginas que já residem na memória devem ser fixadas. Se esse sinalizador estiver definido, PIN_WAIT também deverá ser definido.
PIN_IF_BCB Os dados devem ser fixados somente se um BCB já existir. Caso contrário, o pino falhará e nenhum BCB será retornado.
PIN_CALLER_TRACKS_DIRTY_DATA O chamador é responsável por acompanhar sujo páginas. Se esse sinalizador estiver definido, todos os outros sinalizadores serão ignorados. Esse sinalizador está disponível no Microsoft Windows Server 2003 SP1 e posterior.

[out] Bcb

Ponteiro opaco para um BCB (bloco de controle de buffer fixado). Esse ponteiro deve ser fornecido como entrada em todas as chamadas subsequentes para CcPreparePinWrite ou CcUnpinData para esse buffer.

[out] Buffer

Retorna o ponteiro para os dados desejados, válidos até que o buffer seja desafixado ou liberado.

Retornar valor

CcPreparePinWrite retornará TRUE se o arquivo armazenado em cache tiver sido fixado com êxito, caso contrário, FALSE .

Comentários

CcPreparePinWrite fixa as páginas de arquivo especificadas no cache do sistema. As páginas a serem completamente substituídas podem ser satisfeitas com páginas de zeros.

Se o sinalizador PIN_WAIT estiver definido, o CcPreparePinWrite deverá concluir a solicitação de preparação e retornar TRUE. Se todas as páginas puderem ser preparadas imediatamente, nenhum bloqueio ocorrerá. Se as páginas necessárias não forem residentes, o chamador será colocado em estado de espera até que todas as páginas necessárias sejam residentes e as páginas possam ser preparadas. Se o sinalizador PIN_WAIT não estiver definido, mas nem todas as páginas puderem ser preparadas imediatamente, CcPreparePinWrite retornará FALSE e seus valores de parâmetro de saída não serão sentido.

Microsoft Windows Server 2003 SP1 e posterior: O sinalizador PIN_CALLER_TRACKS_DIRTY_DATA é comumente usado nos casos em que um sistema de arquivos está gerenciando um arquivo de log que é gravado, mas não lido. Como os dados de arquivo existentes serão substituídos e não lidos, o gerenciador de cache pode retornar páginas de zeros em vez de falhar nas páginas reais dos dados de arquivo do disco. Se esse sinalizador estiver definido, o gerenciador de cache não acompanhará sujo páginas. O chamador é responsável por controlar qualquer sujo páginas. Observe que CcPreparePinWrite só deve ser usado para fixar dados dessa maneira se o buffer eventualmente for liberado para o disco. Antes de chamar CcFlushCache para liberar o buffer para o disco, o chamador deve primeiro chamar MmSetAddressRangeModified para notificar o gerenciador de memória de que as páginas especificadas no buffer de cache do sistema são sujo e devem ser gravadas.

Cada chamada bem-sucedida para CcPreparePinWrite deve ser correspondida por uma chamada subsequente para CcUnpinData. Se CcPreparePinWrite for chamado várias vezes para os mesmos dados, CcUnpinData deverá ser chamado do mesmo número de vezes.

O ponteiro retornado em Buffer é válido até CcUnpinData ser chamado. Se CcPinMappedData for chamado enquanto esse ponteiro ainda for válido, o ponteiro permanecerá válido após a chamada para CcPinMappedData (mas somente até CcUnpinData ser chamado).

CcPreparePinWrite não pode fixar dados entre limites de exibição no gerenciador de cache. O gerenciador de cache gerencia arquivos no sistema em exibições alinhadas a 256 KB. (O tamanho da exibição do gerenciador de cache é especificado pela constante definida pelo sistema VACB_MAPPING_GRANULARITY, que é definida como 256 KB em ntifs.h.) As regiões fixadas não podem abranger mais de uma exibição de 256 KB. Portanto, a maior região que pode ser fixada é de 256 KB, começando em um deslocamento alinhado a 256 KB no arquivo.

Fixar um intervalo de bytes em um arquivo armazenado em cache não garante que as páginas permaneçam residentes na memória. Desde que as páginas sejam fixadas, o intervalo de bytes tem a garantia de permanecer mapeado no espaço de endereço virtual do cache do sistema, mas o gerenciador de memória pode colocar as páginas físicas como a demanda de memória do sistema exige.

Não é necessário chamar CcSetDirtyPinnedData depois de chamar CcPreparePinWrite. Se CcPreparePinWrite retornar TRUE, o BCB já estará marcado como sujo.

Se ocorrer alguma falha, CcPreparePinWrite gerará uma exceção status para essa falha específica. Por exemplo, se ocorrer uma falha de alocação de pool, CcPreparePinWrite gerará uma exceção STATUS_INSUFFICIENT_RESOURCES; se ocorrer um erro de E/S, CcPreparePinWrite 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 CcPreparePinWrite em uma instrução try-except ou try-finally .

Requisitos

Requisito Valor
Plataforma de Destino Universal
Cabeçalho ntifs.h (inclua Ntifs.h)
Biblioteca NtosKrnl.lib
DLL NtosKrnl.exe
IRQL PASSIVE_LEVEL

Confira também

CcFlushCache

CcMapData

CcPinMappedData

CcPinRead

CcSetDirtyPinnedData

CcUnpinData

MmSetAddressRangeModified