LockFileEx

Тема в разделе "WASM.BEGINNERS", создана пользователем bug1z, 3 янв 2012.

  1. bug1z

    bug1z New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2008
    Сообщения:
    228
    Добрый вечер. Объясните пожалуйста следующее:

    Код (Text):
    1. BOOL LockFileEx(
    2.   HANDLE hFile,                   // дескриптор файла
    3.   DWORD dwFlags,                  // параметры блокировки
    4.   DWORD dwReserved,               // зарезервировано
    5.   DWORD nNumberOfBytesToLockLow,  // младшая часть длины
    6.   DWORD nNumberOfBytesToLockHigh, // старшая часть длины
    7.   LPOVERLAPPED lpOverlapped       // начальное смещение содержания
    8. );
    Последние три параметра, зачем они нужны?

    Это что, получается, я могу блокировать доступ к определенным байтам в файле, или как? Не могу понять.

    Заранее спасибо.
     
  2. Malfoy

    Malfoy New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2012
    Сообщения:
    698
    Код (Text):
    1. NTSTATUS
    2. NtLockFile(
    3.     __in HANDLE FileHandle,
    4.     __in_opt HANDLE Event,
    5.     __in_opt PIO_APC_ROUTINE ApcRoutine,
    6.     __in_opt PVOID ApcContext,
    7.     __out PIO_STATUS_BLOCK IoStatusBlock,
    8.     __in PLARGE_INTEGER ByteOffset,
    9.     __in PLARGE_INTEGER Length,
    10.     __in ULONG Key,
    11.     __in BOOLEAN FailImmediately,
    12.     __in BOOLEAN ExclusiveLock
    13.     )
    14.  
    15. /*++
    16.  
    17. Routine Description:
    18.  
    19.     This service locks a specified range of bytes on the file specified by
    20.     the FileHandle parameter.  The lock may either be an exclusive lock or
    21.     a shared lock.  Furthermore, the caller has the option of specifying
    22.     whether or not the service should return immediately if the lock cannot
    23.     be acquired without waiting.
    24.  
    25. Arguments:
    26.  
    27.     FileHandle - Supplies a handle to an open file.
    28.  
    29.     Event - Supplies an optional event to be set to the Signaled state when
    30.         the operation is complete.
    31.  
    32.     ApcRoutine - Supplies an optional APC routine to be executed when the
    33.         operation is complete.
    34.  
    35.     ApcContext - Supplies a context parameter to be passed to the ApcRoutine,
    36.         if an ApcRoutine was specified.
    37.  
    38.     IoStatusBlock - Address of the caller's I/O status block.
    39.  
    40.     ByteOffset - Specifies the starting byte offset of the range to lock.
    41.  
    42.     Length - Specifies the length of the byte range to be locked.
    43.  
    44.     Key - Specifies the key to be associated with the lock.
    45.  
    46.     FailImmediately - Specifies that if the lock cannot immediately be
    47.         acquired that the service should return to the caller.
    48.  
    49.     ExclusiveLock - Specifies, if TRUE, that the lock should be an exclusive
    50.         lock;  otherwise the lock is a shared lock.
    51.  
    52. Return Value:
    53.  
    54.     The status returned is success if the operation was properly queued to
    55.     the I/O system.  Once the operation completes, the status can be
    56.     determined by examining the Status field of the I/O status block.
    57.  
    58. --*/
     
  3. Sholar

    Sholar New Member

    Публикаций:
    0
    Регистрация:
    16 окт 2011
    Сообщения:
    189
    Malfoy, за что такая ненависть к винапи? щ_Щ
     
  4. Malfoy

    Malfoy New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2012
    Сообщения:
    698
    Эта виньапи обёртка для сервиса ядра. А ядерные сервисы чётко описаны. Вот выше пример, который не нуждается в комментариях.
     
  5. bug1z

    bug1z New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2008
    Сообщения:
    228
    из этого следует, что я задаю последовательность байтов, которые нужно залочить.
    написал программу:

    Код (Text):
    1. INT _tmain(INT argc, LPTSTR argv[])
    2. {
    3.     HANDLE file = CreateFile(L"D:\\File1.txt", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, NULL, NULL);
    4.  
    5.     if(file != INVALID_HANDLE_VALUE)
    6.     {
    7.         OVERLAPPED overlapped;
    8.         overlapped.Offset = 0;
    9.         overlapped.OffsetHigh = 0;
    10.         overlapped.hEvent = 0;
    11.  
    12.         LockFileEx(file, LOCKFILE_EXCLUSIVE_LOCK, NULL, 1, 0, &overlapped);
    13.     }
    14.  
    15.     while(1);
    16.  
    17. }
    мало того, что с параметром LOCKFILE_EXCLUSIVE_LOCK файл все равно открывается.
    Но я задал в OVERLAPPED начало смещения 0.
    Как длину я передал 1.
    получается, что залочиться должен был только первый байт. но не правится ничего.

    Вот здесь у меня проблемы с пониманием :dntknw:
     
  6. Dmitry_Milk

    Dmitry_Milk Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    535
    Из описания непонятно, является ли блокировка мягкой (скажем, как в юнихе), или жесткой. Мягкая - как светофор, если кто на него не смотрит, поедет не только на желтый, но даже и на красный.