|
|
|
@ -144,6 +144,29 @@ func LockFileEx(hFile HANDLE, dwFlags DWORD, dwReserved DWORD, nNumberOfBytesToL
|
|
|
|
|
return true, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func OpenFileById(hVolumeHint HANDLE, lpFileId *FILE_ID_DESCRIPTOR, dwDesiredAccess DWORD, dwShareMode DWORD,
|
|
|
|
|
lpSecurityAttributes *syscall.SecurityAttributes, dwFlagsAndAttributes DWORD) (HANDLE, error) {
|
|
|
|
|
kernel32, err := syscall.LoadLibrary("kernel32.dll")
|
|
|
|
|
if err != nil {
|
|
|
|
|
return 0, err
|
|
|
|
|
}
|
|
|
|
|
defer syscall.FreeLibrary(kernel32)
|
|
|
|
|
ofb, err := syscall.GetProcAddress(syscall.Handle(kernel32), "OpenFileById")
|
|
|
|
|
if err != nil {
|
|
|
|
|
return 0, err
|
|
|
|
|
}
|
|
|
|
|
r, _, errno := syscall.Syscall6(ofb, 6, uintptr(hVolumeHint),
|
|
|
|
|
uintptr(unsafe.Pointer(lpFileId)), uintptr(dwDesiredAccess), uintptr(dwShareMode),
|
|
|
|
|
uintptr(unsafe.Pointer(lpSecurityAttributes)), uintptr(dwFlagsAndAttributes))
|
|
|
|
|
if r == syscall.INVALID_FILE_ATTRIBUTES {
|
|
|
|
|
if errno != 0 {
|
|
|
|
|
return HANDLE(r), error(errno)
|
|
|
|
|
}
|
|
|
|
|
return HANDLE(r), syscall.EINVAL
|
|
|
|
|
}
|
|
|
|
|
return HANDLE(r), nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func CreateEventW(lpEventAttributes *syscall.SecurityAttributes, bManualReset bool,
|
|
|
|
|
bInitialState bool, lpName LPCWSTR) (HANDLE, error) {
|
|
|
|
|
var intBManualReset, intBInitialState int
|
|
|
|
@ -172,3 +195,90 @@ func CreateEventW(lpEventAttributes *syscall.SecurityAttributes, bManualReset bo
|
|
|
|
|
}
|
|
|
|
|
return HANDLE(r), nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func GetLogicalDriveStringsW(nBufferLength DWORD, lpBuffer LPWSTR) error {
|
|
|
|
|
kernel32, err := syscall.LoadLibrary("kernel32.dll")
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
defer syscall.FreeLibrary(kernel32)
|
|
|
|
|
glds, err := syscall.GetProcAddress(syscall.Handle(kernel32), "GetLogicalDriveStringsW")
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
_, _, errno := syscall.Syscall(uintptr(glds), 2, uintptr(nBufferLength), uintptr(unsafe.Pointer(lpBuffer)), 0)
|
|
|
|
|
if errno != 0 {
|
|
|
|
|
return error(errno)
|
|
|
|
|
}
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func GetVolumeInformationW(lpRootPathName LPCWSTR, lpVolumeNameBuffer LPWSTR, nVolumeNameSize DWORD,
|
|
|
|
|
lpVolumeSerialNumber LPDWORD, lpMaximumComponentLength LPDWORD, lpFileSystemFlags LPDWORD,
|
|
|
|
|
lpFileSystemNameBuffer LPWSTR, nFileSystemNameSize DWORD) error {
|
|
|
|
|
kernel32, err := syscall.LoadLibrary("kernel32.dll")
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
defer syscall.FreeLibrary(kernel32)
|
|
|
|
|
glds, err := syscall.GetProcAddress(syscall.Handle(kernel32), "GetVolumeInformationW")
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
_, _, errno := syscall.Syscall9(uintptr(glds), 8, uintptr(unsafe.Pointer(lpRootPathName)),
|
|
|
|
|
uintptr(unsafe.Pointer(lpVolumeNameBuffer)), uintptr(nVolumeNameSize), uintptr(unsafe.Pointer(lpVolumeSerialNumber)),
|
|
|
|
|
uintptr(unsafe.Pointer(lpMaximumComponentLength)), uintptr(unsafe.Pointer(lpFileSystemFlags)),
|
|
|
|
|
uintptr(unsafe.Pointer(lpFileSystemNameBuffer)), uintptr(nFileSystemNameSize), 0)
|
|
|
|
|
if errno != 0 {
|
|
|
|
|
return error(errno)
|
|
|
|
|
}
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func DeviceIoControl(hDevice HANDLE, dwIoControlCode DWORD, lpInBuffer LPVOID, nInBufferSize DWORD, lpOutBuffer LPVOID,
|
|
|
|
|
nOutBufferSize DWORD, lpBytesReturned LPDWORD, lpOverlapped *syscall.Overlapped) (bool, error) {
|
|
|
|
|
kernel32, err := syscall.LoadLibrary("kernel32.dll")
|
|
|
|
|
if err != nil {
|
|
|
|
|
return false, err
|
|
|
|
|
}
|
|
|
|
|
defer syscall.FreeLibrary(kernel32)
|
|
|
|
|
dic, err := syscall.GetProcAddress(syscall.Handle(kernel32), "DeviceIoControl")
|
|
|
|
|
if err != nil {
|
|
|
|
|
return false, err
|
|
|
|
|
}
|
|
|
|
|
r, _, errno := syscall.Syscall9(uintptr(dic), 8, uintptr(hDevice), uintptr(dwIoControlCode),
|
|
|
|
|
uintptr(unsafe.Pointer(lpInBuffer)), uintptr(nInBufferSize), uintptr(unsafe.Pointer(lpOutBuffer)), uintptr(nOutBufferSize),
|
|
|
|
|
uintptr(unsafe.Pointer(lpBytesReturned)), uintptr(unsafe.Pointer(lpOverlapped)), 0)
|
|
|
|
|
if r == 0 {
|
|
|
|
|
if errno != 0 {
|
|
|
|
|
return false, error(errno)
|
|
|
|
|
} else {
|
|
|
|
|
return false, syscall.EINVAL
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return true, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func DeviceIoControlPtr(hDevice HANDLE, dwIoControlCode DWORD, lpInBuffer uintptr, nInBufferSize DWORD, lpOutBuffer uintptr,
|
|
|
|
|
nOutBufferSize DWORD, lpBytesReturned LPDWORD, lpOverlapped *syscall.Overlapped) (bool, error) {
|
|
|
|
|
kernel32, err := syscall.LoadLibrary("kernel32.dll")
|
|
|
|
|
if err != nil {
|
|
|
|
|
return false, err
|
|
|
|
|
}
|
|
|
|
|
defer syscall.FreeLibrary(kernel32)
|
|
|
|
|
dic, err := syscall.GetProcAddress(syscall.Handle(kernel32), "DeviceIoControl")
|
|
|
|
|
if err != nil {
|
|
|
|
|
return false, err
|
|
|
|
|
}
|
|
|
|
|
r, _, errno := syscall.Syscall9(uintptr(dic), 8, uintptr(hDevice), uintptr(dwIoControlCode),
|
|
|
|
|
lpInBuffer, uintptr(nInBufferSize), lpOutBuffer, uintptr(nOutBufferSize),
|
|
|
|
|
uintptr(unsafe.Pointer(lpBytesReturned)), uintptr(unsafe.Pointer(lpOverlapped)), 0)
|
|
|
|
|
if r == 0 {
|
|
|
|
|
if errno != 0 {
|
|
|
|
|
return false, error(errno)
|
|
|
|
|
} else {
|
|
|
|
|
return false, syscall.EINVAL
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return true, nil
|
|
|
|
|
}
|
|
|
|
|