Advertisement
rbmm

IopSymlinkECPGuid

Jan 31st, 2018
263
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.22 KB | None | 0 0
  1. struct SYMLINK_ECP_CONTEXT
  2. {
  3.     USHORT UnparsedNameLength;
  4.     union{
  5.         USHORT Flags;
  6.         struct {
  7.             USHORT MountPoint : 1;
  8.         };
  9.     };
  10.     USHORT DeviceNameLength;
  11.     USHORT Zero;
  12.     SYMLINK_ECP_CONTEXT* Reparsed;
  13.     UNICODE_STRING Name;
  14. };
  15.  
  16. void Dump(SYMLINK_ECP_CONTEXT* perd)
  17. {
  18.     do
  19.     {
  20.         DbgPrint("ERD[%x]: <%wZ>\n", perd->Tag, &perd->Name);
  21.  
  22.         UNICODE_STRING us = perd->Name;
  23.         us.Length = perd->DeviceNameLength;
  24.  
  25.         DbgPrint("Device: <%wZ>\n", &us);
  26.  
  27.         if (USHORT UnparsedNameLength = perd->UnparsedNameLength)
  28.         {
  29.             us.Buffer = (PWSTR)RtlOffsetToPointer(us.Buffer, perd->Name.Length - UnparsedNameLength);
  30.             us.MaximumLength = us.Length = UnparsedNameLength;
  31.             DbgPrint("Unparsed: <%wZ>\n", &us);
  32.         }
  33.  
  34.     } while (perd = perd->Reparsed);
  35. }
  36.  
  37. void printECP(PFLT_CALLBACK_DATA Data)
  38. {
  39.     PECP_LIST EcpList;
  40.  
  41.     if (0 <= FltGetEcpListFromCallbackData(g_Filter, Data, &EcpList) && EcpList)
  42.     {
  43.         PVOID EcpContext = 0;
  44.  
  45.         GUID EcpType;
  46.         ULONG EcpContextSize;
  47.  
  48.         while (0 <= FsRtlGetNextExtraCreateParameter(EcpList, EcpContext, &EcpType, &EcpContext, &EcpContextSize))
  49.         {
  50.             BOOLEAN bUser = FsRtlIsEcpFromUserMode(EcpContext);
  51.  
  52.             DbgPrint("Ecp(%x): %p {%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x} [%x]\n",
  53.                 bUser, EcpContext, EcpType.Data1, EcpType.Data2, EcpType.Data3,
  54.                 EcpType.Data4[0], EcpType.Data4[1], EcpType.Data4[2], EcpType.Data4[3],
  55.                 EcpType.Data4[4], EcpType.Data4[5], EcpType.Data4[6], EcpType.Data4[7],
  56.                 EcpContextSize);
  57.  
  58.             struct __declspec(uuid("73d5118a-88ba-439f-92f4-46d38952d250")) IopSymlinkECPGuid;
  59.  
  60.             if (!bUser && IsEqualGUID(__uuidof(IopSymlinkECPGuid), EcpType))
  61.             {
  62.                 Dump((SYMLINK_ECP_CONTEXT*)EcpContext);
  63.             }
  64.         }
  65.     }
  66. }
  67.  
  68. FLT_POSTOP_CALLBACK_STATUS PostCreate(__inout PFLT_CALLBACK_DATA Data,
  69.                                       __in PCFLT_RELATED_OBJECTS FltObjects,
  70.                                       __in_opt PVOID CompletionContext,
  71.                                       __in FLT_POST_OPERATION_FLAGS Flags
  72.                                       )
  73. {
  74.     if (PsIsProcessBeingDebugged(PsGetCurrentProcess()) && 0 <= Data->IoStatus.Status &&
  75.         !(Data->Iopb->Parameters.Create.Options & FILE_OPEN_BY_FILE_ID))
  76.     {
  77.         DbgPrint("+++ PostCreate\n");
  78.  
  79.         printECP(Data);
  80.  
  81.         PFILE_OBJECT CONST FileObject = FltObjects->FileObject;
  82.  
  83.         DbgPrint("%p(%x,%x) FileName=%wZ\n",
  84.             Data->TagData, Data->IoStatus.Status, Data->IoStatus.Information, &FileObject->FileName);
  85.  
  86.         if (Data->IoStatus.Status == STATUS_REPARSE)
  87.         {
  88.             PFLT_TAG_DATA_BUFFER TagData = Data->TagData;
  89.             ULONG_PTR ReparseTag = Data->IoStatus.Information;
  90.            
  91.             if (TagData)
  92.             {
  93.                 if (TagData->FileTag != ReparseTag)
  94.                 {
  95.                     DbgPrint("TagData:%x!=x\n", TagData->FileTag, ReparseTag);
  96.                     TagData = 0;
  97.                 }
  98.             }
  99.  
  100.             UNICODE_STRING FileName = {};
  101.  
  102.             switch (Data->IoStatus.Information)
  103.             {
  104.             case IO_REPARSE:
  105.                 FileName = FileObject->FileName;
  106.                 break;
  107.  
  108.             case IO_REPARSE_TAG_MOUNT_POINT:
  109.                 if (TagData)
  110.                 {
  111.                     FileName.MaximumLength =
  112.                     FileName.Length = TagData->MountPointReparseBuffer.SubstituteNameLength;
  113.                     FileName.Buffer = (PWSTR)RtlOffsetToPointer(
  114.                         TagData->MountPointReparseBuffer.PathBuffer,
  115.                         TagData->MountPointReparseBuffer.SubstituteNameOffset);
  116.                 }
  117.                 break;
  118.             case IO_REPARSE_TAG_SYMLINK:
  119.                 if (TagData)
  120.                 {
  121.                     DbgPrint("[%x]\n", TagData->SymbolicLinkReparseBuffer.Flags);
  122.                     FileName.MaximumLength =
  123.                     FileName.Length = TagData->SymbolicLinkReparseBuffer.SubstituteNameLength;
  124.                     FileName.Buffer = (PWSTR)RtlOffsetToPointer(
  125.                         TagData->SymbolicLinkReparseBuffer.PathBuffer,
  126.                         TagData->SymbolicLinkReparseBuffer.SubstituteNameOffset);
  127.                 }
  128.                 break;
  129.             default:
  130.                 DbgPrint("ReparseTag=%x ?\n", ReparseTag);
  131.             }
  132.  
  133.             if (FileName.Length)
  134.             {
  135.                 DbgPrint("%x: -> %wZ\n", ReparseTag, &FileName);
  136.             }
  137.         }
  138.  
  139.         PFLT_FILE_NAME_INFORMATION NameInfo;
  140.  
  141.         NTSTATUS status = FltGetFileNameInformation( Data,
  142.             FLT_FILE_NAME_OPENED|
  143.             FLT_FILE_NAME_QUERY_DEFAULT|
  144.             FLT_FILE_NAME_ALLOW_QUERY_ON_REPARSE, &NameInfo );
  145.  
  146.         if (0 <= status)
  147.         {
  148.             DbgPrint("FLT_FILE_NAME_OPENED:%wZ\n", &NameInfo->Name);
  149.  
  150.             FltReleaseFileNameInformation( NameInfo );
  151.         }
  152.         else
  153.         {
  154.             DbgPrint("FltGetFileNameInformation:%x\n", status);
  155.         }
  156.         DbgPrint("--- PostCreate\n");
  157.     }
  158.  
  159.     return FLT_POSTOP_FINISHED_PROCESSING;
  160. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement