liangyufei
驱动小牛
驱动小牛
  • 注册日期2006-01-16
  • 最后登录2021-10-12
  • 粉丝0
  • 关注0
  • 积分1019分
  • 威望588点
  • 贡献值2点
  • 好评度95点
  • 原创分0分
  • 专家分0分
  • 社区居民
阅读:3125回复:9

如何在驱动里面创建稀疏文件

楼主#
更多 发布于:2008-08-15 10:12
请教各位大虾,如何在驱动里面创建稀疏文件?
clicx
驱动老牛
驱动老牛
  • 注册日期2003-10-03
  • 最后登录2016-07-26
  • 粉丝0
  • 关注0
  • 积分792分
  • 威望696点
  • 贡献值41点
  • 好评度499点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2008-08-31 23:06
IRP_MJ_SET_INFORMATION

FILE_BASIC_INFORMATION
---内核开发合作或提供基础技术服务QQ:22863668 ---
mlkflkf
驱动牛犊
驱动牛犊
  • 注册日期2006-06-21
  • 最后登录2019-08-08
  • 粉丝1
  • 关注0
  • 积分13分
  • 威望93点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
  • 社区居民
板凳#
发布于:2008-09-01 12:30
ZwCreateFile                 创建文件
ZwFsControlFile           关键在这里,向文件系统发送稀疏控制码,与上层应用是一样的
ZwSetInformationFile  设置大小

如果还不会就加我qq:8060817
liangyufei
驱动小牛
驱动小牛
  • 注册日期2006-01-16
  • 最后登录2021-10-12
  • 粉丝0
  • 关注0
  • 积分1019分
  • 威望588点
  • 贡献值2点
  • 好评度95点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2008-09-26 09:01
谢谢楼上的两位
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
地下室#
发布于:2008-09-26 09:09
发挥中国特色,直接抄FILEDISK的,嘿嘿。。。。。。
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
mlkflkf
驱动牛犊
驱动牛犊
  • 注册日期2006-06-21
  • 最后登录2019-08-08
  • 粉丝1
  • 关注0
  • 积分13分
  • 威望93点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
  • 社区居民
5楼#
发布于:2008-09-26 10:44
wowocock 老大:
不一定要抄filedisk吧,只是一个创建文件而已。
我了解filedisk驱动源码,里面只是创建实文件,不是稀疏文件。创建稀疏文件还有一条件必须在NTFS文件系统下才能创建。
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
6楼#
发布于:2008-09-27 09:41
引用第5楼mlkflkf于2008-09-26 10:44发表的  :
wowocock 老大:
不一定要抄filedisk吧,只是一个创建文件而已。
我了解filedisk驱动源码,里面只是创建实文件,不是稀疏文件。创建稀疏文件还有一条件必须在NTFS文件系统下才能创建。

FileDisk
Release 14 (2006-01-05)
FileDisk is a virtual disk driver for Windows NT/2000/XP that uses one or more files to emulate physical disks. A console application is included that let you dynamically mount and unmount files. An example of use for this driver is if you have made plans spending the weekend writing an RAID driver for NT but find you are short of disks. FileDisk can also use CD-images.
Latest news: Works on Windows XP, FileDisk images can be stored on network drives, support for CD-images, support for UNC paths, support for sparse files.
Screenshot of an example of use.
filedisk.zip
FileDisk can use sparse files as disk images. A sparse file is a file were suficiently large blocks of zeros isn't allocated disk space. You can create sparse files with the tool mksparse.zip. To see how much disk space a file actually uses right click on the file and choose properties. If you for example creates a sparse file of 4GB, mounts it in FileDisk and formats it to NTFS, it will only take up 24MB on disk but looks like a normal disk of 4GB. When you copy files to it the used disk space will automatically increase.


/*
    Program to create a sparse file.
    Copyright (C) 2002 Bo Brant閚.
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
*/

#include <windows.h>
#include <winioctl.h>
#include <stdio.h>
#include <stdlib.h>

void PrintLastError(char* Prefix)
{
    LPVOID lpMsgBuf;

    FormatMessage(
        FORMAT_MESSAGE_ALLOCATE_BUFFER |
        FORMAT_MESSAGE_FROM_SYSTEM |
        FORMAT_MESSAGE_IGNORE_INSERTS,
        NULL,
        GetLastError(),
        0,
        (LPTSTR) &lpMsgBuf,
        0,
        NULL
        );

    fprintf(stderr, "%s: %s", Prefix, (LPTSTR) lpMsgBuf);

    LocalFree(lpMsgBuf);
}

int __cdecl main(int argc, char* argv[])
{
    LARGE_INTEGER   FileSize;
    HANDLE          FileHandle;
    DWORD           BytesReturned;

    if (argc < 2 || argc > 3)
    {
        fprintf(stderr, "syntax: mksparse <filename> [size[k|M|G]]\n");
        return -1;
    }

    if (argc == 3)
    {
        if (argv[2][strlen(argv[2]) - 1] == 'G')
        {
            FileSize.QuadPart = _atoi64(argv[2]) * 1024 * 1024 * 1024;
        }
        else if (argv[2][strlen(argv[2]) - 1] == 'M')
        {
            FileSize.QuadPart = _atoi64(argv[2]) * 1024 * 1024;
        }
        else if (argv[2][strlen(argv[2]) - 1] == 'k')
        {
            FileSize.QuadPart = _atoi64(argv[2]) * 1024;
        }
        else
        {
            FileSize.QuadPart = _atoi64(argv[2]);
        }
    }
    else
    {
        FileSize.QuadPart = 0;
    }

    FileHandle = CreateFile(
        argv[1],
        GENERIC_READ | GENERIC_WRITE,
        FILE_SHARE_READ | FILE_SHARE_WRITE,
        NULL,
        CREATE_NEW,
        FILE_FLAG_NO_BUFFERING,
        NULL
        );

    if (FileHandle == INVALID_HANDLE_VALUE)
    {
        PrintLastError(argv[1]);
        return -1;
    }

    if (!DeviceIoControl(
        FileHandle,
        FSCTL_SET_SPARSE,
        NULL,
        0,
        NULL,
        0,
        &BytesReturned,
        NULL
        ))
    {
        PrintLastError(argv[1]);
        return -1;
    }

    if (!SetFilePointerEx(FileHandle, FileSize, 0, FILE_BEGIN))
    {
        PrintLastError(argv[1]);
        return -1;
    }

    if (!SetEndOfFile(FileHandle))
    {
        PrintLastError(argv[1]);
        return -1;
    }

    CloseHandle(FileHandle);

    return 0;
}
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
mlkflkf
驱动牛犊
驱动牛犊
  • 注册日期2006-06-21
  • 最后登录2019-08-08
  • 粉丝1
  • 关注0
  • 积分13分
  • 威望93点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
  • 社区居民
7楼#
发布于:2008-09-27 09:57
wowocock 老大:
这是在应用层里面代码,楼主是要驱动里面代码,看清楚啊。应用层的代码我想楼主肯定知道,在驱动里面我想楼主只是不知道用ZwFsControlFile发送稀疏控制码而已。
liangyufei
驱动小牛
驱动小牛
  • 注册日期2006-01-16
  • 最后登录2021-10-12
  • 粉丝0
  • 关注0
  • 积分1019分
  • 威望588点
  • 贡献值2点
  • 好评度95点
  • 原创分0分
  • 专家分0分
  • 社区居民
8楼#
发布于:2008-10-08 10:37
mlkflkf 讲得不错,我是需要在驱动里创建稀疏文件。不过也谢谢wowocock的热情帮助。
dreamsity
驱动小牛
驱动小牛
  • 注册日期2006-09-01
  • 最后登录2013-07-04
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望821点
  • 贡献值1点
  • 好评度68点
  • 原创分1分
  • 专家分0分
9楼#
发布于:2010-06-17 10:25
对着抄就是了
把Createfile换成ZwCreateFile,类似的。
一切都是时间问题!
游客

返回顶部