Giriş
Genel bakış sayfasında açıklandığı gibi, Host Code, Sandboxed Library'ye RPC çağrıları yapar. Korumalı alan, işlemler arasında bellek ayrımına neden olur. Bu nedenle, ana makine kodu, korumalı alan kitaplığındaki belleğe doğrudan erişemez.
SAPI, ana makine kodunun uzak bir süreçteki değişkenlere ve bellek bloklarına erişebildiğinden emin olmak ve ana mantık kodunun uygulanmasını kolaylaştırmak için kapsamlı bir C++ sınıfı grubu sağlar. Ancak çoğu durumda yerel C türlerini de kullanabilirsiniz.
Özel türlere (SAPI türleri) işaretçi geçirme ihtiyacı, basit türlere ve bellek bloklarına (yapılar, diziler) işaretçi geçirilirken ortaya çıkar.
Örneğin, bir işaretçi alan işlev çağrılırken işaretçi, Sandboxed Library'nin belleğinde karşılık gelen bir işaretçiye dönüştürülmelidir.
Aşağıdaki kod snippet'i bu senaryoyu görselleştirir. Üç tam sayıdan oluşan bir dizi yerine, ::sapi::v::Array<int>
nesnesi oluşturulur. Bu nesne daha sonra Sandbox Kitaplığı'nın API çağrısına iletilebilir:
int arr[3] = {1, 2, 3};
sapi::v::Array<int> sarr(arr, ABSL_ARRAYSIZE(arr));
Kullanılabilen tüm SAPI Türleri'ne kapsamlı bir genel bakış için var_*.h
SAPI proje kaynak kodundaki başlık dosyalarını inceleyin. Bu başlık dosyaları, çeşitli veri türlerini temsil eden sınıflar ve şablonlar sağlar. Örneğin:
::sapi::v::UChar
, iyi bilinen işaretsiz karakterleri temsil eder.::sapi::v::Array<int>
, bir tam sayı dizisini temsil eder.
SAPI Türleri
Bu bölümde, ana makine kodunda yaygın olarak görülen üç SAPI türü tanıtılmaktadır.
SAPI İşaretçileri
Koruma alanına alınacak bir işlevin işaretçi iletilmesi gerekiyorsa bu işaretçi, aşağıdaki PtrXXX()
yöntemlerden biriyle alınmalıdır. Bu yöntemler, SAPI değişken sınıfları tarafından uygulanır.
İşaretçi Türleri | |
---|---|
::PtrNone() |
Korumalı alan API işlevine iletildiğinde temel belleği, ana makine kodu süreci ile korumalı alan kitaplığı süreci arasında senkronize etmez. |
::PtrBefore() |
Korumalı alan API işlevi çağrısı gerçekleşmeden önce, işaret ettiği nesnenin belleğini senkronize eder. Bu, işaret edilen değişkenin yerel belleğinin, arama başlatılmadan önce Sandboxed Library işlemine aktarılacağı anlamına gelir. |
::PtrAfter() |
Korumalı alan API işlevi çağrısı yapıldıktan sonra, işaret ettiği nesnenin belleğini senkronize eder. Bu, işaret edilen değişkenin uzak belleğinin, çağrı tamamlandıktan sonra ana makine kodu işlem belleğine aktarılacağı anlamına gelir. |
::PtrBoth() |
::PtrBefore() ve ::PtrAfter() işlevlerini birleştirir. |
SAPI işaretçileriyle ilgili dokümanları burada bulabilirsiniz.
SAPI Struct
Şablon ::sapi::v::Struct
, var_struct.h dosyasında belgelenmiştir.
Mevcut yapıları sarmak için kullanılabilecek bir oluşturucu sağlar. SAPI
Struct, SAPI İşaretçileri'nde belirtilen tüm yöntemleri sağlayarak korumalı alan kitaplığı çağrıları için kullanılabilecek bir ::sapi::v::Ptr
nesnesi elde etmenizi sağlar.
Aşağıdaki kod snippet'inde, bir yapının başlatılıp zlib örneğindeki korumalı alan işlevi çağrısına iletildiği gösterilmektedir:
sapi::v::Struct<sapi::zlib::z_stream> strm;
…
if (ret = api.deflateInit_(strm.PtrBoth(), Z_DEFAULT_COMPRESSION,
version.PtrBefore(), sizeof(sapi::zlib::z_stream));
…
Mevcut yapınızda işaretçiler varsa bu işaretçiler Sandboxee'deki adresleri gösterir. Bu nedenle, Sandboxee verilerini Ana Makine Kodu'na erişilebilir hale gelmeden önce aktarmanız gerekir.
SAPI Dizileri
::sapi::v::Array
şablonu, var_array.h içinde belgelenmiştir.
Bu şablon, iki oluşturucu sağlar. Bunlardan biri mevcut öğe dizilerini sarmalamak için, diğeri ise dinamik olarak dizi oluşturmak için kullanılabilir.
Bu kod snippet'i (sum example'dan alınmıştır), bu nesneye ait olmayan bir diziyi sarmalayan oluşturucunun kullanımını gösterir:
int arr[10];
sapi::v::Array<int> iarr(arr, ABSL_ARRAYSIZE(arr));
Bu kod snippet'inde, bir diziyi dinamik olarak oluşturmak için kullanılan oluşturucuya dair bir örnek gösterilmektedir:
sapi::v::Array<uint8_t> buffer(PNG_IMAGE_SIZE(*image.mutable_data()));
SAPI dizisi, SAPI işaretçilerinde belirtilen tüm yöntemleri sağlayarak korumalı alan kitaplığı çağrıları için kullanılabilecek bir ::sapi::v::Ptr
nesnesi elde etmenizi sağlar.