ClfsReserveAndAppendLog 함수(wdm.h)

ClfsReserveAndAppendLog 루틴은 마샬링 영역에 공간을 예약하거나 마샬링 영역에 레코드를 추가하거나 둘 다 원자 방식으로 수행합니다.

구문

CLFSUSER_API NTSTATUS ClfsReserveAndAppendLog(
  [in]            PVOID             pvMarshalContext,
  [in, optional]  PCLFS_WRITE_ENTRY rgWriteEntries,
  [in]            ULONG             cWriteEntries,
  [in, optional]  PCLFS_LSN         plsnUndoNext,
  [in, optional]  PCLFS_LSN         plsnPrevious,
  [in]            ULONG             cReserveRecords,
  [in, out]       PLONGLONG         rgcbReservation,
  [in]            ULONG             fFlags,
  [out, optional] PCLFS_LSN         plsn
);

매개 변수

[in] pvMarshalContext

CLFS 스트림과 연결된 마샬링 영역을 나타내는 불투명 컨텍스트에 대한 포인터입니다. 호출자는 이전에 ClfsCreateMarshallingArea를 호출하여 이 포인터를 얻었습니다.

[in, optional] rgWriteEntries

각각 로그에 추가되는 레코드의 일부가 될 데이터 버퍼에 대한 포인터를 보유하는 CLFS_WRITE_ENTRY 구조의 배열에 대한 포인터입니다. cWriteEntries가 0인 경우 이 매개 변수는 NULL일 수 있습니다.

[in] cWriteEntries

rgWriteEntries가 가리키는 배열의 요소 수입니다. rgWriteEntriesNULL인 경우 이 매개 변수는 0이어야 합니다.

[in, optional] plsnUndoNext

추가할 레코드의 실행 취소 후 LSN을 제공하는 CLFS_LSN 구조체에 대한 포인터입니다.

[in, optional] plsnPrevious

추가할 레코드의 이전 LSN을 제공하는 CLFS_LSN 구조체에 대한 포인터입니다.

[in] cReserveRecords

rgcbReservation이 가리키는 배열의 요소 수입니다. rgcbReservationNULL이거나 fFlags의 CLFS_FLAG_USE_RESERVATION 플래그가 설정된 경우 이 매개 변수는 0이어야 합니다.

[in, out] rgcbReservation

LONGLONG 형식 변수 배열에 대한 포인터입니다. 호출자는 배열의 각 요소를 예약된 공간이 있어야 하는 레코드의 크기(바이트)로 설정합니다. 반환 시 각 배열 요소는 레코드에 예약된 공간의 실제 크기를 받습니다. 여기에는 헤더 및 맞춤에 필요한 공간이 포함됩니다. 예약 값이 음수이면 제공된 음수 값의 절대값과 거의 일치하는 예약 레코드가 해제됩니다. cReserveRecords가 0이고 fFlags의 CLFS_FLAG_USE_RESERVATION 플래그가 설정된 경우 NULL이어야 하는 경우 이 매개 변수는 NULL일 수 있습니다.

[in] fFlags

이 매개 변수는 0이거나 다음 플래그의 조합일 수 있습니다.

플래그 의미
CLFS_FLAG_FORCE_APPEND 현재 레코드가 로그 I/O 블록에 추가된 후 블록은 안정적인 스토리지에 LSN 시퀀스로 큐에 대기됩니다. 이 플래그는 레코드가 안정적인 스토리지로 강제 적용된다는 보장을 제공하지 않습니다(CLFS_FLAG_FORCE_FLUSH 참조).
CLFS_FLAG_FORCE_FLUSH 현재 레코드가 로그 I/O 블록에 추가되면 블록은 안정적인 스토리지로 강제 적용됩니다.
CLFS_FLAG_USE_RESERVATION 현재 레코드는 마샬링 영역 내의 로그 I/O 블록에 예약된 공간에 배치됩니다. 마샬링 영역의 예약된 레코드 수가 1씩 줄어듭니다. 이 플래그가 설정된 경우 cReserveRecords는 0이어야 하고 rgcbReservationNULL이어야 합니다.

[out, optional] plsn

추가된 레코드의 LSN을 수신하는 CLFS_LSN 구조체에 대한 포인터입니다. cWriteEntries가 0인 경우 이 매개 변수는 NULL일 수 있습니다.

반환 값

ClfsReserveAndAppendLog 는 성공하면 STATUS_SUCCESS 반환합니다. 그렇지 않으면 Ntstatus.h에 정의된 오류 코드 중 하나를 반환합니다.

설명

ClfsReserveAndAppendLog 루틴은 선택적 매개 변수의 존재와 CLFS_USE_RESERVATION 플래그의 상태에 따라 기본 동작을 변경합니다. 다음 표에서는 일반적인 시나리오를 요약합니다.

매개 변수 및 플래그 값 수행된 작업
cWriteEntries = 0.

rgWriteEntries = NULL입니다.

plsn = NULL입니다.

레코드 집합에 대한 공간을 예약하지만 마샬링 영역에 레코드를 추가하지는 않습니다. rgcbReservation 매개 변수는 예약된 공간이 필요한 각 레코드의 데이터 부분 크기를 제공합니다.
cWriteEntries > 0입니다.

rgWriteEntriesNULL이 아닙니다.

plsnNULL이 아닙니다.

cReserveRecords = 0.

rgcbReservationNULL입니다.

CLFS_USE_RESERVATION 설정됩니다.

이미 예약된 공간을 사용하여 마샬링 영역에 레코드를 추가합니다. 예약된 레코드 공간 수를 1씩 줄입니다.
cWriteEntries > 0입니다.

rgWriteEntriesNULL이 아닙니다.

plsnNULL이 아닙니다.

cReserveRecords = 0.

rgcbReservationNULL입니다.

CLFS_USE_RESERVATION 지워집니다.

새 공간을 예약하여 마샬링 영역에 레코드를 추가합니다. 예약된 레코드 공간의 수는 변경되지 않은 상태로 둡니다.
cWriteEntries > 0입니다.

rgWriteEntriesNULL이 아닙니다.

plsnNULL이 아닙니다.

cReserveRecords> 0.

rgcbReservation이 NULL이 아닙니다.

CLFS_USE_RESERVATION 플래그가 지워집니다.

새 공간을 예약하여 마샬링 영역에 레코드를 추가합니다. 또한 현재 추가되지 않은 레코드 집합에 대한 공간을 예약합니다. rgcbReservation 매개 변수는 예약된 공간이 필요한 각 레코드의 크기를 제공합니다. 예약된 레코드 공간 수를 cReserveRecords 값만큼 늘입니다.
 

ClfsReserveAndAppendLog를 호출하는 것은 cbEntryAlignment 매개 변수를 1로 설정하여 ClfsReserveAndAppendLogAligned를 호출하는 것과 같습니다.

CLFS 개념 및 용어에 대한 설명은 공통 로그 파일 시스템을 참조하세요.

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows Server 2003 R2, Windows Vista 및 이후 버전의 Windows에서 사용할 수 있습니다.
대상 플랫폼 데스크톱
머리글 wdm.h(Wdm.h 포함)
라이브러리 Clfs.lib
DLL Clfs.sys
IRQL <= APC_LEVEL

추가 정보

CLFS_LSN

CLFS_WRITE_ENTRY

ClfsCreateMarshallingArea

ClfsReserveAndAppendLogAligned