Window内核函数 - 获取或修改文件属性

        获取和修改文件属性,包括获取文件大小、获取或修改文件指针位置、获取或修改文件名、获取或修改文属性(只读属性、隐藏属性)、获取或修改文件创建、修改日期等。DDK提供了内核函数 ZwSetInformationFile 和 ZwQueryInformationFile 函数来进行获取和修改文件属性。

NTSTATUS ZwSetInformationFile(
    IN HANDLE FileHandle,
    OUT PIO_STATUS_BLOCK IoStatusBlock,
    IN PVOID FileInformation,
    IN ULONG Length,
    IN FILE_INFORMATION_CLASS FileInformationClass
    );
// FileHandle: 文件句柄
// IoStatusBlock:返回设置的状态
// FileInformation:依据 FileInformation 不同而不同。作为输入信息、
// Length:FileInformation 数据的长度
// FileInformationClass:描述修改属性的类型
NTSTATUS ZwQueryInformationFile(
    IN HANDLE FileHandle,
    OUT PIO_STATUS_BLOCK IoStatusBlock,
    OUT PVOID FileInformation,
    IN ULONG Length,
    IN FILE_INFORMATION_CLASS FileInformationClass
    );
// FileHandle: 文件句柄
// IoStatusBlock:返回设置的状态
// FileInformation:依据 FileInformation 不同而不同。作为输入信息、
// Length:FileInformation 数据的长度
// FileInformationClass:描述修改属性的类型

这两个函数的参数基本相同。其中 FileInformationClass执行修改或者查询的类别。

(1). 当 FileInformationClass 是 FileStandardInformation 时,输入和输出的数据是 FILE_STANDARD_INFORMATION 结构体,描述文件的基本信息。

typedef struct _FILE_STANDARD_INFORMATION {
    LARGE_INTEGER AllocationSize;      // 为文件分配的大小(注:这个不是文件大小,而是可能所需要的大小)
    LARGE_INTEGER EndOfFile;         // 距离文件结束还有多少个字节
    ULONG NumberOfLinks;            // 有多少个链接文件
    BOOLEAN DeletePending;            // 是否准备删除 
    BOOLEAN Directory;                // 是否为目录
} FILE_STANDARD_INFORMATION, *PFILE_STANDARD_INFORMATION;

(2). 当 FileInformationClass 是 FileBasicInformation 时,输入和输出的数据是 FILE_BASIC_INFORMATION 结构体,描述文件的基本信息。

typedef struct _FILE_BASIC_INFORMATION {
    LARGE_INTEGER CreationTime;     // 文件创建时间
    LARGE_INTEGER LastAccessTime;    // 最后访问时间
    LARGE_INTEGER LastWriteTime;    // 最后写时间
    LARGE_INTEGER ChangeTime;        // 修改修改时间
    ULONG FileAttributes;            // 文件属性
} FILE_BASIC_INFORMATION, *PFILE_BASIC_INFORMATION;

其中,时间参数是从一个LARGE_INTEGER的整数,该证书代表从1901年经过多少个10ns(纳秒)。
    FileAttributes 描述文件属性。 
        FILE_ATTRIBUTE_NORMAL 描述一般文件。 
        FILE_ATTRIBUTE_DIRECTORY 描述是目录。
        FILE_ATTRIBUTE_READONLY 描述该文件为只读。
        FILE_ATTRIBUTE_HIDDEN 代表隐含文件。
        FILE_ATTRIBUTE_SYSTEM 代表系统文件。
        
(3). 当 FileInformationClass 是 FileNameInformation时,输入和输出的数据是 FILE_NAME_INFORMATION 结构体,描述文件名信息。

typedef struct _FILE_NAME_INFORMATION {
    ULONG FileNameLength;   // 文件名长度
    WCHAR FileName[1];        // 文件名
} FILE_NAME_INFORMATION, *PFILE_NAME_INFORMATION;    

注意: 这里指定文件名的字符串是宽字符集字符串。

(4). 当 FileInformationClass 是 FilePositionInformation 时, 输入和输出的数据是 FILE_POSITION_INFORMATION 结构体,描述文件名信息。
    

typedef struct _FILE_POSITION_INFORMATION {
    LARGE_INTEGER CurrentByteOffset; // 代表当前文件指针位置
} FILE_POSITION_INFORMATION, *PFILE_POSITION_INFORMATION;

下面的代码演示了如何使用ZwQueryInformationFile函数查询、修改文件属性。

	OBJECT_ATTRIBUTES  objectAttri;
	IO_STATUS_BLOCK iostatus;
	HANDLE hfile;
	UNICODE_STRING logFileUnicodeStr;

	// 初始化 UNICODE_STRING 字符串
	RtlInitUnicodeString(&logFileUnicodeStr, L"\\?\\C:\\1.LOG");
	// 或者写成 “\\Device\\hARDDISKvOLUME\\1.LOG”

	// 初始化 objectAttri
	InitializeObjectAttributes(&objectAttri,
		&logFileUnicodeStr,
		OBJ_CASE_INSENSITIVE,
		NULL,
		NULL
		);

	// 创建文件
	NTSTATUS ntStatus = ZwCreateFile(&hfile,
		GENERIC_READ,
		&objectAttri,
		&iostatus,
		NULL,
		FILE_ATTRIBUTE_NORMAL,
		0,
		FILE_OPEN, // 打开文件,如果不存在则返回错误
		FILE_SYNCHRONOUS_IO_NONALERT,
		NULL,
		0
		);

	if (NT_SUCCESS(ntStatus))
	{
		KdPrint(("Open file successuflly. \n"));
	}

	FILE_STANDARD_INFORMATION fsi;
	ntStatus = ZwQueryInformationFile(hfile, 
		&iostatus,
		&fsi,
		sizeof(FILE_STANDARD_INFORMATION),
		FileStandardInformation
		);

	if (NT_SUCCESS(ntStatus))
	{
		KdPrint(("file length: %u\n", fsi.EndOfFile.QuadPart));
	}

	// 修改当前文件指针
	FILE_POSITION_INFORMATION  fpi;
	fpi.CurrentByteOffset.QuadPart = 100i64;
	ntStatus = ZwSetInformationFile(hfile, 
		&iostatus,
		&fpi,
		sizeof(FILE_POSITION_INFORMATION),
		FilePositionInformation
		);

	if (NT_SUCCESS(ntStatus))
	{
		KdPrint(("update the file pointer successfully. \n"));
	}

	// 关闭文件句柄
	ZwClose(hfile);

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
h5 window.webkit.messageHandlers是指在H5页面中使用webkit内核浏览器的window对象下的messageHandlers属性。该属性用于在H5页面和原生应用之间进行消息传递和通信。 在H5页面中,可以使用window.webkit.messageHandlers向原生应用发送消息,并接收原生应用的响应。通过这种方式,H5页面可以与原生应用进行交互,实现一些原生应用特有的功能或者获取原生应用的数据。 为了实现消息的传递和通信,需要在H5页面和原生应用中进行相应的配置和处理。在H5页面中,可以使用window.webkit.messageHandlers.messageName.postMessage(messageBody)来向原生应用发送消息,其中messageName是消息的名称,messageBody是要发送的消息内容。原生应用可以通过相应的方式,在收到消息后进行处理,并通过回调函数或者其他方式向H5页面发送响应。 使用window.webkit.messageHandlers可以实现H5和原生应用之间的双向通信,通过发送不同的消息和数据,可以实现各种功能需求。例如,可以通过发送消息来实现原生应用的登录认证、分享功能、调用原生摄像头拍照或者调用其他原生设备等操作。 总之,h5 window.webkit.messageHandlers是H5页面中与原生应用进行消息传递和通信的一种机制,通过这种机制可以实现H5页面与原生应用的交互和功能扩展。使用该机制时需要进行相应的配置和处理,以便实现正常的消息传递和通信。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WendyWJGu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值