-----------------------------------------------
                            LARGE_INTEGER ARGUMENT
                                January 2024
                 -----------------------------------------------
                                    CCB



1. THE LARGE_INTEGER STRUCTURE:

     typedef union _LARGE_INTEGER {
       struct {
         DWORD LowPart;
         LONG  HighPart;
       };
       struct {
         DWORD LowPart;
         LONG  HighPart;
       } u;
       LONGLONG QuadPart;
     } LARGE_INTEGER, *PLARGE_INTEGER;

     BOOL WINAPI SetFilePointerEx(
       _In_       HANDLE hFile,
       _In_       LARGE_INTEGER liDistanceToMove,
       _Out_opt_  PLARGE_INTEGER lpNewFilePointer,
       _In_       DWORD dwMoveMethod
     );


2. REFERENCE CODE:

     In x86, a LARGE_INTEGER argument is 2 arguments: u.LowPart and u.HighPart.

     For example, we can write the following code to call SetFilePointerEx:

     ; SetFilePointerEx PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD (5 arguments)
     push dword ptr dwMoveMethod
     push dword ptr lpNewFilePointer
     push dword ptr liDistanceToMove.HighPart
     push dword ptr liDistanceToMove.LowPart
     push dword ptr hFile
     call SetFilePointerEx

     In x64, a LARGE_INTEGER argument is 1 argument: u.

     For example, we can write the following code to call SetFilePointerEx:

     ; PROTO64 external,SetFilePointerEx, :QWORD,:QWORD,:QWORD,:QWORD (4 arguments)
     mov rcx, qword ptr hFile
     mov rdx, qword ptr liDistanceToMove
     mov r8, qword ptr lpNewFilePointer
     mov r9, qword ptr dwMoveMethod
     call SetFilePointerEx

     The following code is incorrectly in x64:

     ; incorrectly code (5 arguments?)
     mov rcx, qword ptr hFile
     mov edx, dword ptr liDistanceToMove.LowPart
     mov r8d, dword ptr liDistanceToMove.HighPart
     mov r9, qword ptr lpNewFilePointer
     mov rax, qword ptr dwMoveMethod
     mov qword ptr [rsp+20h],rax
     call SetFilePointerEx


3. REFERENCE WINDOWS APIS:

     SetFilePointerEx(_In_ HANDLE hFile, _In_ LARGE_INTEGER liDistanceToMove, _Out_opt_ PLARGE_INTEGER lpNewFilePointer, _In_ DWORD dwMoveMethod);
     CoRevokeInitializeSpy(_In_ ULARGE_INTEGER uliCookie);


4. REFERENCE COM INTERFACES:

     HRESULT ILockBytes::ReadAt([in] ULARGE_INTEGER ulOffset, [in] void *pv, [in] ULONG cb, [out] ULONG *pcbRead);
     HRESULT ILockBytes::WriteAt([in] ULARGE_INTEGER ulOffset, [in] void const *pv, [in] ULONG cb, [out] ULONG *pcbWritten);
     HRESULT ILockBytes::SetSize([in] ULARGE_INTEGER cb);
     HRESULT ILockBytes::LockRegion([in] ULARGE_INTEGER libOffset, [in] ULARGE_INTEGER cb, [in] DWORD dwLockType);
     HRESULT ILockBytes::UnlockRegion([in] ULARGE_INTEGER libOffset, [in] ULARGE_INTEGER cb, [in] DWORD dwLockType);

     HRESULT IStream::Seek([in] LARGE_INTEGER dlibMove, [in] DWORD dwOrigin, [out] ULARGE_INTEGER *plibNewPosition);
     HRESULT IStream::SetSize([in] ULARGE_INTEGER libNewSize);
     HRESULT IStream::CopyTo([in, unique] IStream *pstm, [in] ULARGE_INTEGER cb, [out] ULARGE_INTEGER *pcbRead, [out] ULARGE_INTEGER *pcbWritten);
     HRESULT IStream::LockRegion([in] ULARGE_INTEGER libOffset, [in] ULARGE_INTEGER cb, [in] DWORD dwLockType);
     HRESULT IStream::UnlockRegion([in] ULARGE_INTEGER libOffset, [in] ULARGE_INTEGER cb, [in] DWORD dwLockType);


5. OTHER:

     For reference only, there is no guarantees.

     Any questions or suggestions, please send me an email at ccb2000@163.com.