[NTDLL:LDR] SAL improvements and fixes

- Convert some notations to SAL2
- "Name" parameter in LdrGetProcedureAddress/LdrpGetProcedureAddress should be optional
- "DllCharacteristics" parameter in LdrGetDllHandle should be optional
This commit is contained in:
Ratin Gao 2023-10-03 18:28:05 +08:00 committed by Timo Kreuzer
parent 46b4b5581d
commit be5c889cdf
6 changed files with 63 additions and 39 deletions

View file

@ -98,12 +98,14 @@ LdrpWalkImportDescriptor(IN LPWSTR DllPath OPTIONAL,
/* ldrutils.c */ /* ldrutils.c */
NTSTATUS NTAPI NTSTATUS
LdrpGetProcedureAddress(IN PVOID BaseAddress, NTAPI
IN PANSI_STRING Name, LdrpGetProcedureAddress(
IN ULONG Ordinal, _In_ PVOID BaseAddress,
OUT PVOID *ProcedureAddress, _In_opt_ _When_(Ordinal == 0, _Notnull_) PANSI_STRING Name,
IN BOOLEAN ExecuteInit); _In_opt_ _When_(Name == NULL, _In_range_(>, 0)) ULONG Ordinal,
_Out_ PVOID *ProcedureAddress,
_In_ BOOLEAN ExecuteInit);
PLDR_DATA_TABLE_ENTRY NTAPI PLDR_DATA_TABLE_ENTRY NTAPI
LdrpAllocateDataTableEntry(IN PVOID BaseAddress); LdrpAllocateDataTableEntry(IN PVOID BaseAddress);

View file

@ -98,8 +98,9 @@ LdrpMakeCookie(VOID)
*/ */
NTSTATUS NTSTATUS
NTAPI NTAPI
LdrUnlockLoaderLock(IN ULONG Flags, LdrUnlockLoaderLock(
IN ULONG Cookie OPTIONAL) _In_ ULONG Flags,
_In_opt_ ULONG Cookie)
{ {
NTSTATUS Status = STATUS_SUCCESS; NTSTATUS Status = STATUS_SUCCESS;
@ -170,9 +171,10 @@ LdrUnlockLoaderLock(IN ULONG Flags,
*/ */
NTSTATUS NTSTATUS
NTAPI NTAPI
LdrLockLoaderLock(IN ULONG Flags, LdrLockLoaderLock(
OUT PULONG Disposition OPTIONAL, _In_ ULONG Flags,
OUT PULONG_PTR Cookie OPTIONAL) _Out_opt_ PULONG Disposition,
_Out_opt_ PULONG_PTR Cookie)
{ {
NTSTATUS Status = STATUS_SUCCESS; NTSTATUS Status = STATUS_SUCCESS;
BOOLEAN InInit = LdrpInLdrInit; BOOLEAN InInit = LdrpInLdrInit;
@ -440,8 +442,9 @@ LdrLoadDll(IN PWSTR SearchPath OPTIONAL,
*/ */
NTSTATUS NTSTATUS
NTAPI NTAPI
LdrFindEntryForAddress(PVOID Address, LdrFindEntryForAddress(
PLDR_DATA_TABLE_ENTRY *Module) _In_ PVOID Address,
_Out_ PLDR_DATA_TABLE_ENTRY *Module)
{ {
PLIST_ENTRY ListHead, NextEntry; PLIST_ENTRY ListHead, NextEntry;
PLDR_DATA_TABLE_ENTRY LdrEntry; PLDR_DATA_TABLE_ENTRY LdrEntry;
@ -519,11 +522,12 @@ LdrFindEntryForAddress(PVOID Address,
*/ */
NTSTATUS NTSTATUS
NTAPI NTAPI
LdrGetDllHandleEx(IN ULONG Flags, LdrGetDllHandleEx(
IN PWSTR DllPath OPTIONAL, _In_ ULONG Flags,
IN PULONG DllCharacteristics OPTIONAL, _In_opt_ PWSTR DllPath,
IN PUNICODE_STRING DllName, _In_opt_ PULONG DllCharacteristics,
OUT PVOID *DllHandle OPTIONAL) _In_ PUNICODE_STRING DllName,
_Out_opt_ PVOID *DllHandle)
{ {
NTSTATUS Status; NTSTATUS Status;
PLDR_DATA_TABLE_ENTRY LdrEntry; PLDR_DATA_TABLE_ENTRY LdrEntry;
@ -802,10 +806,11 @@ Quickie:
*/ */
NTSTATUS NTSTATUS
NTAPI NTAPI
LdrGetDllHandle(IN PWSTR DllPath OPTIONAL, LdrGetDllHandle(
IN PULONG DllCharacteristics OPTIONAL, _In_opt_ PWSTR DllPath,
IN PUNICODE_STRING DllName, _In_opt_ PULONG DllCharacteristics,
OUT PVOID *DllHandle) _In_ PUNICODE_STRING DllName,
_Out_ PVOID *DllHandle)
{ {
/* Call the newer API */ /* Call the newer API */
return LdrGetDllHandleEx(LDR_GET_DLL_HANDLE_EX_UNCHANGED_REFCOUNT, return LdrGetDllHandleEx(LDR_GET_DLL_HANDLE_EX_UNCHANGED_REFCOUNT,
@ -820,10 +825,11 @@ LdrGetDllHandle(IN PWSTR DllPath OPTIONAL,
*/ */
NTSTATUS NTSTATUS
NTAPI NTAPI
LdrGetProcedureAddress(IN PVOID BaseAddress, LdrGetProcedureAddress(
IN PANSI_STRING Name, _In_ PVOID BaseAddress,
IN ULONG Ordinal, _In_opt_ _When_(Ordinal == 0, _Notnull_) PANSI_STRING Name,
OUT PVOID *ProcedureAddress) _In_opt_ _When_(Name == NULL, _In_range_(>, 0)) ULONG Ordinal,
_Out_ PVOID *ProcedureAddress)
{ {
/* Call the internal routine and tell it to execute DllInit */ /* Call the internal routine and tell it to execute DllInit */
return LdrpGetProcedureAddress(BaseAddress, Name, Ordinal, ProcedureAddress, TRUE); return LdrpGetProcedureAddress(BaseAddress, Name, Ordinal, ProcedureAddress, TRUE);

View file

@ -2249,11 +2249,12 @@ lookinhash:
NTSTATUS NTSTATUS
NTAPI NTAPI
LdrpGetProcedureAddress(IN PVOID BaseAddress, LdrpGetProcedureAddress(
IN PANSI_STRING Name, _In_ PVOID BaseAddress,
IN ULONG Ordinal, _In_opt_ _When_(Ordinal == 0, _Notnull_) PANSI_STRING Name,
OUT PVOID *ProcedureAddress, _In_opt_ _When_(Name == NULL, _In_range_(>, 0)) ULONG Ordinal,
IN BOOLEAN ExecuteInit) _Out_ PVOID *ProcedureAddress,
_In_ BOOLEAN ExecuteInit)
{ {
NTSTATUS Status = STATUS_SUCCESS; NTSTATUS Status = STATUS_SUCCESS;
UCHAR ImportBuffer[64]; UCHAR ImportBuffer[64];

View file

@ -22,7 +22,13 @@ VOID NTAPI AVrfpNtdllHeapFreeCallback(PVOID AllocationBase, SIZE_T AllocationSiz
// DPFLTR_VERIFIER_ID // DPFLTR_VERIFIER_ID
NTSTATUS NTAPI AVrfpLdrGetProcedureAddress(IN PVOID BaseAddress, IN PANSI_STRING Name, IN ULONG Ordinal, OUT PVOID *ProcedureAddress); NTSTATUS
NTAPI
AVrfpLdrGetProcedureAddress(
_In_ PVOID BaseAddress,
_In_opt_ _When_(Ordinal == 0, _Notnull_) PANSI_STRING Name,
_In_opt_ _When_(Name == NULL, _In_range_(>, 0)) ULONG Ordinal,
_Out_ PVOID *ProcedureAddress);
static RTL_VERIFIER_THUNK_DESCRIPTOR AVrfpNtdllThunks[] = static RTL_VERIFIER_THUNK_DESCRIPTOR AVrfpNtdllThunks[] =
{ {
@ -116,9 +122,18 @@ PVOID AVrfpFindReplacementThunk(PVOID Proc)
} }
NTSTATUS NTAPI AVrfpLdrGetProcedureAddress(IN PVOID BaseAddress, IN PANSI_STRING Name, IN ULONG Ordinal, OUT PVOID *ProcedureAddress) NTSTATUS NTAPI
AVrfpLdrGetProcedureAddress(
_In_ PVOID BaseAddress,
_In_opt_ _When_(Ordinal == 0, _Notnull_) PANSI_STRING Name,
_In_opt_ _When_(Name == NULL, _In_range_(>, 0)) ULONG Ordinal,
_Out_ PVOID *ProcedureAddress)
{ {
NTSTATUS (NTAPI *oLdrGetProcedureAddress)(IN PVOID BaseAddress, IN PANSI_STRING Name, IN ULONG Ordinal, OUT PVOID *ProcedureAddress); NTSTATUS(NTAPI *oLdrGetProcedureAddress)(
_In_ PVOID BaseAddress,
_In_opt_ _When_(Ordinal == 0, _Notnull_) PANSI_STRING Name,
_In_opt_ _When_(Name == NULL, _In_range_(>, 0)) ULONG Ordinal,
_Out_ PVOID *ProcedureAddress);
NTSTATUS Status; NTSTATUS Status;
PVOID Replacement; PVOID Replacement;

View file

@ -89,8 +89,8 @@ NTSTATUS
NTAPI NTAPI
LdrGetProcedureAddress( LdrGetProcedureAddress(
_In_ PVOID BaseAddress, _In_ PVOID BaseAddress,
_In_ PANSI_STRING Name, _In_opt_ _When_(Ordinal == 0, _Notnull_) PANSI_STRING Name,
_In_ ULONG Ordinal, _In_opt_ _When_(Name == NULL, _In_range_(>, 0)) ULONG Ordinal,
_Out_ PVOID *ProcedureAddress _Out_ PVOID *ProcedureAddress
); );

View file

@ -115,7 +115,7 @@ NTSTATUS
NTAPI NTAPI
LdrGetDllHandle( LdrGetDllHandle(
_In_opt_ PWSTR DllPath, _In_opt_ PWSTR DllPath,
_In_ PULONG DllCharacteristics, _In_opt_ PULONG DllCharacteristics,
_In_ PUNICODE_STRING DllName, _In_ PUNICODE_STRING DllName,
_Out_ PVOID *DllHandle _Out_ PVOID *DllHandle
); );
@ -140,8 +140,8 @@ NTSTATUS
NTAPI NTAPI
LdrGetProcedureAddress( LdrGetProcedureAddress(
_In_ PVOID BaseAddress, _In_ PVOID BaseAddress,
_In_ PANSI_STRING Name, _In_opt_ _When_(Ordinal == 0, _Notnull_) PANSI_STRING Name,
_In_ ULONG Ordinal, _In_opt_ _When_(Name == NULL, _In_range_(>, 0)) ULONG Ordinal,
_Out_ PVOID *ProcedureAddress _Out_ PVOID *ProcedureAddress
); );