Değişkenler Kılavuzu

Giriş

Genel Bakış sayfasında açıklandığı gibi, Ana Makine Kodu Korumalı Alana Sahip Kitaplık'a RPC çağrıları yapar. Korumalı alan, işlemler arasında bellekte ayrım yapılmasıyla sonuçlanır. Bu nedenle, Ana Makine Kodu Korumalı Alana Sahip Kitaplık'taki belleğe doğrudan erişemez.

Ana makine kodunun uzak bir işlemdeki değişkenlere ve bellek bloklarına erişebilmesini sağlamak ve ana mantık kodunun uygulanmasını kolaylaştırmak için SAPI kapsamlı bir C++ sınıfları kümesi sağlar. Ancak birçok durumda yerel C türlerini de kullanabilirsiniz.

Özel türlere (SAPI Türleri) ihtiyaç, işaretçileri basit türlere ve bellek bloklarına (yapılar, diziler) aktarırken ortaya çıkar.

Örneğin, işaretçi alan bir işlev çağrılırken, işaretçi, Korumalı Alana Sahip Kitaplık'ın 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ştirmektedir. Üç tam sayı dizisi yerine, Sandboxed Library'nin API çağrısında geçirilebilecek bir ::sapi::v::Array<int> nesnesi oluşturulur:

int arr[3] = {1, 2, 3};
sapi::v::Array<int> sarr(arr, ABSL_ARRAYSIZE(arr));

Kullanılabilen tüm SAPI Türlerine kapsamlı bir genel bakış için SAPI proje kaynak kodundaki var_*.h 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 imzasız karakterleri temsil eder
  • ::sapi::v::Array<int>, bir tam sayı dizisini temsil eder

SAPI Türleri

Bu bölümde, Ana Makine Kodu'nda yaygın olarak görülen üç SAPI Türü açıklanmaktadır.

SAPI İşaretçileri

Korumalı alana alınacak bir işlev için işaretçi geçirilmesi gerekiyorsa bu işaretçi aşağıdaki PtrXXX() yöntemlerinin birinden alınmalıdır. Bu yöntemler, SAPI değişken sınıfları tarafından uygulanır.

İşaretçi Türleri
::PtrNone() Korumalı alana alınmış bir API işlevine geçirildiğinde, temel belleği Ana Makine Kodu işlemi ile Korumalı Alana Sahip Kitaplık işlemi arasında senkronize etmez.
::PtrBefore() Korumalı alana alınmış 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, çağrı başlatılmadan önce Korumalı Alana Sahip Kitaplık işlemine aktarılacağı anlamına gelir.
::PtrAfter() Korumalı alana alınmış API işlevi çağrısı gerçekleştikten 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ümanlara buradan ulaşabilirsiniz.

SAPI Yapısı

::sapi::v::Struct şablonu var_struct.h dosyasında belgelenmiştir. Mevcut yapıları sarmalamak için kullanılabilecek bir oluşturucu sağlar. SAPI Yapısı, korumalı alana alınmış kitaplık çağrıları için kullanılabilecek bir ::sapi::v::Ptr nesnesi elde etmek için SAPI İşaretçileri'nde açıklanan tüm yöntemleri sağlar.

Aşağıdaki kod snippet'i, başlatılan ve daha sonra zlib örneğinde korumalı alana alınmış bir işlev çağrısına geçirilen bir yapıyı gösterir:

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 struct'ınız işaretçiler içeriyorsa bu işaretçiler Sandboxee'deki adresleri işaret eder. Sonuç olarak, Sandboxee verileri Ana Makine Kodu tarafından erişilebilir hale gelmeden önce aktarmanız gerekir.

SAPI Dizileri

::sapi::v::Array şablonu var_array.h dosyasında belgelenmiştir. Biri mevcut öğe dizilerini sarmalamak için kullanılabilen, diğeri ise dinamik olarak dizi oluşturmak için kullanılabilen iki oluşturucu sağlar.

Bu kod snippet'i (toplam örneğinden alınmıştır), bu nesneye ait olmayan bir diziyi sarmalayan kurucunun kullanımını gösterir:

int arr[10];
sapi::v::Array<int> iarr(arr, ABSL_ARRAYSIZE(arr));

Bu kod snippet'i, dinamik bir şekilde dizi oluşturmak için kullanılan kurucunun bir örneğini gösterir:

sapi::v::Array<uint8_t> buffer(PNG_IMAGE_SIZE(*image.mutable_data()));

SAPI Dizisi, korumalı alana alınmış kitaplık çağrılarında kullanılabilecek bir ::sapi::v::Ptr nesnesi elde etmek için SAPI İşaretçileri'nde açıklanan tüm yöntemleri sağlar.