Ice@P
驱动牛犊
驱动牛犊
  • 注册日期2002-12-09
  • 最后登录2003-10-18
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1817回复:6

在驱动下面如何得到一个文件的大小?

楼主#
更多 发布于:2002-12-31 09:58
在驱动下面如何得到一个文件的大小?
  
好像用ZwQueryInformationFile()只能得到AllocationSize,
  
例如我一个34字节的文件,而allocationsize.QuadPart=2048.

最新喜欢:

lsq77lsq77
认认真真过一生
JungleBoy
驱动牛犊
驱动牛犊
  • 注册日期2002-10-17
  • 最后登录2009-09-07
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-12-31 10:26
在驱动下面如何得到一个文件的大小?
  
好像用ZwQueryInformationFile()只能得到AllocationSize,
  
例如我一个34字节的文件,而allocationsize.QuadPart=2048.

 


除了AllocationSize之外那个结构里面还有一个成员叫做EndOfFile。
I'm upgrading……
LIUTANG
驱动大牛
驱动大牛
  • 注册日期2001-03-30
  • 最后登录2020-12-27
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望58点
  • 贡献值0点
  • 好评度12点
  • 原创分0分
  • 专家分0分
  • 社区居民
板凳#
发布于:2003-01-23 21:41
楼上那位说的对啊。
AllocationSize表示这个文件在硬盘上占有多大的空间,应该和你的磁盘的簇(分配单元)的大小是有关,因为你的文件很小,所以AllocationSize就为一个簇的大小。
lu0
lu0
论坛版主
论坛版主
  • 注册日期2001-06-10
  • 最后登录2016-04-05
  • 粉丝2
  • 关注0
  • 积分-6311分
  • 威望21111点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-01-29 17:42
这是从我一个PROJ中扣出来的代码. 看思路巴.

PIRP Irp = 0;
PDEVICE_OBJECT TargetFs = 0;
PKEVENT CompleteEvent = (PKEVENT)ExAllocateFromNPagedLookasideList(&GlobalVar.EventPool); //KEVENT size is 12 bytes,
PIO_STACK_LOCATION IrpSp = 0;
PFILE_OBJECT fobj;
IO_STATUS_BLOCK IoStatusBlock = {0};
FILE_STANDARD_INFORMATION fsi = {0};

//build irp
fobj = pFobj;
TargetFs = IoGetRelatedDeviceObject(fobj);
Irp = IoAllocateIrp(TargetFs->StackSize,0);
if (!Irp)
{
IoStatusBlock.Status = STATUS_INSUFFICIENT_RESOURCES;
IoStatusBlock.Information = 0;
//KdPrint((\"SecuDisk: STATUS_INSUFFICIENT_RESOURCES when build fast QUERY IRP\\n\"));
return 0;
}
KeInitializeEvent(CompleteEvent,NotificationEvent,0);
IrpSp = IoGetNextIrpStackLocation(Irp);
IrpSp->DeviceObject = TargetFs;
Irp->Flags = 0;
Irp->AssociatedIrp.SystemBuffer = &fsi;
Irp->MdlAddress = 0;
Irp->UserBuffer = 0;
Irp->UserIosb = &IoStatusBlock;
Irp->UserEvent = CompleteEvent;
Irp->Tail.Overlay.Thread = PsGetCurrentThread();
Irp->Tail.Overlay.OriginalFileObject= fobj;
Irp->RequestorMode = KernelMode;
IrpSp->FileObject = fobj;
IrpSp->MajorFunction = IRP_MJ_QUERY_INFORMATION;
IrpSp->MinorFunction = 0;
IrpSp->Parameters.QueryFile.FileInformationClass = FileStandardInformation;
IrpSp->Parameters.QueryFile.Length = sizeof(fsi);
IoSetCompletionRoutine(Irp, FileOpCompletion, 0, TRUE, TRUE, TRUE);
//KdPrint((\"Call device %x for file size \\n\",TargetFs));
IoCallDriver(TargetFs,Irp);
KeWaitForSingleObject(CompleteEvent, Executive, KernelMode, TRUE, 0);
IoFreeIrp(Irp);
ExFreeToNPagedLookasideList(&GlobalVar.EventPool,CompleteEvent);
return fsi.EndOfFile.QuadPart;
Regards, Lu Lin Webmaster of Inside Programming http://www.lu0s1.com
vcmfc
驱动中牛
驱动中牛
  • 注册日期2001-03-23
  • 最后登录2008-01-28
  • 粉丝0
  • 关注0
  • 积分528分
  • 威望53点
  • 贡献值0点
  • 好评度52点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-01-30 12:15
最后参考:ifs kit for xp sp1:irpmain.pdf,你有想要的。
Axi
Axi
驱动牛犊
驱动牛犊
  • 注册日期2002-02-05
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-02-12 13:03
放在这里EndOfFile.QuadPart
举世而誉之而不加劝,举世而非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。
fossilme
驱动牛犊
驱动牛犊
  • 注册日期2003-01-24
  • 最后登录2011-01-10
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望16点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-02-12 14:31
//IFW_GetFileSize
//
ULONG IFW_GetFileSize(PUCHAR pProcessName)
{
NTSTATUS status;
OBJECT_ATTRIBUTES oa;
IO_STATUS_BLOCK iostatus;
HANDLE hfile;              //  the output from this process
FILE_STANDARD_INFORMATION si;
ULONG FileLength;
ANSI_STRING ansiPathName;
UNICODE_STRING uniPathName;
UCHAR TempPathName[255];

//Combile the PathName
//
RtlZeroMemory(TempPathName,255);
strcpy(TempPathName,\"\\\\??\\\\\");
strcat(TempPathName,pProcessName);
ansiPathName.Buffer=(PUCHAR)TempPathName;
ansiPathName.Length=(USHORT)strlen((PUCHAR)TempPathName);
ansiPathName.MaximumLength=(USHORT)strlen((PUCHAR)TempPathName);
status=RtlAnsiStringToUnicodeString(&uniPathName,&ansiPathName,TRUE);
if(!NT_SUCCESS(status))
{
return 0;
}

InitializeObjectAttributes(
&oa,
&uniPathName,//PUNICODE_STRING
OBJ_CASE_INSENSITIVE,
NULL,
NULL);

status = ZwCreateFile(&hfile,
 GENERIC_READ,
 &oa,
 &iostatus,
 NULL,
 FILE_ATTRIBUTE_NORMAL,
 FILE_SHARE_READ,
 FILE_OPEN,
 FILE_SYNCHRONOUS_IO_NONALERT,
 NULL,
 0);
if(NT_SUCCESS(status))
{
ZwQueryInformationFile(hfile, &iostatus, &si, sizeof(si), FileStandardInformation);
FileLength = si.EndOfFile.LowPart;
RtlFreeUnicodeString(&uniPathName);
ZwClose(hfile);
return FileLength;
}
else
{
RtlFreeUnicodeString(&uniPathName);
return 0;
}
}
游客

返回顶部