คำแนะนำเกี่ยวกับตัวแปร

บทนำ

ตามที่อธิบายไว้ในหน้าภาพรวม โค้ดโฮสต์ จะเรียก 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 ที่ใช้สำหรับการเรียกไลบรารีในแซนด์บ็อกซ์ได้