Enumerate hard links (Windows)
Posted: Tue Mar 24, 2015 12:27 am
Windows Vista and above only (NTFS only)
PB 5.31, Unicode only
PB 5.31, Unicode only
Code: Select all
; No advanced error checking is done, this is just a pure concept
; Check documentation for full implementation
; FindFirstFileNameW
; https://msdn.microsoft.com/en-us/library/windows/desktop/aa364421(v=vs.85).aspx
; FindNextFileNameW
; https://msdn.microsoft.com/en-us/library/windows/desktop/aa364429(v=vs.85).aspx
CompilerIf #PB_Compiler_Unicode = #False
CompilerError "Please check 'Create Unicode executable' in 'Compiler options'"
CompilerEndIf
EnableExplicit
Prototype.i FindFirstFileNameW(lpFileName.s, dwFlags.i, *StringLength, *LinkName)
Prototype.i FindNextFileNameW(hFindStream.i, *StringLength, *LinkName)
If OpenLibrary(0, "Kernel32.dll")
Global FindFirstFileNameW.i : FindFirstFileNameW.FindFirstFileNameW = GetFunction(0, "FindFirstFileNameW")
Global FindNextFileNameW.i : FindNextFileNameW.FindNextFileNameW = GetFunction(0, "FindNextFileNameW")
CloseLibrary(0)
EndIf
Define.i NameSize, hSearch
Define.s FileName, Volume
Define *Name
Define NewList Links.s()
*Name = AllocateMemory(#MAX_PATH*2) : NameSize = MemorySize(*Name)
FileName = OpenFileRequester("Examine hard link", "", "", 0)
If FileName
Volume = Left(FileName, 2)
hSearch = FindFirstFileNameW(FileName, 0, @NameSize, *Name)
If hSearch > 0
AddElement(Links()) : Links() = Volume + PeekS(*Name)
FreeMemory(*Name) : *Name = AllocateMemory(#MAX_PATH*2) : NameSize = MemorySize(*Name)
While FindNextFileNameW(hSearch, @NameSize, *Name)
AddElement(Links()) : Links() = Volume + PeekS(*Name)
FreeMemory(*Name) : *Name = AllocateMemory(#MAX_PATH*2) : NameSize = MemorySize(*Name)
Wend
FindClose_(hSearch)
EndIf
If ListSize(Links()) > 1
ResetList(Links())
ForEach Links()
Debug Links()
Next
Else
Debug "No hard links found"
EndIf
Else
End 1
EndIf
End 0