Управляющий код FSCTL_OPLOCK_BREAK_ACKNOWLEDGE отвечает на уведомление о том, что монопольная уступающая блокировка в файле собирается быть разорванной. Используйте эту операцию, чтобы указать то, что файл должен получить уровень 2 уступающих блокировок.
Чтобы выполнить эту операцию, вызовите функцию DeviceIoControl, используя ниже перечисленные параметры.
BOOL DeviceIoControl( (HANDLE) hDevice, // дескриптор файла FSCTL_OPLOCK_BREAK_ACKNOWLEDGE, // dwIoControlCode NULL, // lpInBuffer 0, // nInBufferSize NULL, // lpOutBuffer 0, // nOutBufferSize (LPDWORD) lpBytesReturned, // возвращаемое число байтов (LPOVERLAPPED) lpOverlapped // структура OVERLAPPED ); |
[in] Дескриптор файла или выбранный поток на котором собираются разорвать уступающую блокировку . Чтобы извлечь дескриптор, вызовите функцию CreateFile. Файл или выбранный поток, должны быть открыты с флажком FILE_FLAG_OVERLAPPED. Этот дескриптор должен быть тем же самым, из которого уступающая блокировка была первоначально затребована.
dwIoControlCode[in] Управляющий код операции. Для этой операции используйте FSCTL_OPLOCK_BREAK_ACKNOWLEDGE.
lpInBufferНе используется с этой операцией; устанавливается в NULL.
nInBufferSizeНе используется с этой операцией; устанавливается в нуль ('0').
lpOutBuffer Не используется с этой операцией; устанавливается в NULL. nOutBufferSizeНе используется с этой операцией; устанавливается в нуль ('0').
lpBytesReturned [out] Указатель на переменную, которая получает размер данных, сохраненных в буфере вывода данных, в байтах.Если lpOverlapped - NULL, lpBytesReturned не может быть NULL. Даже тогда, когда операция не возвращает никакого вывода данных, а lpOutBuffer - NULL, DeviceIoControl использует lpBytesReturned. После такой операции, значение lpBytesReturned становится бессмысленным.
Если lpOverlapped - не NULL, lpBytesReturned может быть NULL. Если этот параметр - не NULL, и операция возвращает данные, lpBytesReturned имеет значение не имеющего смысла до тех пор, пока асинхронная операция не завершиться. Чтобы извлечь информацию о числе возвращаемых данных, вызовите GetOverlappedResult. Если параметр hDevice связан с портом завершения ввода-вывода данных (I/O), Вы можете извлечь число возвращаемых данных при помощи вызова функции GetQueuedCompletionStatus.
lpOverlapped
[in] Указатель на структуру OVERLAPPED.Если параметр hDevice открывался без определения FILE_FLAG_OVERLAPPED, параметр lpOverlapped игнорируется.
Если параметр hDevice открывался с флажком FILE_FLAG_OVERLAPPED, операция выполняется как перекрывающая (асинхронная) операция. В этой ситуации, параметр lpOverlapped должен указать на допустимую структуру OVERLAPPED, которая содержит дескриптор объекта события. В противном случае, функция завершается ошибкой непредсказуемыми способами.
Для асинхронных операций, DeviceIoControl возвращает значение немедленно, а объект события подает сигнал, когда операция завершается. В противном случае, функция не возвращает значение до тех пор, пока операция не завершится или не произойдет ошибка.
Если операция завершается успешно, DeviceIoControl возвращает ненулевое значение.
Если операция завершается ошибкой, DeviceIoControl возвращает нуль. Чтобы получить дополнительную информацию об ошибке, вызовите GetLastError.
Эта операция используется только клиентскими приложениями, которые затребовали уступающую блокировку от локального сервера. Клиентские прикладные программы, запрашивающие уступающие блокировки от удаленных серверов не должны требовать их непосредственно - сетевая система переадресации прозрачно запрашивает уступающие блокировки для приложения.
Включение асинхронного выполнения ввода/вывода (I/O) этой операции, смотри в разделе Замечаний описания функции DeviceIoControl.
Управляющий код FSCTL_OPLOCK_BREAK_ACKNOWLEDGE - это ответное действие на уведомление о том, что уступающая блокировка уровня 1 пакета или фильтра в файле приложения была разорвана. Он указывает серверу, что приложение должно получить уровень 2 уступающих блокировок. Если операция возвращает код ошибки ERROR_IO_PENDING, значит сервер предоставил приложению уровень 2 блокировки в файле.
В одном из вариантов в использовании FSCTL_OPLOCK_BREAK_ACKNOWLEDGE нужно указать, что приложение собирается так или иначе закрыть файл. Используйте управляющий код FSCTL_OPBATCH_ACK_CLOSE_PENDING для этого ответного действия.
В другом варианте нужно потребовать, чтобы сохранить файл открытым, но освободить всю блокировку, посредством управляющего кода FSCTL_OPLOCK_BREAK_ACK_NO_2.
Приложения уведомляются, что уступающая блокировка разрывается, используя член hEvent структуры OVERLAPPED, связанной с файлом на котором, уступающая блокировка разрывается. Прикладные программы могут также использовать функции типа GetOverlappedResult и HasOverlappedIoCompleted.
Управляющие коды, используемые файловыми системами, Уступающие блокировки, DeviceIoControl, CreateFile, FSCTL_OPBATCH_ACK_CLOSE_PENDING, FSCTL_OPLOCK_BREAK_ACK_NO_2, GetOverlappedResult, HasOverlappedIoCompleted, OVERLAPPED
Размещение и совместимость FSCTL_OPLOCK_BREAK_ACKNOWLEDGE | ||
К | Windows XP | Да |
л | Windows 2000 Professional | Да |
и | Windows NT | Нет |
е | Windows Me | Нет |
н | Windows 98 | Нет |
т | Windows 95 | Нет |
С | Windows Server 2003 | Да |
е | Windows 2000 Server | Да |
р | Windows NT Server | Нет |
в | ||
е | ||
р | ||
Используемая библиотека | - | |
Используемая DLL | - | |
Заголовочный файл | ||
- объявлено в | Winioctl.h | |
- включено в | - | |
Unicode | - | |
Замечания по платформе | Не имеется |