首页
社区
课程
招聘
如何在驱动中获取指定文件的大小
发表于: 2015-9-10 03:13 3910

如何在驱动中获取指定文件的大小

2015-9-10 03:13
3910
新手不懂,如何在驱动中获取指定文件的大小。百度找了一些源码作参考

WIN32下实现
DLLAPI long APICALL getfilesize(LPTSTR filepath)
{
  HANDLE handle = CreateFile(filepath, FILE_READ_EA, 
    FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);  
  if (handle != INVALID_HANDLE_VALUE)  
  {  
    long size = GetFileSize(handle, NULL);  
    CloseHandle(handle);  
    return size;
  }
  else
  {
    return 0;
  }
}

驱动中实现:

NTSTATUS MyCreateFile(OUT PHANDLE lpFileHandle,
  IN PUNICODE_STRING usFileName,
  IN ULONG dwDesiredAccess,
  IN ULONG dwShareAccess,
  IN ULONG dwCreateDisposition,
  IN ULONG dwCreateOptions)
{
  NTSTATUS ntStatus = STATUS_UNSUCCESSFUL;
  OBJECT_ATTRIBUTES oaName;
  IO_STATUS_BLOCK iosBlock;
  if (lpFileHandle != NULL && usFileName != NULL && usFileName->Buffer != NULL)
  {
    if (PASSIVE_LEVEL != KeGetCurrentIrql()) 
    {
      DbgPrint("IRQL错误\n");
      return ntStatus;
    }
    InitializeObjectAttributes(&oaName,
      usFileName,
      OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
      NULL,
      NULL);
    ntStatus = ZwCreateFile(lpFileHandle,
      dwDesiredAccess,
      &oaName,
      &iosBlock,
      NULL,
      FILE_ATTRIBUTE_NORMAL,
      dwShareAccess,
      dwCreateDisposition,
      dwCreateOptions,
      NULL,
      0);
    if (!NT_SUCCESS(ntStatus))
    {    
      DbgPrint("[MyCreateFile]ZwCreateFile(%ws)failed with error:%08x\r\n", usFileName->Buffer, ntStatus);    
      return ntStatus;
    }
  }
  return ntStatus;
}

NTSTATUS MyCloseFile(IN HANDLE hFile)
{
  return ZwClose(hFile);
}

BOOL testCreateFile (IN PUNICODE_STRING filename)
{
  
  HANDLE hFile=NULL;
  NTSTATUS status;
    IO_STATUS_BLOCK isb;
    OBJECT_ATTRIBUTES oa;

    InitializeObjectAttributes(&oa,filename,OBJ_CASE_INSENSITIVE|OBJ_KERNEL_HANDLE,NULL,NULL);

    status=ZwCreateFile(&hFile,GENERIC_ALL,&oa,&isb,NULL,FILE_ATTRIBUTE_NORMAL,FILE_SHARE_READ,FILE_CREATE,FILE_NON_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT,NULL,0);

  if(NT_SUCCESS(status))
  {
    status=STATUS_SUCCESS;
  }
  else
  {
    status=isb.Status;
  }

  DbgPrint("hFile=%08X",hFile);

  if(hFile)
  {
    ZwClose(hFile);
  }
  return status;

}

自己测试:
void daimaceshi()
{
  UNICODE_STRING str = RTL_CONSTANT_STRING(L"E:\\1.txt");
  HANDLE FileHandle=NULL;
  MyCreateFile(&FileHandle,&str,8,1,3,0);
}

在E盘有1.txt这个文件的前提下,打开错误,返回值0xC000003B

希望大大们能多提供一些源码,本人扣扣 3799 05426

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 32
活跃值: (34)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
这样试试,UNICODE_STRING str = RTL_CONSTANT_STRING(L"\\??\\E:\\1.txt");
2015-9-10 11:57
0
雪    币: 40
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
驱动的路径不是这么搞的
2015-9-10 12:25
0
雪    币: 136
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
成功解决,源码贴上
ULONG getfilesize(WCHAR* a)
{
        ULONG r=0;
        UNICODE_STRING FileName;  
        //RtlInitUnicodeString(&FileName,L"\\??\\E:\\1.txt");
        RtlInitUnicodeString(&FileName,a);
        //DbgPrint("文件名%ws\n",FileName.Buffer);
        HANDLE hFile=NULL;  
        OBJECT_ATTRIBUTES objAttribute;  
        IO_STATUS_BLOCK io_Status_block;
        InitializeObjectAttributes(&objAttribute,&FileName,OBJ_CASE_INSENSITIVE,NULL,NULL);  
        if (!NT_SUCCESS(ZwCreateFile(&hFile,GENERIC_READ,&objAttribute,&io_Status_block,NULL,FILE_ATTRIBUTE_NORMAL,  
                FILE_SHARE_READ , FILE_OPEN , FILE_SYNCHRONOUS_IO_NONALERT , NULL , 0 )))  
        {  
                //DbgPrint(("文件打开失败\r\n"));  
        }  
        else  
        {  
                //DbgPrint(("文件打开成功\r\n"));  
        }  
        if (hFile)
        {
                FILE_STANDARD_INFORMATION fsi;  
                ZwQueryInformationFile(hFile,&io_Status_block,&fsi,sizeof(FILE_STANDARD_INFORMATION),FileStandardInformation);
                r=fsi.EndOfFile.QuadPart;
                //DbgPrint("文件长度=%u\r\n",fsi.EndOfFile.QuadPart);  
        }
        if (hFile)
        {
                ZwClose(hFile);
        }
        return r;
        //DbgPrint("文件句柄=%X\n",(hFile));
}
2015-9-11 01:07
0
游客
登录 | 注册 方可回帖
返回
//