वैरिएबल गाइड

शुरुआती जानकारी

जैसा कि खास जानकारी पेज पर बताया गया है, होस्ट कोड सैंडबॉक्स की गई लाइब्रेरी को RPC कॉल करता है. सैंडबॉक्सिंग की वजह से, प्रोसेस के बीच मेमोरी अलग-अलग होती है. इसलिए, होस्ट कोड सीधे सैंडबॉक्स की गई लाइब्रेरी में मेमोरी को ऐक्सेस नहीं कर सकता.

यह पक्का करने के लिए कि होस्ट कोड किसी रिमोट प्रोसेस में वैरिएबल और मेमोरी ब्लॉक को ऐक्सेस कर सके और मुख्य लॉजिक कोड को आसानी से लागू कर सके, SAPI C++ क्लास का एक बड़ा सेट उपलब्ध कराता है. हालांकि, कई मामलों में नेटिव सी-टाइप का भी इस्तेमाल किया जा सकता है.

पॉइंटर को सिंपल टाइप और मेमोरी ब्लॉक (स्ट्रक्चर, अरे) में पास करने पर, खास टाइप (SAPI टाइप) की ज़रूरत पड़ती है.

उदाहरण के लिए, पॉइंटर लेते हुए किसी फ़ंक्शन को कॉल करते समय, पॉइंटर को सैंडबॉक्स की गई लाइब्रेरी की मेमोरी में, उससे जुड़े पॉइंटर में बदलना ज़रूरी है. नीचे दिया गया कोड स्निपेट, यह उदाहरण दिखाता है. तीन पूर्णांकों वाली कैटगरी के बजाय, एक ::sapi::v::Array<int> ऑब्जेक्ट बनाया जाता है. इसे सैंडबॉक्स लाइब्रेरी के एपीआई कॉल में भेजा जा सकता है:

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

सभी उपलब्ध SAPI टाइप के बारे में ज़्यादा जानने के लिए, SAPI प्रोजेक्ट सोर्स कोड में मौजूद var_*.h हेडर फ़ाइलें देखें. ये हेडर फ़ाइलें कई तरह के डेटा को दिखाने वाली क्लास और टेंप्लेट उपलब्ध कराती हैं, जैसे:

  • ::sapi::v::UChar बिना हस्ताक्षर वाले जाने-माने वर्णों को दिखाता है
  • ::sapi::v::Array<int>, पूर्णांकों का कलेक्शन दिखाता है

SAPI के टाइप

इस सेक्शन में तीन एसएपीआई टाइप के बारे में बताया गया है, जो आम तौर पर होस्ट कोड में दिखते हैं.

एसएपीआई पॉइंटर

अगर किसी फ़ंक्शन को सैंडबॉक्स करने के लिए, पॉइंटर पास करना ज़रूरी है, तो इस पॉइंटर को नीचे दिए गए PtrXXX() तरीकों में से किसी एक से लिया जाना चाहिए. इन तरीकों को SAPI वैरिएबल क्लास से लागू किया जाता है.

पॉइंटर के टाइप
::PtrNone() किसी सैंडबॉक्स किए गए एपीआई फ़ंक्शन में भेजे जाने पर, होस्ट कोड प्रोसेस और सैंडबॉक्स लाइब्रेरी प्रोसेस के बीच मौजूद मेमोरी को सिंक नहीं करता.
::PtrBefore() सैंडबॉक्स किए गए एपीआई फ़ंक्शन कॉल होने से पहले उस ऑब्जेक्ट की मेमोरी को सिंक करता है जिस पर यह पॉइंट करता है. इसका मतलब है कि कॉल शुरू होने से पहले, पॉइंट किए गए वैरिएबल की लोकल मेमोरी को सैंडबॉक्स लाइब्रेरी की प्रोसेस में ट्रांसफ़र कर दिया जाएगा.
::PtrAfter() सैंडबॉक्स किए गए एपीआई फ़ंक्शन कॉल होने के बाद, उस ऑब्जेक्ट की मेमोरी को सिंक करती है जिसे यह पॉइंट करता है. इसका मतलब है कि कॉल पूरा होने के बाद, पॉइंट किए गए वैरिएबल की रिमोट मेमोरी को होस्ट कोड प्रोसेस मेमोरी में ट्रांसफ़र कर दिया जाएगा.
::PtrBoth() ::PtrBefore() और ::PtrAfter() की सुविधाओं को जोड़ता है.

SAPI पॉइंटर के दस्तावेज़ यहां देखे जा सकते हैं.

एसएपीआई स्ट्रक्ट

::sapi::v::Struct टेंप्लेट को var_struct.h में दर्ज किया गया है. यह एक ऐसा कंस्ट्रक्टर देता है जिसका इस्तेमाल मौजूदा स्ट्रक्चर को रैप करने के लिए किया जा सकता है. SAPI Struct ::sapi::v::Ptr ऑब्जेक्ट पाने के लिए, SAPI पॉइंटर में बताए गए सभी तरीके उपलब्ध कराता है. इनका इस्तेमाल सैंडबॉक्स लाइब्रेरी कॉल के लिए किया जा सकता है.

नीचे दिया गया कोड स्निपेट, उस स्ट्रक्चर को दिखाता है जिसे शुरू किया जा रहा है और फिर zlib उदाहरण में सैंडबॉक्स फ़ंक्शन कॉल को पास किया जा रहा है:

sapi::v::Struct<sapi::zlib::z_stream> strm;
…
if (ret = api.deflateInit_(strm.PtrBoth(), Z_DEFAULT_COMPRESSION,
                             version.PtrBefore(), sizeof(sapi::zlib::z_stream));
…

अगर आपके मौजूदा स्ट्रक्चर में पॉइंटर हैं, तो वे पॉइंटर सैंडबॉक्सी में मौजूद पतों पर ले जाएंगे. ऐसा होने पर, आपको Sandboxee का डेटा ट्रांसफ़र करना होगा. इसके बाद ही, होस्ट कोड को ऐक्सेस किया जा सकेगा.

SAPI सरणियां

::sapi::v::Array टेंप्लेट को var_array.h में दर्ज किया गया है. इससे दो कंस्ट्रक्टर मिलते हैं. एक कंस्ट्रक्टर का इस्तेमाल एलिमेंट के मौजूदा कलेक्शन को रैप करने के लिए किया जा सकता है और दूसरा कंस्ट्रक्टर, डाइनैमिक तरीके से अरे बनाने के लिए.

यह कोड स्निपेट (योग उदाहरण से लिया गया), कंस्ट्रक्टर के इस्तेमाल को दिखाता है, जो ऐसे अरे के चारों ओर रैप होता है जिसका मालिकाना हक इस ऑब्जेक्ट के पास नहीं है:

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

यह कोड स्निपेट, कंस्ट्रक्टर का एक उदाहरण दिखाता है जिसका इस्तेमाल डाइनैमिक तौर पर अरे बनाने के लिए किया जाता है:

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

SAPI अरे ::sapi::v::Ptr ऑब्जेक्ट पाने के लिए SAPI पॉइंटर में बताए गए सभी तरीके उपलब्ध कराता है. इनका इस्तेमाल सैंडबॉक्स लाइब्रेरी कॉल के लिए किया जा सकता है.