Fungsi CopyVolatileMemory

Fungsi CopyVolatileMemory menyalin konten blok memori sumber ke blok memori tujuan.

Penting

Beberapa informasi berkaitan dengan produk prarilis yang mungkin dimodifikasi secara substansial sebelum dirilis secara komersial. Microsoft tidak memberikan jaminan, tersirat maupun tersurat, sehubungan dengan informasi yang diberikan di sini.

Parameter

Tujuan Param [keluar]

Penunjuk ke alamat awal tujuan blok yang disalin.

Sumber Param [in]

Penunjuk ke alamat awal blok memori yang akan disalin.

Panjang Param [in]

Ukuran blok memori yang akan disalin, dalam byte.

Sintaks

volatile void* __cdecl
  CopyVolatileMemory (
    _Out_writes_bytes_all_(Length) volatile void* Destination,
    _In_reads_bytes_(Length) volatile const void* Source,
    SIZE_T Length
  );

Keterangan

API ini ada untuk memberikan perilaku CopyMemory (yaitu, menyalin memori dari satu lokasi ke lokasi lain) dalam situasi di mana pengembang perlu memastikan bahwa operasi salin terjadi (yaitu, tidak tunduk pada pengoptimalan pengkompilasi).

API memiliki properti berikut:

  • API tidak dikenali sebagai kompilator intrinsik sehingga pengkompilasi tidak akan pernah mengoptimalkan panggilan (baik sepenuhnya atau mengganti panggilan dengan urutan instruksi "setara"). Ini berbeda dari CopyMemory yang tunduk pada berbagai pengoptimalan pengkompilasi.
  • Saat panggilan kembali, data telah disalin dari Sumber ke Tujuan. Fungsi ini mengakses memori ke Sumber dan Tujuan hanya akan dilakukan dalam fungsi (yaitu pengkompilasi tidak dapat memindahkan akses memori dari fungsi ini).
  • API dapat melakukan akses memori yang tidak ditandatangani jika platform mengizinkannya.
  • API dapat mengakses lokasi memori lebih dari sekali sebagai bagian dari operasi penyalinannya.
  • Mirip dengan CopyMemory karena tidak mendukung operasi penyalinan ketika Sumber dan Tujuan saling tumpang tindih.

Catatan

Fungsi ini berfungsi pada semua versi Windows, bukan hanya yang terbaru. Anda perlu menggunakan SDK terbaru untuk mendapatkan deklarasi fungsi dari winbase.h header. Anda juga memerlukan pustaka (volatileaccessu.lib) dari SDK terbaru. Namun, biner yang dihasilkan akan berjalan dengan baik pada versi Windows yang lebih lama.

Contoh

HEADER MyHeader;
UCHAR RawBuffer[100];

// Ensure that the shared memory (which could be constantly changing)
// is copied in to the local MyHeader variable.
// Note that the compiler is allowed to optimize away calls to
// CopyMemory/RtlCopyMemory so those functions are not guaranteed to actually
// make a local copy of data.
//
// CopyVolatileMemory does not handle a source/dest buffer that overlap
// with each other (CopyMemory semantics).
//
// Assume SharedMemory points to virtual memory that is also mapped in an untrusted process.
// Assume that untrusted process is changing the memory contents while you are accessing it.
PVOID SharedMemory;

CopyVolatileMemory(&MyHeader, SharedMemory, sizeof(MyHeader));

if (MyHeader.Size < 100) {
  // Because MyHeader is local and we are guaranteed we actually made
  // a local copy, we can be sure that the "Size" value will not change
  // between the previous bounds check and the below call to RtlFillMemory.
  // If RtlCopyMemory/RtlCopyMemory had been used to copy the data, it is possible
  // that a compiler may optimize away the call to CopyMemory and instead fetch
  // the “size” field of MyHeader directly from untrusted memory two times.
  // The first time it would be fetched for the bounds check, and the second
  // time it is fetched is for the call to FillMemory. It is possible the memory
  // could have changed between the two accesses resulting in the size check
  // being ineffective.

  FillMemory (RawBuffer, MyHeader.Size, 0);
}

Persyaratan

Klien minimum yang didukung: Windows 11 Insider Preview Build TBD

Header: winbase.h (termasuk Winbase.h)

Pustaka mode kernel: volatileaccessk.lib

Pustaka mode pengguna: volatileaccessu.lib

Baca juga