コード例 #1
0
RTR3DECL(int)  RTFileLock(RTFILE hFile, unsigned fLock, int64_t offLock, uint64_t cbLock)
{
    Assert(offLock >= 0);

    /* Check arguments. */
    if (fLock & ~RTFILE_LOCK_MASK)
    {
        AssertMsgFailed(("Invalid fLock=%08X\n", fLock));
        return VERR_INVALID_PARAMETER;
    }

    /* Prepare flags. */
    Assert(RTFILE_LOCK_WRITE);
    DWORD dwFlags = (fLock & RTFILE_LOCK_WRITE) ? LOCKFILE_EXCLUSIVE_LOCK : 0;
    Assert(RTFILE_LOCK_WAIT);
    if (!(fLock & RTFILE_LOCK_WAIT))
        dwFlags |= LOCKFILE_FAIL_IMMEDIATELY;

    /* Windows structure. */
    OVERLAPPED Overlapped;
    memset(&Overlapped, 0, sizeof(Overlapped));
    Overlapped.Offset = LOW_DWORD(offLock);
    Overlapped.OffsetHigh = HIGH_DWORD(offLock);

    /* Note: according to Microsoft, LockFileEx API call is available starting from NT 3.5 */
    if (LockFileEx((HANDLE)RTFileToNative(hFile), dwFlags, 0, LOW_DWORD(cbLock), HIGH_DWORD(cbLock), &Overlapped))
        return VINF_SUCCESS;

    return RTErrConvertFromWin32(GetLastError());
}
コード例 #2
0
RTR3DECL(int)  RTFileUnlock(RTFILE hFile, int64_t offLock, uint64_t cbLock)
{
    Assert(offLock >= 0);

    if (UnlockFile((HANDLE)RTFileToNative(hFile),
                   LOW_DWORD(offLock), HIGH_DWORD(offLock),
                   LOW_DWORD(cbLock), HIGH_DWORD(cbLock)))
        return VINF_SUCCESS;

    return RTErrConvertFromWin32(GetLastError());
}
コード例 #3
0
//---------------------------------------------------------------------------
//  Set the file position pointer
//
__int64 TImageStore::Seek(__int64 Offset, DWORD MoveMethod)
{
    __int64 NewPosition;
#ifdef _WIN32
#if 0
    if (FType == isNBD) {

        switch (MoveMethod) {
        case FILE_BEGIN:
            FPosition = Offset;
            break;
        case FILE_CURRENT:
            FPosition += Offset;
            break;
        case FILE_END:
            FPosition = FGeometry.Bytes + Offset;
            break;
        }  // switch (MoveMethod)
    } else {
#endif

        DWORD nError;
        LOW_DWORD(Offset) = SetFilePointer(hHandle, LOW_DWORD(Offset), &HIGH_DWORD(Offset), MoveMethod);
        if (LOW_DWORD(Offset) == INVALID_SET_FILE_POINTER && (nError = GetLastError()) != NO_ERROR) {
            printf ("Seek error with \n");
            //throw ESelfImageFileError("Seek error with " + FFileName + ": '" + GetErrorMessage(nError) + "'");
        } else
            FPosition = Offset;
#else
    NewPosition = lseek (hHandle,Offset, MoveMethod);
    if (NewPosition<0) {
        // ERROR
        printf ("Seek error with \n");
    } else
        FPosition = NewPosition;
#endif
#if 0
    }  // else if (FType != NBD)
#endif

    return FPosition;
}  // bool __fastcall TImageStore::Seek(__int64)