Como implementar Reparsing em um driver de filtro de sistema de arquivo

IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.

Clique aqui para ver a versão em Inglês deste artigo: 319447
Este artigo foi arquivado. É oferecido "como está" e não será mais atualizado.
Sumário
O Gerenciador de E/S oferece uma maneira conveniente de um objeto de arquivo de nova análise. Normalmente, esse método é usado em drivers de filtro de sistema de arquivos para redirecionar uma operação de criação do arquivo ou abrir arquivo para outro arquivo.
Mais Informações
Para redirecionar uma operação de criação do arquivo ou abrir arquivo para outro arquivo, um driver de filtro de sistema de arquivos faz o seguinte:
  1. No manipulador de IRP_MJ_CREATE, obtém o nome do arquivo (campo FileName) a partir de FILE_OBJECT.
  2. Substitui esse nome o nome completo do arquivo de destino.

    Este nome completo inclui o nome do objeto de dispositivo de volume (por exemplo, Device\HardDiskVolume0\Directory\MyFile.txt). Você pode substituir seu próprio buffer para o FileName.Buffer existente presente no FILE_OBJECT. Nesse caso, alocar o buffer de memória de pool não-paginável, libere FileName.Buffer original usando ExFreePool e substituir FileName.Buffer seu buffer.
  3. Define o campo status do bloco IoStatus para STATUS_REPARSE e define o campo de informações para IO_REPARSE.
  4. Conclui a solicitação.
  5. Retorna STATUS_REPARSE.
Em seguida, o Gerenciador de E/S aciona outra operação de arquivo aberto e envia um IRP_MJ_CREATE, levando em conta o nome de arquivo específico.

O arquivo de destino pode ser local ou em um computador remoto. Para redirecionar a operação Abrir do arquivo para um arquivo remoto, use a seguinte sintaxe para o nome do arquivo:
  • "\??\UNC\HostName\Share\File"

    - ou -
  • "\Device\Mup\HostName\Share\File"

    - ou -
  • "\Device\LanmanagerRedirector\HostName\Share\File" (supondo que estão direcionando um arquivo no SMB/CIFS/LanManager)
O fato de que a primeira operação arquivo criar é executada em relação a outro arquivo de objeto não importa. Não modifique o campo RelatedFileObject do FILE_OBJECT. Para executar a operação de nova análise, o Gerenciador de E/S considera somente o campo FileName e não o RelatedFileObject. Além disso, o Gerenciador de E/S libera RelatedFileObject, conforme apropriado, quando ele lida com o status STATUS_REPARSE retornado pelo filtro. Portanto, não é responsabilidade do filtro para liberar esse objeto de arquivo.

Há um limite fixo sobre o número de operações de nova análise aninhados que pode executar o Gerenciador de E/S. Esse limite foi introduzido para evitar loops infinitas. O número máximo de operações de nova análise aninhadas que o sistema pode executar é 32.

Esse método reparsing executava pelo Gerenciador de E/S tem de ser disassociated do pontos de nova análise. Nova análise pontos foram introduzidos no NTFS, começando com Microsoft Windows 2000. Pontos de nova análise permite que você para armazenar informações juntamente com um arquivo.

Código de exemplo

NTSTATUSSfCreate (    IN PDEVICE_OBJECT DeviceObject,    IN PIRP Irp    ){	PIO_STACK_LOCATION		IrpSp;	PUNICODE_STRING		FileName;	PVOID			FileNameBuffer;	UNICODE_STRING		NewFileName;	BOOLEAN			bRedirectFileOpen = FALSE;	// 	//  If the device being opened is the primary device object instead of a	//  filter device object, just indicate that the operation worked.	// 	if (DeviceObject == FsDeviceObject)	{		// 		//  Allow users to open the device that represents our driver.		// 		Irp->IoStatus.Status = STATUS_SUCCESS;		Irp->IoStatus.Information = FILE_OPENED;		IoCompleteRequest( Irp, IO_NO_INCREMENT );		return STATUS_SUCCESS;	}		IrpSp = IoGetCurrentIrpStackLocation(Irp);	// 	// At this point, you must determine whether you want to redirect	// the file open/create for this particular file.	// Beware that the file name from the FILE_OBJECT in the current	// IRP stack location is not always the file name with the full	// path, nor the long file name or even a name. The way the file is 	// opened (with full path, relatively to another file, with short 	// or long file name, by ID, ...) affects this name.	// 	// TODO: Put your code here to check whether you have to redirect the operation.	// If so, set bRedirectFileOpen to TRUE and initialize the NewFileName	// UNICODE_STRING to the full file name of the destination file.	// 	if ( bRedirectFileOpen )	{		FileName = &(IrpSp->FileObject->FileName);		FileNameBuffer = ExAllocatePool( NonPagedPool, NewFileName.MaximumLength );		if (!FileNameBuffer)		{			// 			// Not enough resources. Complete the IRP with the appropriate status.			// 			Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES;			Irp->IoStatus.Information = 0;			IoCompleteRequest( Irp, IO_NO_INCREMENT );			return STATUS_INSUFFICIENT_RESOURCES;		}		ExFreePool( FileName->Buffer );		FileName->Buffer = FileNameBuffer;		FileName->MaximumLength = NewFileName.MaximumLength;		RtlCopyUnicodeString( FileName, &NewFileName );		// 		// Instruct the IO Manager to reparse this file.		// 		Irp->IoStatus.Status = STATUS_REPARSE;		Irp->IoStatus.Information = IO_REPARSE;		IoCompleteRequest( Irp, IO_NO_INCREMENT );		return STATUS_REPARSE;	}	else	{		// 		// Pass the request "as is" down the device stack.		// 		// 		// The next driver will get the IO_STACK_LOCATION		// that you received.		// 		IoSkipCurrentIrpStackLocation( Irp );        		// 		// Call the appropriate file system driver with the request.		// 		// TODO: Replace AttachedToDeviceObject by the device		// object pointer your device object is attached to (the		// lower device object in the stack).		// Typically, this device object pointer is saved by your		// filter in your device extension.		// 		return IoCallDriver( AttachedToDeviceObject, Irp );	}}				
STATUS_REPARSE IO_REPARSE reparsing

Aviso: este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 319447 - Última Revisão: 12/07/2015 09:16:57 - Revisão: 2.3

Microsoft Win32 Device Driver Kit for Windows 2000, Microsoft Windows XP Driver Development Kit

  • kbnosurvey kbarchive kbmt kbhowto kbifs kbkmode KB319447 KbMtpt
Comentários