código de controle IOCTL_LMR_DISABLE_LOCAL_BUFFERING

O código de controle IOCTL_LMR_DISABLE_LOCAL_BUFFERING desabilita o cache local do lado do cliente na memória dos dados ao ler dados ou gravar dados em um arquivo remoto. Esse é um código de controle definido internamente que não está disponível em um cabeçalho público.

Apesar da convenção de nomenclatura, esse código de controle é definido com um tipo de dispositivo de FILE_DEVICE_NETWORK_FILE_SYSTEM, tornando-o um código de controle do sistema de arquivos (FSCTL) em vez de um código de controle de E/S do dispositivo (IOCTL). Você deve enviá-lo usando NtFsControlFile em vez de DeviceIoControl. O código de controle e os parâmetros são documentados abaixo usando a convenção DeviceIoControl para referência.

BOOL DeviceIoControl(
  (HANDLE) hDevice,             // handle to device
  IOCTL_LMR_DISABLE_LOCAL_BUFFERING, // dwIoControlCode
  (LPVOID) NULL,                // lpInBuffer
  (DWORD) 0,                    // nInBufferSize
  (LPVOID) NULL,                // lpOutBuffer
  (DWORD) 0,                    // nOutBufferSize
  (LPDWORD) lpBytesReturned,    // number of bytes returned
  (LPOVERLAPPED) lpOverlapped   // OVERLAPPED structure
);

Parameters

hDevice [in]

Um identificador para o arquivo remoto. Para obter esse identificador, chame a função CreateFile .

dwIoControlCode [in]

O código de controle da operação. Use o valor 0x140390 para esta operação.

lpInBuffer

Não usado, deve ser NULL.

nInBufferSize [in]

O tamanho do buffer de entrada, em bytes. Deve ser zero.

lpOutBuffer [out]

Não usado, deve ser NULL.

nOutBufferSize [in]

O tamanho do buffer de saída, em bytes. Deve ser zero.

lpBytesReturned [out]

Um ponteiro para uma variável que recebe o tamanho dos dados armazenados no buffer de saída, em bytes.

Se o buffer de saída for muito pequeno, a chamada falhará, a função GetLastError retornará ERROR_INSUFFICIENT_BUFFER e lpBytesReturned será zero.

Se o parâmetro lpOverlapped for NULL, lpBytesReturned não poderá ser NULL. Mesmo quando uma operação não retorna dados de saída e o parâmetro lpOutBuffer é NULL, DeviceIoControl usa lpBytesReturned. Após essa operação, o valor de lpBytesReturned não tem sentido.

Se lpOverlapped não for NULL, lpBytesReturned poderá ser NULL. Se lpOverlapped não for NULL e a operação retornar dados, lpBytesReturned não terá sentido até que a operação sobreposta seja concluída. Para recuperar o número de bytes retornados, chame a função GetOverlappedResult . Se o parâmetro hDevice estiver associado a uma porta de conclusão de E/S, você poderá recuperar o número de bytes retornados chamando a função GetQueuedCompletionStatus .

lpOverlapped [in]

Um ponteiro para uma estrutura OVERLAPPED .

Se o parâmetro hDevice foi aberto sem especificar FILE_FLAG_OVERLAPPED, lpOverlapped será ignorado.

Se hDevice foi aberto com o sinalizador FILE_FLAG_OVERLAPPED , a operação é executada como uma operação sobreposta (assíncrona). Nesse caso, lpOverlapped deve apontar para uma estrutura OVERLAPPED válida que contenha um identificador para um objeto de evento. Caso contrário, a função falhará de maneiras imprevisíveis.

Para operações sobrepostas, DeviceIoControl retorna imediatamente e o objeto de evento é sinalizado quando a operação é concluída. Caso contrário, a função não retornará até que a operação seja concluída ou até que ocorra um erro.

Valor de retorno

Chamar DeviceIoControl com esse código de controle sempre retornará uma falha porque é um FSCTL, não um IOCTL. Em vez disso , use NtFsControlFile . NtFsControlFile retorna um valor NTSTATUS ; STATUS_SUCCESS indica que a operação foi concluída com êxito.

Remarks

O código de controle IOCTL_LMR_DISABLE_LOCAL_BUFFERING é definido internamente pelo sistema como 0x140390 e não em um arquivo de cabeçalho público. Ele é usado por aplicativos de finalidade especial para desabilitar o cache de dados no lado do cliente local na memória ao ler dados ou gravar dados em um arquivo remoto. Depois que o buffer local é desabilitado, a configuração permanece em vigor até que todas as alças abertas para o arquivo sejam fechadas e o redirecionador limpe suas estruturas de dados internas.

Aplicativos de uso geral não devem usar IOCTL_LMR_DISABLE_LOCAL_BUFFERING, pois podem resultar em tráfego de rede excessivo e perda de desempenho associada. O código de controle IOCTL_LMR_DISABLE_LOCAL_BUFFERING deve ser usado apenas em aplicativos especializados movendo grandes quantidades de dados pela rede enquanto tenta maximizar o uso da largura de banda de rede. Por exemplo, as funções CopyFile e CopyFileEx usam IOCTL_LMR_DISABLE_LOCAL_BUFFERING para melhorar o desempenho de cópia de arquivo grande.

IOCTL_LMR_DISABLE_LOCAL_BUFFERING não é implementado por sistemas de arquivos locais e falhará com o erro ERROR_INVALID_FUNCTION. A emissão do código de controle IOCTL_LMR_DISABLE_LOCAL_BUFFERING em identificadores de diretório remoto falhará com o erro ERROR_NOT_SUPPORTED.

Consulte também

NtFsControlFile

Deviceiocontrol