LARGE_INTEGER数据类型解析

本文详细介绍了Windows驱动开发中使用的LARGE_INTEGER数据结构。该结构通过联合体实现,包含三种定义方式,分别是通过高低32位整数组合表示64位整数的小端模式和大端模式,以及直接使用LONGLONG类型表示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

驱动开发中,我们除了可以使用LONGLONG这个表示64位结构的数据外。还可以使用一个叫做LARGE_INTEGER的数据结构来表示64位数据。它的定义如下

typedef union _LARGE_INTEGER {
    struct {
        ULONG LowPart;
        LONG HighPart;
    } DUMMYSTRUCTNAME;
    struct {
        ULONG LowPart;
        LONG HighPart;
    } u;
#endif //MIDL_PASS
    LONGLONG QuadPart;
} LARGE_INTEGER;

LARGE_INTEGER是一个联合体。设计的非常巧妙。联合体中的3个元素可以被认为是LARGE_INTEGER的3个定义
(1)DUMMYSTRUCTNAME由2部分组成。一个是低位的32位整数LowPart。另一个就是高位的整数咯。在小端的情况下。低32位数字在前。高32位在后。

如果将这个64位整数赋值100.可以这么写


    LARGE_INTEGER value;
    value.LowPart = 100;
    value.HighPart = 0;
(2)u由2部分组成。一个是低位的32位整数LowPart。另一个就是高位的整数咯。在大端的情况下。高32位数字在前。低32位在后。
如果将这个64位整数赋值100.可以这么写
    LARGE_INTEGER value;
    value.u.LowPart = 100;//改成:大端时value.u.LowPart = 0
    value.u.HighPart = 0;//改成:大端时 value.u.HighPart = 100
(3)当LARGE_INTEGER 等价于LONGLONG的时候。如果将这个64位整数赋值100.可以这么写

    LARGE_INTEGER value;
    value.QuadPart = 100;

————————————————
版权声明:本文为优快云博主「more-think」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/nowayings/article/details/44812201

#include <windows.h> #include <winioctl.h> #include <iostream> #include <vector> #include <string> // MFT相关结构定义 #pragma pack(push, 1) struct ATTRIBUTE_HEADER { DWORD type; DWORD length; BYTE non_resident; BYTE name_length; WORD name_offset; DWORD flags; WORD instance; }; struct FILE_NAME_ATTRIBUTE { DWORD parent_ref; DWORD parent_seq; LARGE_INTEGER ctime; LARGE_INTEGER mtime; LARGE_INTEGER atime; LARGE_INTEGER alloc_size; LARGE_INTEGER real_size; DWORD flags; DWORD reparse; BYTE name_length; WCHAR name[1]; }; #pragma pack(pop) std::vector<std::wstring> image_extensions = { L".jpg", L".jpeg", L".png", L".gif", L".bmp", L".tiff", L".webp", L".raw" }; bool is_image_file(const std::wstring& filename) { size_t dot_pos = filename.find_last_of(L'.'); if (dot_pos == std::wstring::npos) return false; std::wstring ext = filename.substr(dot_pos); for (const auto& img_ext : image_extensions) { if (_wcsicmp(ext.c_str(), img_ext.c_str()) == 0) return true; } return false; } void scan_volume(const wchar_t* volume_path) { HANDLE hVolume = CreateFileW( volume_path, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL ); if (hVolume == INVALID_HANDLE_VALUE) { std::wcerr << L"无法打开卷: " << volume_path << L" 错误: " << GetLastError() << std::endl; return; } NTFS_VOLUME_DATA_BUFFER vol_data; DWORD bytes_returned; if (!DeviceIoControl( hVolume, FSCTL_GET_NTFS_VOLUME_DATA, NULL, 0, &vol_data, sizeof(vol_data), &bytes_returned, NULL)) { CloseHandle(hVolume); return; } // 读取MFT的逻辑需要在此继续实现 // (实际实现需要处理分页读取、属性解析等复杂操作) CloseHandle(hVolume); } int main() { scan_volume(L"\\\\.\\C:"); return 0; }
最新发布
03-21
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值