DeviceIoControl:通过API访问设备驱动程序;并获取window文件/文件夹id

1.设备句柄可以用API函数CreateFile获得。它的原型为

HANDLE CreateFile(

LPCTSTR lpFileName,                         // 文件名/设备路径

DWORD dwDesiredAccess,                      // 访问方式

DWORD dwShareMode,                          // 共享方式

LPSECURITY_ATTRIBUTES lpSecurityAttributes, // 安全描述符指针

DWORD dwCreationDisposition,                // 创建方式

DWORD dwFlagsAndAttributes,                 // 文件属性及标志

HANDLE hTemplateFile                        // 模板文件的句柄

);

2.DeviceIoControl的函数原型为

BOOL DeviceIoControl(

HANDLE hDevice,              // 设备句柄

DWORD dwIoControlCode,       // 控制码

LPVOID lpInBuffer,           // 输入数据缓冲区指针

DWORD nInBufferSize,         // 输入数据缓冲区长度

LPVOID lpOutBuffer,          // 输出数据缓冲区指针

DWORD nOutBufferSize,        // 输出数据缓冲区长度

LPDWORD lpBytesReturned,     // 输出数据实际长度单元长度

LPOVERLAPPED lpOverlapped    // 重叠操作结构指针

);

3.通过DeviceIoControl获取硬盘的基本参数示例

#include <windows.h>
#include <winioctl.h>
BOOL GetDriveGeometry(DISK_GEOMETRY *pdg)
{
    HANDLE hDevice;               // handle to the drive to be examined
    BOOL bResult;                 // results flag
    DWORD junk;                   // discard results
    hDevice = CreateFile("////.//PhysicalDrive0",  // drive to open
                    0,                // no access to the drive
                    FILE_SHARE_READ | // share mode
                    FILE_SHARE_WRITE,
                    NULL,             // default security attributes
                    OPEN_EXISTING,    // disposition
                    0,                // file attributes
                    NULL);            // do not copy file attributes
    if (hDevice == INVALID_HANDLE_VALUE) // cannot open the drive
    {
        return (FALSE);
    }
    bResult = DeviceIoControl(hDevice,     // device to be queried
        IOCTL_DISK_GET_DRIVE_GEOMETRY,     // operation to perform
                    NULL, 0,               // no input buffer
                    pdg, sizeof(*pdg),     // output buffer
                    &junk,                 // # bytes returned
                    (LPOVERLAPPED) NULL);  // synchronous I/O
    CloseHandle(hDevice);
    return (bResult);
}
int main(int argc, char *argv[])
{
    DISK_GEOMETRY pdg;            // disk drive geometry structure
    BOOL bResult;                 // generic results flag
    ULONGLONG DiskSize;           // size of the drive, in bytes
    bResult = GetDriveGeometry (&pdg);
    if (bResult)
    {
        printf("Cylinders = %I64d/n", pdg.Cylinders);
        printf("Tracks per cylinder = %ld/n", (ULONG) pdg.TracksPerCylinder);
        printf("Sectors per track = %ld/n", (ULONG) pdg.SectorsPerTrack);
        printf("Bytes per sector = %ld/n", (ULONG) pdg.BytesPerSector);

        DiskSize = pdg.Cylinders.QuadPart * (ULONG)pdg.TracksPerCylinder *
            (ULONG)pdg.SectorsPerTrack * (ULONG)pdg.BytesPerSector;
        printf("Disk size = %I64d (Bytes) = %I64d (Mb)/n", DiskSize,
            DiskSize / (1024 * 1024));
    }
    else
    {
        printf("GetDriveGeometry failed. Error %ld./n", GetLastError());
    }
    return ((int)bResult);
}

注:以上是从别的地方参考获取的,至于地址已经忘了,见谅~

4.获取window文件/文件夹id,如打开中的doc文件也可获取到

在window下,每个文件/文件夹都有一个专属的id,即便是拷贝的一个相同的文件,在window下的id都是不一样的。不过,office的文件会有所不同,如果你用office的文件执行了修改并保存,其实它的实际操作是你打开文件时,会创建一个缓存文件,然后当你修改完成并保存后,它会把当前的文件拷贝并到缓存文件中、删除原文件、重命名缓存文件,其实就相当于创建一个新的文件。所以,修改office文件,它window的id是会变化的。

但其它的文件则是唯一的。下面是获取的方法:

HANDLE hFile = INVALID_HANDLE_VALUE;
DWORD cbOut;
FILE_OBJECTID_BUFFER buf = {0};
QFileInfo file(filePath);
if (file.isDir())
{
    hFile = CreateFile((wchar_t*)filePath.utf16(),
    FILE_LIST_DIRECTORY,
    FILE_SHARE_READ | FILE_SHARE_WRITE ,
        NULL, //security attributes
        OPEN_EXISTING,
        FILE_FLAG_BACKUP_SEMANTICS | //<- the required priviliges for this flag are: SE_BACKUP_NAME and SE_RESTORE_NAME.  CPrivilegeEnabler takes care of that.
        NULL,
        NULL);
    }
    else
    {
        hFile = CreateFile((wchar_t*)filePath.utf16(), 0, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
    }

    if(hFile == INVALID_HANDLE_VALUE)
    {
        Q_DEBUG() << QString("CreateFile (%1) failed with: %2").arg(filePath).arg(GetLastError());
        fileID = "";
        return ret;
    }

    if (DeviceIoControl(hFile, FSCTL_CREATE_OR_GET_OBJECT_ID, NULL, 0, &buf, sizeof(buf), &cbOut, NULL)) //DeviceIoControl仅支持NTFS
    {
        GUID guid;
        CopyMemory(&guid, &buf.ObjectId, sizeof(GUID));
        WCHAR szGuid[39];
        StringFromGUID2(guid, szGuid, 39);
        fileID = QString::fromStdWString(szGuid);
        ret = true;
    }  

    CloseHandle(hFile);
时间: 2024-08-28 23:20:13

DeviceIoControl:通过API访问设备驱动程序;并获取window文件/文件夹id的相关文章

Linux设备驱动程序 之 获取当前时间

墙上时间 内核一般通过jiffies来获取当前时间,该数值表示的是最近一次系统启动到当前的时间间隔,它和设备驱动程序无关,因为它的声明期只限于系统的运行期:但是驱动程序可以用jiffies来计算不同事件之间的间隔:通常,利用jiffies值来测量时间间隔已经足够了,如果要测量更短的时间差,只能使用处理器特定的寄存器了,但这会带来严重的兼容性问题 驱动程序一般不需要知道墙钟时间,通常只有cron和syslogd这样的用户程序才使用,对真实世界时间的处理最好留给用户空间,C函数库提供了更好的支持:这

linux设备驱动程序该添加哪些头文件以及驱动常用头文件介绍(转)

原文链接:http://blog.chinaunix.net/uid-22609852-id-3506475.html 驱动常用头文件介绍 #include <linux/***.h> 是在linux-2.6.29/include/linux下面寻找源文件.#include <asm/***.h> 是在linux-2.6.29/arch/arm/include/asm下面寻找源文件.#include <mach/***.h> 是在linux-2.6.29/arch/ar

Linux设备驱动程序学习随笔1--从头文件 linux/moudle.h开始

所有的程序员入门的第一个程序都是从 Holle World 开始,linux嵌入式驱动开发也不例外,<Linux设备驱动程序>这本书的第一个程序就是hello world.然而,人生写驱动程序的第一次编译就异常的艰难. 以下是hello world 的程序,很简单,基本上学过C就能看懂,该程序包括两个头文件,引用了4个外部函数,内建2个函数. 1 #include <linux/init.h> 2 #include <linux/module.h> 3 4 MODULE

移动硬盘无法访问设备未就绪,里面的文件怎么找回

设备未就绪说明这个盘的文件系统结构损坏了.在平时如果数据不重要,那么可以直接格式化就能用了.但是有的时候里面的数据很重要,那么就必须先恢复出数据再格式化.具体恢复方法可以看正文了解(不格式化的恢复方法) 工具/软件:星空数据恢复软件 步骤1:先下载并解压软件运行后,直接双击需要恢复的分区,然后右击软件图标选择<以管理员身份运行> 步骤2:软件运行后,直接双击需要恢复的分区 步骤3:软件找出资料后,会放到与要恢复盘卷标名相同的目录中 步骤4:将要恢复的文件勾选,右击选择<复制勾选的文件&g

深入理解Linux内核-I/O体系结构和设备驱动程序

系统总线:1.链接CPU.RAM.I/O设备之间的数据流动.例如:PCI.ISA.EISA.MCA.SCSI.USB2.任何I\O设备有且仅能链接一条总线. I\O端口:1.每个连接到I\O总线上的设备都有自己的I\O地址集,通常称为I\O端口.2.一共提供了65536个8位的端口3.可以讲2个8位的看作一个16位的(必须从偶数开始),2个16位的看作一个32位的端口(必须从4倍数开始)4.对端口对读写命令 in.ins.out.outs5.为了提高性能提供控制寄存器.状态寄存器.输入寄存器.输

实战DeviceIoControl 之中的一个:通过API訪问设备驱动程序

P.bhw98 { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 9pt; PADDING-BOTTOM: 0px; MARGIN: 10px 0px 5px; LINE-HEIGHT: normal; PADDING-TOP: 0px; FONT-FAMILY: Verdana, Arial } PRE.bhw98 { FONT-SIZE: 9pt; PADDING-RIGHT: 5px; PADDING-LEFT: 5px; PADDIN

您在基于 Windows 7 的或基于 Windows Server 2008 R2 的计算机上读取器中插入智能卡时出现错误消息:&quot;设备驱动程序软件未能成功安装&quot;

http://support.microsoft.com/kb/976832/zh-cn http://support.microsoft.com/kb/976832/zh-tw 症状 当智能卡插入智能卡阅读器后时,Windows 尝试下载并安装智能卡 minidrivers 通过插服务卡.如果自定义的加密服务提供程序未在系统上安装智能卡的驱动程序在任一预配置位置,如 Windows 更新. WSUS 或 intranet 路径不可用,在通知区域中将收到以下错误消息: 未能成功安装设备驱动程序软

CreateFile DeviceIoControl dwIoControlCode——应用程序与驱动程序通信

在"进程内存管理器中"的一个Ring0,Ring3层通信问题,之前也见过这样的代码,这次拆分出来详细总结一下. 先通过CreateFile函数得到设备句柄,CreateFile函数原型: HANDLE CreateFile( LPCTSTR lpFileName, // 文件名/设备路径 设备的名称 DWORD dwDesiredAccess, // 访问方式 DWORD dwShareMode, // 共享方式 LPSECURITY_ATTRIBUTES lpSecurityAttr

时间、延迟(Linux设备驱动程序)

时间延迟 如何度量时间差,比较时间 如何获得当前时间 如何将操作延迟指定的一段时间 如何调度异步函数到指定的时间之后执行 度量时间差 内核通过定时器中断来跟踪时间流. 时钟中断由系统定时硬件以周期性的间隔产生,这个间隔由内核根据HZ的值设定,HZ是一个与体系结构有关的常数. 每当时钟中断发生时,内核内部计数器的值就增加一. 这个计数器的值在系统引导时被初始化为0,它的值就是自上次操作系统引导以来的时钟滴答数. 驱动程序开发者通常访问的是jiffies变量. 比较缓存值和当前值时,应该使用下面的宏