บทนำ
ตามที่อธิบายไว้ในหน้าภาพรวม โค้ดโฮสต์ จะเรียก RPC ไปยังไลบรารีแซนด์บ็อกซ์ การแซนด์บ็อกซ์จะทำให้มีการแยกหน่วยความจำ ระหว่างกระบวนการต่างๆ ดังนั้นโค้ดโฮสต์จึงไม่สามารถเข้าถึงหน่วยความจำในไลบรารีที่แซนด์บ็อกซ์ได้โดยตรง
SAPI มีชุดคลาส C++ ที่ครอบคลุมเพื่อให้มั่นใจว่าโค้ดโฮสต์จะเข้าถึงตัวแปรและบล็อกหน่วยความจำ ในกระบวนการระยะไกลได้ และเพื่อให้การใช้งานโค้ดตรรกะหลัก ง่ายขึ้น อย่างไรก็ตาม ในหลายกรณี คุณจะใช้ประเภท C แบบเนทีฟได้ด้วย
ความจำเป็นในการใช้ประเภทพิเศษ (ประเภท SAPI) เกิดขึ้นเมื่อส่งพอยน์เตอร์ไปยัง ประเภทธรรมดาและบล็อกหน่วยความจำ (โครงสร้าง อาร์เรย์)
เช่น เมื่อเรียกใช้ฟังก์ชันที่ใช้พอยน์เตอร์ คุณต้อง
แปลงพอยน์เตอร์เป็นพอยน์เตอร์ที่สอดคล้องกันภายในหน่วยความจำของแซนด์บ็อกซ์ไลบรารี
ข้อมูลโค้ดด้านล่างแสดงภาพสถานการณ์นี้ แทนที่จะใช้อาร์เรย์ของจำนวนเต็ม 3 รายการ ระบบจะสร้าง::sapi::v::Array<int>
ออบเจ็กต์ซึ่งส่งผ่านใน
การเรียก API ของไลบรารี Sandbox ได้
int arr[3] = {1, 2, 3};
sapi::v::Array<int> sarr(arr, ABSL_ARRAYSIZE(arr));
หากต้องการดูภาพรวมที่ครอบคลุมของประเภท SAPI ที่มีอยู่ทั้งหมด โปรดดูvar_*.h
ไฟล์ส่วนหัวในซอร์สโค้ดโปรเจ็กต์ SAPI ไฟล์ส่วนหัวเหล่านี้มีคลาสและเทมเพลตที่แสดงข้อมูลประเภทต่างๆ
เช่น
::sapi::v::UChar
แสดงอักขระที่ไม่มีเครื่องหมายที่รู้จักกันดี::sapi::v::Array<int>
แสดงอาร์เรย์ของจำนวนเต็ม
ประเภท SAPI
ส่วนนี้จะแนะนำ SAPI 3 ประเภทที่มักพบในโค้ดโฮสต์
ตัวชี้ SAPI
หากฟังก์ชันที่จะแซนด์บ็อกซ์ต้องส่งพอยน์เตอร์ พอยน์เตอร์นี้ควรได้รับจากเมธอดใดเมธอดหนึ่งในPtrXXX()
ด้านล่าง วิธีการเหล่านี้จะได้รับการติดตั้งใช้งาน
โดยคลาสตัวแปร SAPI
ประเภทเคอร์เซอร์ | |
---|---|
::PtrNone() |
ไม่ซิงโครไนซ์หน่วยความจำพื้นฐานระหว่างกระบวนการโค้ดโฮสต์กับกระบวนการไลบรารีแซนด์บ็อกซ์เมื่อส่งไปยังฟังก์ชัน API ที่แซนด์บ็อกซ์ |
::PtrBefore() |
ซิงโครไนซ์หน่วยความจำของออบเจ็กต์ที่ชี้ไปยังก่อนการเรียกฟังก์ชัน API ที่แซนด์บ็อกซ์ ซึ่งหมายความว่าระบบจะโอนหน่วยความจำภายในของตัวแปรที่ชี้ไปยังกระบวนการไลบรารี Sandbox ก่อนที่จะเริ่มการเรียก |
::PtrAfter() |
ซิงโครไนซ์หน่วยความจำของออบเจ็กต์ที่ชี้ไปยัง หลังจากการเรียกใช้ฟังก์ชัน Sandboxed API ซึ่งหมายความว่าระบบจะโอนหน่วยความจำระยะไกลของตัวแปรที่ชี้ไปยังหน่วยความจำของกระบวนการรหัสโฮสต์หลังจากการเรียกใช้เสร็จสมบูรณ์ |
::PtrBoth() |
รวมฟังก์ชันการทำงานของ ::PtrBefore() และ ::PtrAfter() |
ดูเอกสารประกอบสำหรับตัวชี้ SAPI ได้ที่นี่
โครงสร้าง SAPI
เทมเพลต ::sapi::v::Struct
มีเอกสารประกอบอยู่ใน
var_struct.h
โดยมีเครื่องมือสร้างที่ใช้เพื่อรวมโครงสร้างที่มีอยู่ SAPI
Struct มีเมธอดทั้งหมดที่ระบุไว้ในตัวชี้ SAPI เพื่อ
รับออบเจ็กต์ ::sapi::v::Ptr
ที่ใช้สำหรับการเรียกไลบรารีในแซนด์บ็อกซ์ได้
ข้อมูลโค้ดด้านล่างแสดงโครงสร้างที่เริ่มต้นแล้วส่งไปยังการเรียกฟังก์ชันแซนด์บ็อกซ์ในตัวอย่าง 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 ดังนั้น คุณจะต้องโอนข้อมูล Sandboxee ก่อนที่โค้ดโฮสต์จะเข้าถึงได้
อาร์เรย์ SAPI
เทมเพลต ::sapi::v::Array
มีเอกสารประกอบอยู่ใน
var_array.h
โดยมีตัวสร้าง 2 ตัว ตัวหนึ่งใช้เพื่อห่ออาร์เรย์ของ
องค์ประกอบที่มีอยู่ และอีกตัวใช้เพื่อสร้างอาร์เรย์แบบไดนามิก
ข้อมูลโค้ดนี้ (นำมาจากตัวอย่าง sum) แสดงการใช้ตัวสร้างที่ครอบอาร์เรย์ซึ่งออบเจ็กต์นี้ไม่ได้เป็นเจ้าของ
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 เพื่อ
รับออบเจ็กต์ ::sapi::v::Ptr
ที่ใช้สำหรับการเรียกไลบรารีในแซนด์บ็อกซ์ได้