文件重定向(hook IRP_MJ_CREATE)

Windows的I/O管理器提供了一个方便的方法来重定向一个文件对象。通常使用文件过滤驱动(在文件打开和文件创建的操作中)实现该方法。操作方法如下:


1、在IRP_MJ_CREATE的分发函数中,获得FILE_OBJET的FileName属性。
2、用目标文件的完整路径替换原有的文件名字。这个全名,包括卷设备对象的名字(例如,Device/HardDiskVolume0/Directory/MyFile.txt)。可以释放掉原有的FileName.Buffer,同时用自己定义的缓冲区(buffer,以NonPagedPool方式申请)替换它。
3、设置IoStatus的status字段为STATUS_REPARSE,然后设置Information字段为IO_REPARSE.
4、完成该IRP请求。

5、返回STATUS_REPARSE


I/O管理器接收到该返回后,便会触发另一个文件打开操作,并发送一个IRP_MJ_CREATE的请求。
‍而目标文件可以是本地或远程计算机。而若要重定向远程文件打开操作,文件名要遵循以下语法:
"/??/UNC/HostName/Share/File" 或 "/Device/Mup/HostName/Share/File" 或
"/Device/LanmanagerRedirector/HostName/Share/File"(在你的目标文件是CIFS/SMB/LanManager的情况下)
在你的首次打开/创建文件操作是相对于另一个文件对象的时候,没有必有修改FILE_OBJECT的RelatedFileObject域。在重定向时,I/O管理器只考虑FileName域,而不考虑RelatedFileObject域(在I/O管理器收到STATUS_REPARSE后,它便会释放该域)。
I/O管理器为了避免重定向的无限循环,在嵌套循环中加了一些限制:重定向操作的最大嵌套次数是32.
//在IRP_MJ_CREATE例程里添加如下代码:

irpSp = IoGetCurrentIrpStackLocation(Irp);
RtlInitUnicodeString(&cmpFileName, L"//hello.txt");
KdPrint((">>> Create/Open FileName:%ws/n", irpSp->FileObject->FileName.Buffer));

if (RtlCompareUnicodeString(&cmpFileName, &irpSp->FileObject->FileName, FALSE) == 0)
{
	pusFileName = &(irpSp->FileObject->FileName);

	/*方法很简单
	就是把FileObject->FileName.Buffer释放掉
	然后自己ExAllocatePool...分配一个缓冲区用于保存重定向的文件名 这里需要是全文件名
	FileObject->FileName指向新分配的缓冲区
	把新文件名拷贝到FileObject->FileName里
	设置Irp->IoStatus的值如下
	Irp->IoStatus.Status = STATUS_REPARSE;
	Irp->IoStatus.Information = IO_REPARSE;
	返回STATUS_REPARSE
	经测试跨卷访问也可以*/

	RtlInitUnicodeString(&usNewFileName, L"//??//E://123//hello.txt");

	pwNewNameBuffer = ExAllocatePool(PagedPool, usNewFileName.MaximumLength);

	if (pwNewNameBuffer == NULL)
	{
		Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES;
		Irp->IoStatus.Information = 0;
		IoCompleteRequest( Irp, IO_NO_INCREMENT );
		return STATUS_INSUFFICIENT_RESOURCES;
	}

	ExFreePool( pusFileName->Buffer );
	pusFileName->Buffer = pwNewNameBuffer;
	pusFileName->MaximumLength = usNewFileName.MaximumLength;
	RtlCopyUnicodeString(pusFileName, &usNewFileName);

	Irp->IoStatus.Status = STATUS_REPARSE;
	Irp->IoStatus.Information = IO_REPARSE;
	IoCompleteRequest( Irp, IO_NO_INCREMENT );

	return STATUS_REPARSE;
}



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: DFT(Design for Testability,可测试性设计)是一种在集成电路设计中用于简化测试和验证过程的方法。而hookup_pin是其中一种用于连接测试设备和电路芯片的方法。 在集成电路设计中,测试设备需要与电路芯片中的信号引脚(Pin)进行连接,以便能够向芯片输入测试信号或者读取芯片的输出信号。这些信号引脚通常是设计中的输入输出端口,也可能是专门为测试而设计的引脚。 使用hookup_pin时,首先需要确定需要连接的测试引脚。然后,根据测试设备的需求,确定测试引脚的电气连接方式,例如需要使用特定的电阻、电容或者电压源。接下来,将测试设备的连接线与测试引脚进行物理连接,确保连接线能够稳定地传递测试信号。 使用hookup_pin时,需要注意以下几点: 1. 确保连接线的质量和稳定性,防止信号传输的失真或者干扰。 2. 根据测试需求,合理选择连接方式和参数,以保证测试的准确性和可靠性。 3. 在设计电路芯片时,要考虑到测试引脚的位置和数量,以便在实际连接时能够方便地访问到它们。 4. 进行测试时,要注意测试设备和测试引脚的电气兼容性,避免产生不正常的电气相互作用。 总之,使用hookup_pin时,需要根据测试要求选择合适的测试引脚并进行正确的物理连接,以保证测试信号的有效传递和测试的可靠性。这样可以提高集成电路设计的可测试性,并降低测试成本和时间。 ### 回答2: DFT是Design for Testability(可测试性设计)的缩写,是电子设计中一个重要的概念。在设计过程中,为了方便测试电路的功能和性能,通常会在芯片设计的每个功能模块中添加一些特殊的信号引脚,这些引脚被称为DFT hookup pin(测试引脚)。 DFT hookup pin的作用是为测试提供额外的接口和信号。通过这些引脚,测试工程师可以在实际测试中获取电路内部的状态信息,控制电路的各个模块,以及监测电路的性能指标。这些信号可以用来诊断故障、测试电路的可靠性和性能,以及辅助电路的制造和调试。 DFT hookup pin的使用方法取决于具体的设计需求和测试目标。在设计过程中,设计工程师需要考虑和定义测试采集的信号类型、时机和触发条件。通常,测试信号可以是控制信号、状态信号或者是测试模式生成器所需的信号。这些引脚需要与测试芯片的引脚互连,并且在设计时需要做好信号隔离和保护,以确保测试的准确性和可靠性。 在测试阶段,测试工程师会使用特定的测试设备和工具,连接到芯片的DFT hookup pin上,以进行功能测试、逻辑诊断、时序测试等。通过这些引脚,测试工程师可以访问电路的内部,改变电路的状态,并获取测试结果。同时,还可以通过DFT hookup pin进行扫描链测试、BIST(内建自测试)等功能测试,以提高测试效率和覆盖率。 综上所述,DFT hookup pin在芯片设计中起到了关键的作用,可以为测试工程师提供有效的测试接口和信号。合理使用DFT hookup pin可以提高测试的效率、可靠性和覆盖率,从而降低产品的故障率,提高制造和测试流程的效率。 ### 回答3: dft (Design for Testability,可测试性设计)是一种设计技术,它旨在使电路设计能够更容易进行测试和诊断。 dft hookup_pin是一种用于电路设计中的接线和连线标识。在进行电路设计时,我们通常需要在设计中添加一些特定的电路元件来实现测试和调试的功能。这些电路元件可以是诊断点、检测电路、测量电路等。 dft hookup_pin的使用方法如下: 1. 标识测试点:在设计电路图中,我们可以使用dft hookup_pin来标识测试点。测试点是用于进行测试和诊断的特定电路节点。通过在设计中添加dft hookup_pin来标识测试点,测试工程师可以更容易地访问这些关键节点。 2. 连接测量仪器:在进行测试时,我们需要将测量仪器(如示波器、多用表等)连接到测试点来进行测量和分析。通过使用dft hookup_pin,我们可以将测量仪器与电路设计中标识的测试点连接起来,以实现对测试点的测量。 3. 实现测试模式切换:在某些情况下,我们可能需要在设计中添加一些特殊的电路元件来实现测试模式的切换。通过使用dft hookup_pin,我们可以将这些特殊的电路元件与设计中的特定节点连接起来,以实现测试模式的切换。 总之,dft hookup_pin是一种有助于实现电路测试和调试的设计标识。通过在设计中添加dft hookup_pin来标识测试点和连接测试仪器,我们可以更容易地进行电路测试和诊断工作,提高设计的可测试性和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值