找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 6828|回复: 7

某段直接从磁盘读取文件的源码

 火.. [复制链接]

3

主题

13

回帖

0

精华

铜牌会员

积分
131
发表于 2012-2-3 13:34:28 | 显示全部楼层 |阅读模式
  1. NTSTATUS GetFileVolumeHandle(
  2.    IN UNICODE_STRING *NativePath,
  3.    OUT HANDLE *VolumeHandle)
  4. {
  5.    NTSTATUS NtStatus = STATUS_UNSUCCESSFUL;

  6.    WCHAR VolumeLetter[8];

  7.    UNICODE_STRING VolumeName;
  8.    OBJECT_ATTRIBUTES ObjectAttributes = {0};
  9.     IO_STATUS_BLOCK IoStatusBlock;


  10.    __try
  11.    {
  12.       if(NativePath == NULL)
  13.          return STATUS_INVALID_PARAMETER_1;

  14.       if(NativePath->Buffer == NULL ||
  15.          NativePath->Length == 0)
  16.       {
  17.          return STATUS_INVALID_PARAMETER_1;
  18.       }

  19.       if(VolumeHandle == NULL)
  20.          return STATUS_INVALID_PARAMETER_2;

  21.       if(NativePath->Buffer[0] != L'\\' ||
  22.          NativePath->Buffer[1] != L'?'  ||
  23.          NativePath->Buffer[2] != L'?'  ||
  24.          NativePath->Buffer[3] != L'\\' ||
  25.          NativePath->Buffer[5] != L':')
  26.       {
  27.          return STATUS_OBJECT_PATH_SYNTAX_BAD;
  28.       }

  29.       *VolumeHandle = NULL;


  30.       RtlZeroMemory(
  31.                  VolumeLetter,
  32.                  sizeof(VolumeLetter));
  33.       
  34.       NtStatus = StringCchPrintfW(
  35.                            VolumeLetter,
  36.                            sizeof(VolumeLetter),
  37.                            L"\\??\\%c:",
  38.                            NativePath->Buffer[4]);

  39.       if(SUCCEEDED(NtStatus))
  40.       {
  41.          RtlInitUnicodeString(
  42.                          &VolumeName,
  43.                          VolumeLetter);

  44.          ObjectAttributes.Length = sizeof(OBJECT_ATTRIBUTES);
  45.          ObjectAttributes.ObjectName = &VolumeName;
  46.          ObjectAttributes.Attributes = OBJ_CASE_INSENSITIVE;
  47.       
  48.          NtStatus = NtCreateFile(
  49.                            VolumeHandle,      // FileHandle
  50.                            GENERIC_READ |
  51.                            GENERIC_WRITE,     // DesiredAccess
  52.                            &ObjectAttributes, // ObjectAttributes
  53.                            &IoStatusBlock,    // IoStatusBlock
  54.                            NULL,              // AllocationSize OPTIONAL
  55.                            0,                 // FileAttributes
  56.                            FILE_SHARE_READ |
  57.                            FILE_SHARE_WRITE,  // ShareAccess
  58.                            FILE_OPEN,         // CreateDisposition
  59.                            0,                 // CreateOptions
  60.                            NULL,              // EaBuffer OPTIONAL
  61.                            0);                // EaLength

  62.          if(NtStatus)
  63.          {
  64.             DbgPrint((
  65.                     ">> GetFileVolumeHandle - NtCreateFile - %.8X\n",
  66.                     NtStatus));
  67.          }
  68.       }
  69.    }
  70.     __except(GetExceptionCode() ==
  71.           EXCEPTION_BREAKPOINT ?
  72.           EXCEPTION_CONTINUE_SEARCH :
  73.           EXCEPTION_EXECUTE_HANDLER)
  74.     {
  75.       DbgPrint((
  76.               ">> GetFileVolumeHandle - %.8X\n",
  77.               GetExceptionCode()));

  78.       return GetExceptionCode();
  79.     }

  80.     return NtStatus;
  81. }

  82. NTSTATUS GetFilePhysicalOffset(
  83.    IN UNICODE_STRING *NativePath,
  84.    OUT LONGLONG *PhysicalOffset)
  85. {
  86.    NTSTATUS NtStatus = STATUS_UNSUCCESSFUL;

  87.    HANDLE FileHandle;
  88.    HANDLE VolumeHandle;
  89.    ULONG RetrievalPointersLength = PAGE_SIZE;

  90.    OBJECT_ATTRIBUTES ObjectAttributes = {0};
  91.     IO_STATUS_BLOCK IoStatusBlock;

  92.    STARTING_VCN_INPUT_BUFFER StartingVcn = {0};
  93.    RETRIEVAL_POINTERS_BUFFER *RetrievalPointers = NULL;
  94.    NTFS_VOLUME_DATA_BUFFER VolumeData;
  95.    VOLUME_LOGICAL_OFFSET VolumeLogicalOffset;
  96.    VOLUME_PHYSICAL_OFFSETS VolumePhysicalOffsets;
  97.    

  98.    __try
  99.    {
  100.       if(NativePath == NULL)
  101.          return STATUS_INVALID_PARAMETER_1;

  102.       if(NativePath->Buffer == NULL ||
  103.          NativePath->Length == 0)
  104.       {
  105.          return STATUS_INVALID_PARAMETER_1;
  106.       }

  107.       if(PhysicalOffset == NULL)
  108.          return STATUS_INVALID_PARAMETER_2;

  109.       if(NativePath->Buffer[0] != L'\\' ||
  110.          NativePath->Buffer[1] != L'?'  ||
  111.          NativePath->Buffer[2] != L'?'  ||
  112.          NativePath->Buffer[3] != L'\\' ||
  113.          NativePath->Buffer[5] != L':')
  114.       {
  115.          return STATUS_OBJECT_PATH_SYNTAX_BAD;
  116.       }

  117.       *PhysicalOffset = 0;


  118.       ObjectAttributes.Length = sizeof(OBJECT_ATTRIBUTES);
  119.       ObjectAttributes.ObjectName = NativePath;
  120.       ObjectAttributes.Attributes = OBJ_CASE_INSENSITIVE;
  121.       
  122.       NtStatus = NtCreateFile(
  123.                         &FileHandle,       // FileHandle
  124.                         GENERIC_READ |
  125.                         GENERIC_WRITE,     // DesiredAccess
  126.                         &ObjectAttributes, // ObjectAttributes
  127.                         &IoStatusBlock,    // IoStatusBlock
  128.                         NULL,              // AllocationSize OPTIONAL
  129.                         0,                 // FileAttributes
  130.                         FILE_SHARE_READ |
  131.                         FILE_SHARE_WRITE,  // ShareAccess
  132.                         FILE_OPEN,         // CreateDisposition
  133.                         0,                 // CreateOptions
  134.                         NULL,              // EaBuffer OPTIONAL
  135.                         0);                // EaLength

  136.       if(NtStatus)
  137.       {
  138.          DbgPrint((
  139.                  ">> GetFilePhysicalOffset - NtCreateFile - %.8X\n",
  140.                  NtStatus));
  141.       }

  142.       if(NT_SUCCESS(NtStatus))
  143.       {
  144.          do
  145.          {
  146.             RetrievalPointers = RtlAllocateMemory(RetrievalPointersLength);

  147.             if(RetrievalPointers)
  148.             {
  149.                NtStatus = NtFsControlFile(
  150.                                     FileHandle,                        // FileHandle
  151.                                     NULL,                              // Event
  152.                                     NULL,                              // ApcRoutine
  153.                                     NULL,                              // ApcContext
  154.                                     &IoStatusBlock,                    // IoStatusBlock
  155.                                     FSCTL_GET_RETRIEVAL_POINTERS,      // FsControlCode
  156.                                     &StartingVcn,                      // InputBuffer
  157.                                     sizeof(STARTING_VCN_INPUT_BUFFER), // InputBufferLength
  158.                                     RetrievalPointers,                 // OutputBuffer
  159.                                     RetrievalPointersLength);          // OutputBufferLength
  160.                   
  161.                if(NtStatus == STATUS_INFO_LENGTH_MISMATCH)
  162.                {
  163.                   RtlFreeMemory(RetrievalPointers);

  164.                   RetrievalPointersLength *= 2;
  165.                }
  166.                else if(NT_ERROR(NtStatus))
  167.                {
  168.                   DbgPrint((
  169.                           ">> GetFilePhysicalOffset - FSCTL_GET_RETRIEVAL_POINTERS - %.8X\n",
  170.                           NtStatus));

  171.                   RtlFreeMemory(RetrievalPointers);

  172.                   NtClose(FileHandle);

  173.                   return NtStatus;
  174.                }
  175.             }
  176.             else
  177.             {
  178.                NtClose(FileHandle);

  179.                return STATUS_INSUFFICIENT_RESOURCES;
  180.             }

  181.          } while(NtStatus == STATUS_INFO_LENGTH_MISMATCH);

  182.          NtStatus = GetFileVolumeHandle(
  183.                                   NativePath,     // NativePath
  184.                                   &VolumeHandle); // VolumeHandle

  185.          if(NT_SUCCESS(NtStatus))
  186.          {
  187.             NtStatus = NtFsControlFile(
  188.                                  VolumeHandle,                     // FileHandle
  189.                                  NULL,                             // Event
  190.                                  NULL,                             // ApcRoutine
  191.                                  NULL,                             // ApcContext
  192.                                  &IoStatusBlock,                   // IoStatusBlock
  193.                                  FSCTL_GET_NTFS_VOLUME_DATA,       // FsControlCode
  194.                                  NULL,                             // InputBuffer
  195.                                  0,                                // InputBufferLength
  196.                                  &VolumeData,                      // OutputBuffer
  197.                                  sizeof(NTFS_VOLUME_DATA_BUFFER)); // OutputBufferLength

  198.             if(NtStatus)
  199.             {
  200.                DbgPrint((
  201.                        ">> GetFilePhysicalOffset - FSCTL_GET_NTFS_VOLUME_DATA - %.8X\n",
  202.                        NtStatus));
  203.             }

  204.             if(NT_SUCCESS(NtStatus))
  205.             {
  206.                VolumeLogicalOffset.LogicalOffset = RetrievalPointers->Extents[0].Lcn.QuadPart *
  207.                                           VolumeData.BytesPerCluster;

  208.                NtStatus = NtDeviceIoControlFile(
  209.                                         VolumeHandle,                     // FileHandle
  210.                                         NULL,                             // Event
  211.                                         NULL,                             // ApcRoutine
  212.                                         NULL,                             // ApcContext
  213.                                         &IoStatusBlock,                   // IoStatusBlock
  214.                                         IOCTL_VOLUME_LOGICAL_TO_PHYSICAL, // IoControlCode
  215.                                         &VolumeLogicalOffset,             // InputBuffer
  216.                                         sizeof(VOLUME_LOGICAL_OFFSET),    // InputBufferLength
  217.                                         &VolumePhysicalOffsets,           // OutputBuffer
  218.                                         sizeof(VOLUME_PHYSICAL_OFFSETS)); // OutputBufferLength

  219.                if(NtStatus)
  220.                {
  221.                   DbgPrint((
  222.                           ">> GetFilePhysicalOffset - IOCTL_VOLUME_LOGICAL_TO_PHYSICAL - %.8X\n",
  223.                           NtStatus));
  224.                }

  225.                if(NT_SUCCESS(NtStatus))
  226.                {
  227.                   *PhysicalOffset = (LONGLONG)(VolumePhysicalOffsets.PhysicalOffset[0].Offset /
  228.                                         VolumeData.BytesPerSector);
  229.                }
  230.             }

  231.             NtClose(VolumeHandle);
  232.          }

  233.          NtClose(FileHandle);

  234.          RtlFreeMemory(RetrievalPointers);
  235.       }
  236.     }
  237.     __except(GetExceptionCode() ==
  238.           EXCEPTION_BREAKPOINT ?
  239.           EXCEPTION_CONTINUE_SEARCH :
  240.           EXCEPTION_EXECUTE_HANDLER)
  241.     {
  242.       if(FileHandle)
  243.          NtClose(FileHandle);

  244.       if(VolumeHandle)
  245.          NtClose(VolumeHandle);

  246.       if(RetrievalPointers)
  247.          RtlFreeMemory(RetrievalPointers);

  248.       DbgPrint((
  249.               ">> GetFilePhysicalOffset - %.8X\n",
  250.               GetExceptionCode()));

  251.       return GetExceptionCode();
  252.     }

  253.     return NtStatus;
  254. }
复制代码

3

主题

13

回帖

0

精华

铜牌会员

积分
131
 楼主| 发表于 2012-2-3 13:36:17 | 显示全部楼层
ps: 请不要直接复制该代码在你的工程中,如果你的工程没有相关结构体的声明和函数的定义(该段代码中涉及的)是无法编译通过的` {:soso_e112:}

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
发表于 2012-2-3 14:22:41 | 显示全部楼层
LZ是你原创的吗?如果是的话,请补齐结构体,并给出调用例子,我给你加精华确认,并加100水晶币。
如果不是原创的话,也请补齐结构体,并给出调用例子,并加100水晶币。
如果实在不能给出,那就算了。

9

主题

117

回帖

0

精华

银牌会员

积分
422
发表于 2012-2-3 20:24:58 | 显示全部楼层
{:soso_e144:}Boss V 5!

0

主题

11

回帖

0

精华

初来乍到

积分
22
发表于 2012-3-17 21:25:32 | 显示全部楼层
感谢分享

0

主题

92

回帖

0

精华

铜牌会员

积分
166
发表于 2012-3-17 21:45:45 | 显示全部楼层
感谢分享

0

主题

19

回帖

0

精华

初来乍到

积分
8
发表于 2012-4-19 16:39:08 | 显示全部楼层
飘过

0

主题

57

回帖

0

精华

金牌会员

积分
656
发表于 2012-4-19 19:47:10 | 显示全部楼层
谢谢分享
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表