///|
/// Windows SID string `S-{version}-{authority}-{rid}*`.
pub fn format_sid(
data : Bytes,
pos : Int,
length : Int,
) -> Result[(String, Int), EvtxError] {
let _ = match need(data, pos, 8, "sid") {
Ok(v) => v
Err(e) => return Err(e)
}
let version = data[pos].to_int()
let count = data[pos + 1].to_int()
let needed = 8 + 4 * count
if length != 0 && length < needed {
return Err(Truncated("sid", pos, needed))
}
let _ = match need(data, pos, needed, "sid body") {
Ok(v) => v
Err(e) => return Err(e)
}
let (id_high, _) = match read_u32_be(data, pos + 2) {
Ok(v) => v
Err(e) => return Err(e)
}
let (id_low, _) = match read_u16_be(data, pos + 6) {
Ok(v) => v
Err(e) => return Err(e)
}
let authority = (id_high.to_int64() << 16) ^ id_low.to_int64()
let out = StringBuilder()
out.write_string("S-")
out.write_string(version.to_string())
out.write_string("-")
out.write_string(authority.to_string())
let mut ofs = pos + 8
for i = 0; i < count; i = i + 1 {
let (rid, next) = match read_u32(data, ofs) {
Ok(v) => v
Err(e) => return Err(e)
}
out.write_string("-")
out.write_string(rid.to_string())
ofs = next
}
Ok((out.to_string(), needed))
}