in pkg/lockedfile/lockedfile_windows.go [76:112]
func (self *lockedFile) ReadLockedFile() ([]byte, error) {
// make an empty byte slice with 4KB default size
fileBytes := make([]byte, 0, 4096)
buffer := make([]byte, 4096, 4096)
ol, err := getOverlapped()
if err != nil {
return nil, err
}
defer windows.Close(ol.HEvent)
for {
err := windows.ReadFile(self.fileHandle, buffer, nil, ol)
if err != nil && err != syscall.ERROR_IO_PENDING {
return nil, err
}
var readBytes uint32
err = windows.GetOverlappedResult(self.fileHandle, ol, &readBytes, true)
if err != nil {
if err == windows.ERROR_HANDLE_EOF {
break
}
return nil, err
}
fileBytes = append(fileBytes, buffer[:readBytes]...)
// modify ol to read next bytes
longOffset := combineTwoUint32ToUlong(ol.OffsetHigh, ol.Offset)
longOffset += uint64(readBytes)
ol.OffsetHigh, ol.Offset = splitUlongToTwoUint32(longOffset)
err = windows.ResetEvent(ol.HEvent)
if err != nil {
return nil, err
}
}
return fileBytes, nil
}