libfwnt(3)

πŸ“¦
this version Β· 2 versions
, in debian trixie, opensuse-leap 16.0, ubuntu questing, ubuntu resolute, ubuntu stonking

πŸ¦‹ libfwnt β€” the libfwnt(3) library page, bestie edition πŸ’…

okay so. this is the manual page for the libfwnt library, and it lives in the Library Functions Manual section because of course it does, it's a library, it's giving main character energy ✨


πŸ’– NAME πŸ’–

libfwnt.h β€” a library that supports the common Windows NT specific formats πŸͺŸπŸ‘‘


🌸 SYNOPSIS 🌸

first things first, bestie, you gotta let it in:

#include <libfwnt.h>

that's the whole vibe. everything below comes from that one include 🫢

⭐ Support functions ⭐

const char *
libfwnt_get_version(void);
  • libfwnt_get_version β€” the little one. no arguments, just vibes, and it hands you back the library version as a const char * πŸ‘‘

πŸ”” Notify functions πŸ””

void
libfwnt_notify_set_verbose(int verbose);

int
libfwnt_notify_set_stream(FILE *stream, libfwnt_error_t **error);

int
libfwnt_notify_stream_open(const char *filename,
    libfwnt_error_t **error);

int
libfwnt_notify_stream_close(libfwnt_error_t **error);
  • libfwnt_notify_set_verbose β€” takes an int verbose, returns void. it just wants to know how chatty you wanna be πŸ—£οΈ
  • libfwnt_notify_set_stream β€” hands in a FILE *stream plus an libfwnt_error_t **error slot.
  • libfwnt_notify_stream_open β€” opens a notify stream from a const char *filename, plus the libfwnt_error_t **error slot.
  • libfwnt_notify_stream_close β€” closes it back up. just the libfwnt_error_t **error slot here, no filename, she's done πŸ’…

πŸ’€ Error functions πŸ’€

void
libfwnt_error_free(libfwnt_error_t **error);

int
libfwnt_error_fprint(libfwnt_error_t *error, FILE *stream);

int
libfwnt_error_sprint(libfwnt_error_t *error, char *string, size_t size);

int
libfwnt_error_backtrace_fprint(libfwnt_error_t *error, FILE *stream);

int
libfwnt_error_backtrace_sprint(libfwnt_error_t *error, char *string,
    size_t size);
  • libfwnt_error_free β€” returns void, takes the libfwnt_error_t **error and lets it go πŸ•ŠοΈ
  • libfwnt_error_fprint β€” error + a FILE *stream, prints it out to the stream.
  • libfwnt_error_sprint β€” error + a char *string + a size_t size, prints it into your buffer instead.
  • libfwnt_error_backtrace_fprint β€” same as fprint but with the backtrace, to a FILE *stream.
  • libfwnt_error_backtrace_sprint β€” same as sprint but with the backtrace, into char *string with size size_t size. the receipts πŸ”₯

πŸ›‘οΈ Security descriptor functions πŸ›‘οΈ

int
libfwnt_security_descriptor_initialize(libfwnt_security_descriptor_t **security_descriptor,
    libfwnt_error_t **error);

int
libfwnt_security_descriptor_free(libfwnt_security_descriptor_t **security_descriptor,
    libfwnt_error_t **error);

int
libfwnt_security_descriptor_copy_from_byte_stream(libfwnt_security_descriptor_t *security_descriptor,
    const uint8_t *byte_stream, size_t byte_stream_size, int byte_order,
    libfwnt_error_t **error);

int
libfwnt_security_descriptor_get_owner(libfwnt_security_descriptor_t *security_descriptor,
    libfwnt_security_identifier_t **security_identifier,
    libfwnt_error_t **error);

int
libfwnt_security_descriptor_get_group(libfwnt_security_descriptor_t *security_descriptor,
    libfwnt_security_identifier_t **security_identifier,
    libfwnt_error_t **error);

int
libfwnt_security_descriptor_get_discretionary_acl(libfwnt_security_descriptor_t *security_descriptor,
    libfwnt_access_control_list_t **access_control_list,
    libfwnt_error_t **error);

int
libfwnt_security_descriptor_get_system_acl(libfwnt_security_descriptor_t *security_descriptor,
    libfwnt_access_control_list_t **access_control_list,
    libfwnt_error_t **error);
  • libfwnt_security_descriptor_initialize β€” takes a libfwnt_security_descriptor_t **security_descriptor and an libfwnt_error_t **error. sets the whole thing up ✨
  • libfwnt_security_descriptor_free β€” same signature, opposite job: releases it πŸŽ€
  • libfwnt_security_descriptor_copy_from_byte_stream β€” takes the descriptor, a const uint8_t *byte_stream, size_t byte_stream_size, an int byte_order and the error slot. copies right out of the raw bytes, no cap 🫢
  • libfwnt_security_descriptor_get_owner β€” hands you back the owner as a libfwnt_security_identifier_t **security_identifier πŸ’œ
  • libfwnt_security_descriptor_get_group β€” same deal but for the group. the group chat, literally 😭
  • libfwnt_security_descriptor_get_discretionary_acl β€” gives you a libfwnt_access_control_list_t **access_control_list for the discretionary ACL.
  • libfwnt_security_descriptor_get_system_acl β€” same thing but for the system ACL. two ACLs, two besties, both iconic πŸ’…

πŸ†” Security identifier (SID) functions πŸ†”

int
libfwnt_security_identifier_initialize(libfwnt_security_identifier_t **security_identifier,
    libfwnt_error_t **error);

int
libfwnt_security_identifier_free(libfwnt_security_identifier_t **security_identifier,
    libfwnt_error_t **error);

int
libfwnt_security_identifier_copy_from_byte_stream(libfwnt_security_identifier_t *security_identifier,
    const uint8_t *byte_stream, size_t byte_stream_size, int byte_order,
    libfwnt_error_t **error);

int
libfwnt_security_identifier_get_string_size(libfwnt_security_identifier_t *security_identifier,
    size_t *string_size, uint32_t string_format_flags,
    libfwnt_error_t **error);

int
libfwnt_security_identifier_copy_to_utf8_string(libfwnt_security_identifier_t *security_identifier,
    uint8_t *utf8_string, size_t utf8_string_size,
    uint32_t string_format_flags, libfwnt_error_t **error);

int
libfwnt_security_identifier_copy_to_utf8_string_with_index(libfwnt_security_identifier_t *security_identifier,
    uint8_t *utf8_string, size_t utf8_string_size,
    size_t *utf8_string_index, uint32_t string_format_flags,
    libfwnt_error_t **error);

int
libfwnt_security_identifier_copy_to_utf16_string(libfwnt_security_identifier_t *security_identifier,
    uint16_t *utf16_string, size_t utf16_string_size,
    uint32_t string_format_flags, libfwnt_error_t **error);

int
libfwnt_security_identifier_copy_to_utf16_string_with_index(libfwnt_security_identifier_t *security_identifier,
    uint16_t *utf16_string, size_t utf16_string_size,
    size_t *utf16_string_index, uint32_t string_format_flags,
    libfwnt_error_t **error);

int
libfwnt_security_identifier_copy_to_utf32_string(libfwnt_security_identifier_t *security_identifier,
    uint32_t *utf32_string, size_t utf32_string_size,
    uint32_t string_format_flags, libfwnt_error_t **error);

int
libfwnt_security_identifier_copy_to_utf32_string_with_index(libfwnt_security_identifier_t *security_identifier,
    uint32_t *utf32_string, size_t utf32_string_size,
    size_t *utf32_string_index, uint32_t string_format_flags,
    libfwnt_error_t **error);
  • libfwnt_security_identifier_initialize β€” libfwnt_security_identifier_t **security_identifier + error slot. born πŸ’–
  • libfwnt_security_identifier_free β€” same signature, says bye πŸ¦‹
  • libfwnt_security_identifier_copy_from_byte_stream β€” descriptor, const uint8_t *byte_stream, size_t byte_stream_size, int byte_order, error slot. the raw-byte pipeline 🌈
  • libfwnt_security_identifier_get_string_size β€” gives you the size in a size_t *string_size, and you pass uint32_t string_format_flags to say how you want it formatted πŸ‘‘
  • libfwnt_security_identifier_copy_to_utf8_string β€” writes into uint8_t *utf8_string of size size_t utf8_string_size, with uint32_t string_format_flags. utf8 girlies rise 🧚
  • libfwnt_security_identifier_copy_to_utf8_string_with_index β€” same but with an extra size_t *utf8_string_index so it knows where you're at. no more index anxiety 😌
  • libfwnt_security_identifier_copy_to_utf16_string β€” utf16 version, into uint16_t *utf16_string, size size_t utf16_string_size, plus uint32_t string_format_flags.
  • libfwnt_security_identifier_copy_to_utf16_string_with_index β€” utf16 with the size_t *utf16_string_index glow-up ✨
  • libfwnt_security_identifier_copy_to_utf32_string β€” utf32 version, uint32_t *utf32_string, size size_t utf32_string_size, plus uint32_t string_format_flags.
  • libfwnt_security_identifier_copy_to_utf32_string_with_index β€” utf32 with size_t *utf32_string_index. the whole family ate πŸ”₯

πŸ“‹ Access control list (ACL) functions πŸ“‹

int
libfwnt_access_control_list_free(libfwnt_access_control_list_t **access_control_list,
    libfwnt_error_t **error);

int
libfwnt_access_control_list_get_number_of_entries(libfwnt_access_control_list_t *access_control_list,
    int *number_of_entries, libfwnt_error_t **error);

int
libfwnt_access_control_list_get_entry_by_index(libfwnt_access_control_list_t *access_control_list,
    int entry_index,
    libfwnt_access_control_entry_t **access_control_entry,
    libfwnt_error_t **error);
  • libfwnt_access_control_list_free β€” libfwnt_access_control_list_t **access_control_list + error slot, releases it.
  • libfwnt_access_control_list_get_number_of_entries β€” puts the count into int *number_of_entries. math is math πŸ’…
  • libfwnt_access_control_list_get_entry_by_index β€” you give it the list, an int entry_index, and a libfwnt_access_control_entry_t **access_control_entry to fill, plus the error slot. pick your fighter by index 🎯

🎫 Access control entry (ACE) functions 🎫

int
libfwnt_access_control_entry_free(libfwnt_access_control_entry_t **access_control_entry,
    libfwnt_error_t **error);

int
libfwnt_access_control_entry_get_type(libfwnt_access_control_entry_t *access_control_entry,
    uint8_t *type, libfwnt_error_t **error);

int
libfwnt_access_control_entry_get_flags(libfwnt_access_control_entry_t *access_control_entry,
    uint8_t *flags, libfwnt_error_t **error);

int
libfwnt_access_control_entry_get_access_mask(libfwnt_access_control_entry_t *access_control_entry,
    uint32_t *access_mask, libfwnt_error_t **error);

int
libfwnt_access_control_entry_get_security_identifier(libfwnt_access_control_entry_t *access_control_entry,
    libfwnt_security_identifier_t **security_identifier,
    libfwnt_error_t **error);
  • libfwnt_access_control_entry_free β€” libfwnt_access_control_entry_t **access_control_entry + error slot, cleans up.
  • libfwnt_access_control_entry_get_type β€” drops the type into a uint8_t *type πŸ“
  • libfwnt_access_control_entry_get_flags β€” drops the flags into a uint8_t *flags.
  • libfwnt_access_control_entry_get_access_mask β€” drops the mask into a uint32_t *access_mask. mask on, mask off 🎭
  • libfwnt_access_control_entry_get_security_identifier β€” hands you the libfwnt_security_identifier_t **security_identifier for that entry 🫢

πŸ—œοΈ LZNT1 functions πŸ—œοΈ

int
libfwnt_lznt1_decompress(const uint8_t *compressed_data,
    size_t compressed_data_size, uint8_t *uncompressed_data,
    size_t *uncompressed_data_size, libfwnt_error_t **error);
  • libfwnt_lznt1_decompress β€” in goes const uint8_t *compressed_data with size_t compressed_data_size, out comes uint8_t *uncompressed_data with size_t *uncompressed_data_size, plus the error slot. glow-down complete ✨

πŸŒ€ LZX functions πŸŒ€

int
libfwnt_lzx_decompress(const uint8_t *compressed_data,
    size_t compressed_data_size, uint8_t *uncompressed_data,
    size_t *uncompressed_data_size, libfwnt_error_t **error);
  • libfwnt_lzx_decompress β€” same shape: compressed in, uncompressed out, sizes both ways, error slot. it's the LZX one πŸ’œ

πŸ’« LZXPRESS functions πŸ’«

int
libfwnt_lzxpress_decompress(const uint8_t *compressed_data,
    size_t compressed_data_size, uint8_t *uncompressed_data,
    size_t *uncompressed_data_size, libfwnt_error_t **error);

int
libfwnt_lzxpress_huffman_decompress(const uint8_t *compressed_data,
    size_t compressed_data_size, uint8_t *uncompressed_data,
    size_t *uncompressed_data_size, libfwnt_error_t **error);
  • libfwnt_lzxpress_decompress β€” the LZXPRESS classic. compressed in, uncompressed out, sizes, error slot.
  • libfwnt_lzxpress_huffman_decompress β€” same signature, but the Huffman one. two icons, one family πŸ‘‘

πŸ“– DESCRIPTION πŸ“–

so like, real talk: the libfwnt_get_version() function is the one you call to get the library version. that's it, that's the description. she's simple and she's slaying πŸ’…


πŸ” RETURN VALUES πŸ”

most of the functions return NULL or -1 on error, whichever one fits the return type (they're not all built the same, bestie). for the actual return values you gotta go read "libfwnt.h", no cap πŸ“œ


🌍 ENVIRONMENT 🌍

None

like literally nothing. the environment said no comment 🧚


πŸ“ FILES πŸ“

None

nothing here either. iconic of her honestly ✨


πŸ› BUGS πŸ›

if you find a bug β€” any kind, we don't discriminate β€” please report it on the project issue tracker, which lives at:

https://github.com/libyal/libfwnt/issues

tell them everything, bestie 🫢


✍️ AUTHOR ✍️

these man pages are generated from "libfwnt.h". they were born from the header, which is lowkey kind of poetic 😭


Copyright (C) 2009-2024, Joachim Metz <joachim.metz@gmail.com>.

this is free software; see the source for copying conditions. there is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE 🚨

fr fr read that last bit again. no warranty. none. zero. don't come for her if it breaks πŸ’€

πŸ‘€ SEE ALSO πŸ‘€

  • the libfwnt.h include file

and that's the whole page, babe πŸ’–

cute little sign-off: this page is libfwnt(3), and it's dated December 15, 2019 πŸŽ€ so if you're reading it way later than that, hi, hope you're hydrated 🫢

go forth and parse some Windows NT formats, you got this πŸ‘‘βœ¨πŸ¦‹

πŸ“¦ where this page comes from