1dd51a993419cb90cc954aa4d9ae53fb012991d21yshang/** @file 2dd51a993419cb90cc954aa4d9ae53fb012991d21yshang Architecture Independent Base Memory Library Implementation. 3dd51a993419cb90cc954aa4d9ae53fb012991d21yshang 41fef058f4b8fefc455bb171e4908c3e835b1b492qhuang The following BaseMemoryLib instances contain the same copy of this file: 51fef058f4b8fefc455bb171e4908c3e835b1b492qhuang BaseMemoryLib 61fef058f4b8fefc455bb171e4908c3e835b1b492qhuang PeiMemoryLib 71fef058f4b8fefc455bb171e4908c3e835b1b492qhuang UefiMemoryLib 81fef058f4b8fefc455bb171e4908c3e835b1b492qhuang 958380e9c6174f23df78f777b4209c0fd75245cdamyronporter Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR> 1019388d2960b2fe0347da23799e93ccc52f540214hhtian This program and the accompanying materials 11dd51a993419cb90cc954aa4d9ae53fb012991d21yshang are licensed and made available under the terms and conditions of the BSD License 12dd51a993419cb90cc954aa4d9ae53fb012991d21yshang which accompanies this distribution. The full text of the license may be found at 132fc59a003ed9104f9feebe0e418f2a04a50f3284myronporter http://opensource.org/licenses/bsd-license.php. 14dd51a993419cb90cc954aa4d9ae53fb012991d21yshang 15dd51a993419cb90cc954aa4d9ae53fb012991d21yshang THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 16dd51a993419cb90cc954aa4d9ae53fb012991d21yshang WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 17dd51a993419cb90cc954aa4d9ae53fb012991d21yshang 18dd51a993419cb90cc954aa4d9ae53fb012991d21yshang**/ 19dd51a993419cb90cc954aa4d9ae53fb012991d21yshang 20dd51a993419cb90cc954aa4d9ae53fb012991d21yshang#include "MemLibInternals.h" 21dd51a993419cb90cc954aa4d9ae53fb012991d21yshang 22dd51a993419cb90cc954aa4d9ae53fb012991d21yshang/** 23dd51a993419cb90cc954aa4d9ae53fb012991d21yshang Fills a target buffer with a 16-bit value, and returns the target buffer. 24dd51a993419cb90cc954aa4d9ae53fb012991d21yshang 252fc59a003ed9104f9feebe0e418f2a04a50f3284myronporter @param Buffer The pointer to the target buffer to fill. 262fc59a003ed9104f9feebe0e418f2a04a50f3284myronporter @param Length The count of 16-bit value to fill. 272fc59a003ed9104f9feebe0e418f2a04a50f3284myronporter @param Value The value with which to fill Length bytes of Buffer. 28dd51a993419cb90cc954aa4d9ae53fb012991d21yshang 29dd51a993419cb90cc954aa4d9ae53fb012991d21yshang @return Buffer 30dd51a993419cb90cc954aa4d9ae53fb012991d21yshang 31dd51a993419cb90cc954aa4d9ae53fb012991d21yshang**/ 32dd51a993419cb90cc954aa4d9ae53fb012991d21yshangVOID * 33dd51a993419cb90cc954aa4d9ae53fb012991d21yshangEFIAPI 34dd51a993419cb90cc954aa4d9ae53fb012991d21yshangInternalMemSetMem16 ( 35dd51a993419cb90cc954aa4d9ae53fb012991d21yshang OUT VOID *Buffer, 36dd51a993419cb90cc954aa4d9ae53fb012991d21yshang IN UINTN Length, 37dd51a993419cb90cc954aa4d9ae53fb012991d21yshang IN UINT16 Value 38dd51a993419cb90cc954aa4d9ae53fb012991d21yshang ) 39dd51a993419cb90cc954aa4d9ae53fb012991d21yshang{ 40dd51a993419cb90cc954aa4d9ae53fb012991d21yshang do { 41dd51a993419cb90cc954aa4d9ae53fb012991d21yshang ((UINT16*)Buffer)[--Length] = Value; 42dd51a993419cb90cc954aa4d9ae53fb012991d21yshang } while (Length != 0); 43dd51a993419cb90cc954aa4d9ae53fb012991d21yshang return Buffer; 44dd51a993419cb90cc954aa4d9ae53fb012991d21yshang} 45dd51a993419cb90cc954aa4d9ae53fb012991d21yshang 46dd51a993419cb90cc954aa4d9ae53fb012991d21yshang/** 47dd51a993419cb90cc954aa4d9ae53fb012991d21yshang Fills a target buffer with a 32-bit value, and returns the target buffer. 48dd51a993419cb90cc954aa4d9ae53fb012991d21yshang 492fc59a003ed9104f9feebe0e418f2a04a50f3284myronporter @param Buffer The pointer to the target buffer to fill. 502fc59a003ed9104f9feebe0e418f2a04a50f3284myronporter @param Length The count of 32-bit value to fill. 512fc59a003ed9104f9feebe0e418f2a04a50f3284myronporter @param Value The value with which to fill Length bytes of Buffer. 52dd51a993419cb90cc954aa4d9ae53fb012991d21yshang 53dd51a993419cb90cc954aa4d9ae53fb012991d21yshang @return Buffer 54dd51a993419cb90cc954aa4d9ae53fb012991d21yshang 55dd51a993419cb90cc954aa4d9ae53fb012991d21yshang**/ 56dd51a993419cb90cc954aa4d9ae53fb012991d21yshangVOID * 57dd51a993419cb90cc954aa4d9ae53fb012991d21yshangEFIAPI 58dd51a993419cb90cc954aa4d9ae53fb012991d21yshangInternalMemSetMem32 ( 59dd51a993419cb90cc954aa4d9ae53fb012991d21yshang OUT VOID *Buffer, 60dd51a993419cb90cc954aa4d9ae53fb012991d21yshang IN UINTN Length, 61dd51a993419cb90cc954aa4d9ae53fb012991d21yshang IN UINT32 Value 62dd51a993419cb90cc954aa4d9ae53fb012991d21yshang ) 63dd51a993419cb90cc954aa4d9ae53fb012991d21yshang{ 64dd51a993419cb90cc954aa4d9ae53fb012991d21yshang do { 65dd51a993419cb90cc954aa4d9ae53fb012991d21yshang ((UINT32*)Buffer)[--Length] = Value; 66dd51a993419cb90cc954aa4d9ae53fb012991d21yshang } while (Length != 0); 67dd51a993419cb90cc954aa4d9ae53fb012991d21yshang return Buffer; 68dd51a993419cb90cc954aa4d9ae53fb012991d21yshang} 69dd51a993419cb90cc954aa4d9ae53fb012991d21yshang 70dd51a993419cb90cc954aa4d9ae53fb012991d21yshang/** 71dd51a993419cb90cc954aa4d9ae53fb012991d21yshang Fills a target buffer with a 64-bit value, and returns the target buffer. 72dd51a993419cb90cc954aa4d9ae53fb012991d21yshang 732fc59a003ed9104f9feebe0e418f2a04a50f3284myronporter @param Buffer The pointer to the target buffer to fill. 742fc59a003ed9104f9feebe0e418f2a04a50f3284myronporter @param Length The count of 64-bit value to fill. 752fc59a003ed9104f9feebe0e418f2a04a50f3284myronporter @param Value The value with which to fill Length bytes of Buffer. 76dd51a993419cb90cc954aa4d9ae53fb012991d21yshang 77dd51a993419cb90cc954aa4d9ae53fb012991d21yshang @return Buffer 78dd51a993419cb90cc954aa4d9ae53fb012991d21yshang 79dd51a993419cb90cc954aa4d9ae53fb012991d21yshang**/ 80dd51a993419cb90cc954aa4d9ae53fb012991d21yshangVOID * 81dd51a993419cb90cc954aa4d9ae53fb012991d21yshangEFIAPI 82dd51a993419cb90cc954aa4d9ae53fb012991d21yshangInternalMemSetMem64 ( 83dd51a993419cb90cc954aa4d9ae53fb012991d21yshang OUT VOID *Buffer, 84dd51a993419cb90cc954aa4d9ae53fb012991d21yshang IN UINTN Length, 85dd51a993419cb90cc954aa4d9ae53fb012991d21yshang IN UINT64 Value 86dd51a993419cb90cc954aa4d9ae53fb012991d21yshang ) 87dd51a993419cb90cc954aa4d9ae53fb012991d21yshang{ 88dd51a993419cb90cc954aa4d9ae53fb012991d21yshang do { 89dd51a993419cb90cc954aa4d9ae53fb012991d21yshang ((UINT64*)Buffer)[--Length] = Value; 90dd51a993419cb90cc954aa4d9ae53fb012991d21yshang } while (Length != 0); 91dd51a993419cb90cc954aa4d9ae53fb012991d21yshang return Buffer; 92dd51a993419cb90cc954aa4d9ae53fb012991d21yshang} 93dd51a993419cb90cc954aa4d9ae53fb012991d21yshang 94dd51a993419cb90cc954aa4d9ae53fb012991d21yshang/** 95dd51a993419cb90cc954aa4d9ae53fb012991d21yshang Set Buffer to 0 for Size bytes. 96dd51a993419cb90cc954aa4d9ae53fb012991d21yshang 97dd51a993419cb90cc954aa4d9ae53fb012991d21yshang @param Buffer Memory to set. 982fc59a003ed9104f9feebe0e418f2a04a50f3284myronporter @param Length The number of bytes to set 99dd51a993419cb90cc954aa4d9ae53fb012991d21yshang 100dd51a993419cb90cc954aa4d9ae53fb012991d21yshang @return Buffer 101dd51a993419cb90cc954aa4d9ae53fb012991d21yshang 102dd51a993419cb90cc954aa4d9ae53fb012991d21yshang**/ 103dd51a993419cb90cc954aa4d9ae53fb012991d21yshangVOID * 104dd51a993419cb90cc954aa4d9ae53fb012991d21yshangEFIAPI 105dd51a993419cb90cc954aa4d9ae53fb012991d21yshangInternalMemZeroMem ( 106dd51a993419cb90cc954aa4d9ae53fb012991d21yshang OUT VOID *Buffer, 107dd51a993419cb90cc954aa4d9ae53fb012991d21yshang IN UINTN Length 108dd51a993419cb90cc954aa4d9ae53fb012991d21yshang ) 109dd51a993419cb90cc954aa4d9ae53fb012991d21yshang{ 110dd51a993419cb90cc954aa4d9ae53fb012991d21yshang return InternalMemSetMem (Buffer, Length, 0); 111dd51a993419cb90cc954aa4d9ae53fb012991d21yshang} 112dd51a993419cb90cc954aa4d9ae53fb012991d21yshang 113dd51a993419cb90cc954aa4d9ae53fb012991d21yshang/** 114dd51a993419cb90cc954aa4d9ae53fb012991d21yshang Compares two memory buffers of a given length. 115dd51a993419cb90cc954aa4d9ae53fb012991d21yshang 11658380e9c6174f23df78f777b4209c0fd75245cdamyronporter @param DestinationBuffer The first memory buffer 11758380e9c6174f23df78f777b4209c0fd75245cdamyronporter @param SourceBuffer The second memory buffer 11858380e9c6174f23df78f777b4209c0fd75245cdamyronporter @param Length The length of DestinationBuffer and SourceBuffer memory 119dd51a993419cb90cc954aa4d9ae53fb012991d21yshang regions to compare. Must be non-zero. 120dd51a993419cb90cc954aa4d9ae53fb012991d21yshang 121d531bfee01a957038d7ac1a16748558a62165fb2eric_tian @return 0 All Length bytes of the two buffers are identical. 122d531bfee01a957038d7ac1a16748558a62165fb2eric_tian @retval Non-zero The first mismatched byte in SourceBuffer subtracted from the first 123d531bfee01a957038d7ac1a16748558a62165fb2eric_tian mismatched byte in DestinationBuffer. 124dd51a993419cb90cc954aa4d9ae53fb012991d21yshang 125dd51a993419cb90cc954aa4d9ae53fb012991d21yshang**/ 126dd51a993419cb90cc954aa4d9ae53fb012991d21yshangINTN 127dd51a993419cb90cc954aa4d9ae53fb012991d21yshangEFIAPI 128dd51a993419cb90cc954aa4d9ae53fb012991d21yshangInternalMemCompareMem ( 129dd51a993419cb90cc954aa4d9ae53fb012991d21yshang IN CONST VOID *DestinationBuffer, 130dd51a993419cb90cc954aa4d9ae53fb012991d21yshang IN CONST VOID *SourceBuffer, 131dd51a993419cb90cc954aa4d9ae53fb012991d21yshang IN UINTN Length 132dd51a993419cb90cc954aa4d9ae53fb012991d21yshang ) 133dd51a993419cb90cc954aa4d9ae53fb012991d21yshang{ 134dd51a993419cb90cc954aa4d9ae53fb012991d21yshang while ((--Length != 0) && 135dd51a993419cb90cc954aa4d9ae53fb012991d21yshang (*(INT8*)DestinationBuffer == *(INT8*)SourceBuffer)) { 136dd51a993419cb90cc954aa4d9ae53fb012991d21yshang DestinationBuffer = (INT8*)DestinationBuffer + 1; 137dd51a993419cb90cc954aa4d9ae53fb012991d21yshang SourceBuffer = (INT8*)SourceBuffer + 1; 138dd51a993419cb90cc954aa4d9ae53fb012991d21yshang } 139dd51a993419cb90cc954aa4d9ae53fb012991d21yshang return (INTN)*(UINT8*)DestinationBuffer - (INTN)*(UINT8*)SourceBuffer; 140dd51a993419cb90cc954aa4d9ae53fb012991d21yshang} 141dd51a993419cb90cc954aa4d9ae53fb012991d21yshang 142dd51a993419cb90cc954aa4d9ae53fb012991d21yshang/** 143dd51a993419cb90cc954aa4d9ae53fb012991d21yshang Scans a target buffer for an 8-bit value, and returns a pointer to the 144dd51a993419cb90cc954aa4d9ae53fb012991d21yshang matching 8-bit value in the target buffer. 145dd51a993419cb90cc954aa4d9ae53fb012991d21yshang 1462fc59a003ed9104f9feebe0e418f2a04a50f3284myronporter @param Buffer The pointer to the target buffer to scan. 1472fc59a003ed9104f9feebe0e418f2a04a50f3284myronporter @param Length The count of 8-bit value to scan. Must be non-zero. 1482fc59a003ed9104f9feebe0e418f2a04a50f3284myronporter @param Value The value to search for in the target buffer. 149dd51a993419cb90cc954aa4d9ae53fb012991d21yshang 1502fc59a003ed9104f9feebe0e418f2a04a50f3284myronporter @return The pointer to the first occurrence or NULL if not found. 151dd51a993419cb90cc954aa4d9ae53fb012991d21yshang 152dd51a993419cb90cc954aa4d9ae53fb012991d21yshang**/ 153dd51a993419cb90cc954aa4d9ae53fb012991d21yshangCONST VOID * 154dd51a993419cb90cc954aa4d9ae53fb012991d21yshangEFIAPI 155dd51a993419cb90cc954aa4d9ae53fb012991d21yshangInternalMemScanMem8 ( 156dd51a993419cb90cc954aa4d9ae53fb012991d21yshang IN CONST VOID *Buffer, 157dd51a993419cb90cc954aa4d9ae53fb012991d21yshang IN UINTN Length, 158dd51a993419cb90cc954aa4d9ae53fb012991d21yshang IN UINT8 Value 159dd51a993419cb90cc954aa4d9ae53fb012991d21yshang ) 160dd51a993419cb90cc954aa4d9ae53fb012991d21yshang{ 161dd51a993419cb90cc954aa4d9ae53fb012991d21yshang CONST UINT8 *Pointer; 162dd51a993419cb90cc954aa4d9ae53fb012991d21yshang 163dd51a993419cb90cc954aa4d9ae53fb012991d21yshang Pointer = (CONST UINT8*)Buffer; 164dd51a993419cb90cc954aa4d9ae53fb012991d21yshang do { 165dd51a993419cb90cc954aa4d9ae53fb012991d21yshang if (*(Pointer++) == Value) { 16600dbccf2d5121545a89d88b04b408ebbb75aad0fqhuang return --Pointer; 167dd51a993419cb90cc954aa4d9ae53fb012991d21yshang } 168dd51a993419cb90cc954aa4d9ae53fb012991d21yshang } while (--Length != 0); 169dd51a993419cb90cc954aa4d9ae53fb012991d21yshang return NULL; 170dd51a993419cb90cc954aa4d9ae53fb012991d21yshang} 171dd51a993419cb90cc954aa4d9ae53fb012991d21yshang 172dd51a993419cb90cc954aa4d9ae53fb012991d21yshang/** 173dd51a993419cb90cc954aa4d9ae53fb012991d21yshang Scans a target buffer for a 16-bit value, and returns a pointer to the 174dd51a993419cb90cc954aa4d9ae53fb012991d21yshang matching 16-bit value in the target buffer. 175dd51a993419cb90cc954aa4d9ae53fb012991d21yshang 1762fc59a003ed9104f9feebe0e418f2a04a50f3284myronporter @param Buffer The pointer to the target buffer to scan. 1772fc59a003ed9104f9feebe0e418f2a04a50f3284myronporter @param Length The count of 16-bit value to scan. Must be non-zero. 1782fc59a003ed9104f9feebe0e418f2a04a50f3284myronporter @param Value The value to search for in the target buffer. 179dd51a993419cb90cc954aa4d9ae53fb012991d21yshang 1802fc59a003ed9104f9feebe0e418f2a04a50f3284myronporter @return The pointer to the first occurrence or NULL if not found. 181dd51a993419cb90cc954aa4d9ae53fb012991d21yshang 182dd51a993419cb90cc954aa4d9ae53fb012991d21yshang**/ 183dd51a993419cb90cc954aa4d9ae53fb012991d21yshangCONST VOID * 184dd51a993419cb90cc954aa4d9ae53fb012991d21yshangEFIAPI 185dd51a993419cb90cc954aa4d9ae53fb012991d21yshangInternalMemScanMem16 ( 186dd51a993419cb90cc954aa4d9ae53fb012991d21yshang IN CONST VOID *Buffer, 187dd51a993419cb90cc954aa4d9ae53fb012991d21yshang IN UINTN Length, 188dd51a993419cb90cc954aa4d9ae53fb012991d21yshang IN UINT16 Value 189dd51a993419cb90cc954aa4d9ae53fb012991d21yshang ) 190dd51a993419cb90cc954aa4d9ae53fb012991d21yshang{ 191dd51a993419cb90cc954aa4d9ae53fb012991d21yshang CONST UINT16 *Pointer; 192dd51a993419cb90cc954aa4d9ae53fb012991d21yshang 193dd51a993419cb90cc954aa4d9ae53fb012991d21yshang Pointer = (CONST UINT16*)Buffer; 194dd51a993419cb90cc954aa4d9ae53fb012991d21yshang do { 195dd51a993419cb90cc954aa4d9ae53fb012991d21yshang if (*(Pointer++) == Value) { 19600dbccf2d5121545a89d88b04b408ebbb75aad0fqhuang return --Pointer; 197dd51a993419cb90cc954aa4d9ae53fb012991d21yshang } 198dd51a993419cb90cc954aa4d9ae53fb012991d21yshang } while (--Length != 0); 199dd51a993419cb90cc954aa4d9ae53fb012991d21yshang return NULL; 200dd51a993419cb90cc954aa4d9ae53fb012991d21yshang} 201dd51a993419cb90cc954aa4d9ae53fb012991d21yshang 202dd51a993419cb90cc954aa4d9ae53fb012991d21yshang/** 203dd51a993419cb90cc954aa4d9ae53fb012991d21yshang Scans a target buffer for a 32-bit value, and returns a pointer to the 204dd51a993419cb90cc954aa4d9ae53fb012991d21yshang matching 32-bit value in the target buffer. 205dd51a993419cb90cc954aa4d9ae53fb012991d21yshang 2062fc59a003ed9104f9feebe0e418f2a04a50f3284myronporter @param Buffer The pointer to the target buffer to scan. 2072fc59a003ed9104f9feebe0e418f2a04a50f3284myronporter @param Length The count of 32-bit value to scan. Must be non-zero. 2082fc59a003ed9104f9feebe0e418f2a04a50f3284myronporter @param Value The value to search for in the target buffer. 209dd51a993419cb90cc954aa4d9ae53fb012991d21yshang 2102fc59a003ed9104f9feebe0e418f2a04a50f3284myronporter @return The pointer to the first occurrence or NULL if not found. 211dd51a993419cb90cc954aa4d9ae53fb012991d21yshang 212dd51a993419cb90cc954aa4d9ae53fb012991d21yshang**/ 213dd51a993419cb90cc954aa4d9ae53fb012991d21yshangCONST VOID * 214dd51a993419cb90cc954aa4d9ae53fb012991d21yshangEFIAPI 215dd51a993419cb90cc954aa4d9ae53fb012991d21yshangInternalMemScanMem32 ( 216dd51a993419cb90cc954aa4d9ae53fb012991d21yshang IN CONST VOID *Buffer, 217dd51a993419cb90cc954aa4d9ae53fb012991d21yshang IN UINTN Length, 218dd51a993419cb90cc954aa4d9ae53fb012991d21yshang IN UINT32 Value 219dd51a993419cb90cc954aa4d9ae53fb012991d21yshang ) 220dd51a993419cb90cc954aa4d9ae53fb012991d21yshang{ 221dd51a993419cb90cc954aa4d9ae53fb012991d21yshang CONST UINT32 *Pointer; 222dd51a993419cb90cc954aa4d9ae53fb012991d21yshang 223dd51a993419cb90cc954aa4d9ae53fb012991d21yshang Pointer = (CONST UINT32*)Buffer; 224dd51a993419cb90cc954aa4d9ae53fb012991d21yshang do { 225dd51a993419cb90cc954aa4d9ae53fb012991d21yshang if (*(Pointer++) == Value) { 22600dbccf2d5121545a89d88b04b408ebbb75aad0fqhuang return --Pointer; 227dd51a993419cb90cc954aa4d9ae53fb012991d21yshang } 228dd51a993419cb90cc954aa4d9ae53fb012991d21yshang } while (--Length != 0); 229dd51a993419cb90cc954aa4d9ae53fb012991d21yshang return NULL; 230dd51a993419cb90cc954aa4d9ae53fb012991d21yshang} 231dd51a993419cb90cc954aa4d9ae53fb012991d21yshang 232dd51a993419cb90cc954aa4d9ae53fb012991d21yshang/** 233dd51a993419cb90cc954aa4d9ae53fb012991d21yshang Scans a target buffer for a 64-bit value, and returns a pointer to the 234dd51a993419cb90cc954aa4d9ae53fb012991d21yshang matching 64-bit value in the target buffer. 235dd51a993419cb90cc954aa4d9ae53fb012991d21yshang 2362fc59a003ed9104f9feebe0e418f2a04a50f3284myronporter @param Buffer The pointer to the target buffer to scan. 2372fc59a003ed9104f9feebe0e418f2a04a50f3284myronporter @param Length The count of 64-bit value to scan. Must be non-zero. 2382fc59a003ed9104f9feebe0e418f2a04a50f3284myronporter @param Value The value to search for in the target buffer. 239dd51a993419cb90cc954aa4d9ae53fb012991d21yshang 2402fc59a003ed9104f9feebe0e418f2a04a50f3284myronporter @return The pointer to the first occurrence or NULL if not found. 241dd51a993419cb90cc954aa4d9ae53fb012991d21yshang 242dd51a993419cb90cc954aa4d9ae53fb012991d21yshang**/ 243dd51a993419cb90cc954aa4d9ae53fb012991d21yshangCONST VOID * 244dd51a993419cb90cc954aa4d9ae53fb012991d21yshangEFIAPI 245dd51a993419cb90cc954aa4d9ae53fb012991d21yshangInternalMemScanMem64 ( 246dd51a993419cb90cc954aa4d9ae53fb012991d21yshang IN CONST VOID *Buffer, 247dd51a993419cb90cc954aa4d9ae53fb012991d21yshang IN UINTN Length, 248dd51a993419cb90cc954aa4d9ae53fb012991d21yshang IN UINT64 Value 249dd51a993419cb90cc954aa4d9ae53fb012991d21yshang ) 250dd51a993419cb90cc954aa4d9ae53fb012991d21yshang{ 251dd51a993419cb90cc954aa4d9ae53fb012991d21yshang CONST UINT64 *Pointer; 252dd51a993419cb90cc954aa4d9ae53fb012991d21yshang 253dd51a993419cb90cc954aa4d9ae53fb012991d21yshang Pointer = (CONST UINT64*)Buffer; 254dd51a993419cb90cc954aa4d9ae53fb012991d21yshang do { 255dd51a993419cb90cc954aa4d9ae53fb012991d21yshang if (*(Pointer++) == Value) { 25600dbccf2d5121545a89d88b04b408ebbb75aad0fqhuang return --Pointer; 257dd51a993419cb90cc954aa4d9ae53fb012991d21yshang } 258dd51a993419cb90cc954aa4d9ae53fb012991d21yshang } while (--Length != 0); 259dd51a993419cb90cc954aa4d9ae53fb012991d21yshang return NULL; 260dd51a993419cb90cc954aa4d9ae53fb012991d21yshang} 261