The branch, v3-6-test has been updated via 1125b29 s4-smbtorture: fix winreg querymultiplevalues NDR test warning. via e1b12c1 s4-smbtorture: add NDR spoolss_GetPrinterDriver2 in and out check functions. via 44ebeaf s4-smbtorture: finally enable most of our NDR_OUT NDR tests that we couldnt handle previously. via f2d500e s4-smbtorture: add functions to do NDR_OUT ndr_pull validation including NDR_IN context. via 9bea852 s4-smbtorture: fix some indentation in NDR testsuite. via 64cac0c s3-smbtorture: fixup trailing whitespace in ndr testsuite. via fcaa225 s4-smbtorture: add spoolss_GetPrinterDriver2 NDR tests. via 1fa0d53 s4-smbtorture: mention -v switch for hexdump imports into the NDR testsuites. via 8d50721 s4-smbtorture: activate spoolss_GetPrinterData NDR pull test. via 4cd16c5 s4-smbtorture: try FSCTL_FIND_FILES_BY_SID with random blob data in RAW-IOCTL. from 1bb222d s3-nmbd: use NETLOGON_NT_VERSION_1 in LOGON_PRIMARY_RESPONSE.
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=v3-6-test - Log ----------------------------------------------------------------- commit 1125b29139f2994f344b9443561430a2e371fb36 Author: Günther Deschner <g...@samba.org> Date: Fri Sep 17 10:02:13 2010 +0200 s4-smbtorture: fix winreg querymultiplevalues NDR test warning. Guenther (cherry picked from commit 6f5fa763c13f43cc805a9bd939c21970404deaec) commit e1b12c1240555570473d3b7dba423e0e8bda971b Author: Günther Deschner <g...@samba.org> Date: Thu Sep 16 18:41:37 2010 +0200 s4-smbtorture: add NDR spoolss_GetPrinterDriver2 in and out check functions. Guenther (cherry picked from commit 0730d982e68bacbb89584ee8297c6e275955b7c4) commit 44ebeafb0bc4fbe662411e91f5b3e88d6916149e Author: Günther Deschner <g...@samba.org> Date: Thu Sep 16 16:49:54 2010 +0200 s4-smbtorture: finally enable most of our NDR_OUT NDR tests that we couldnt handle previously. Guenther (cherry picked from commit 809094a2c8224f725adcd1faff42c1de3f3eccad) commit f2d500efa4cb97c0cc436eb4566d4e790febd5d0 Author: Günther Deschner <g...@samba.org> Date: Thu Sep 16 16:21:39 2010 +0200 s4-smbtorture: add functions to do NDR_OUT ndr_pull validation including NDR_IN context. Guenther (cherry picked from commit c29b16faa87dab686c8d36abc009c7d92d28a6b2) commit 9bea852b96b430c44b047f7454a013bb848891f4 Author: Günther Deschner <g...@samba.org> Date: Thu Sep 16 16:25:51 2010 +0200 s4-smbtorture: fix some indentation in NDR testsuite. Guenther (cherry picked from commit 5f9caf18dbba8b6ddb2779bcec4836b605b5fa1e) commit 64cac0c36c2ddc2d3b1ecdc2de731b9bab72137a Author: Günther Deschner <g...@samba.org> Date: Thu Sep 16 16:22:32 2010 +0200 s3-smbtorture: fixup trailing whitespace in ndr testsuite. Guenther (cherry picked from commit 725126b1723438ba8b6f9dd41eac8730856da41e) commit fcaa225adae7465c85a705027a1a6e41924de185 Author: Günther Deschner <g...@samba.org> Date: Thu Sep 16 14:42:22 2010 +0200 s4-smbtorture: add spoolss_GetPrinterDriver2 NDR tests. Guenther (cherry picked from commit 567a2e68d67608fca6c040393bd55b8699a5c3e2) commit 1fa0d53bfee6a05acda374736d8bcf3366394df7 Author: Günther Deschner <g...@samba.org> Date: Thu Sep 16 14:41:37 2010 +0200 s4-smbtorture: mention -v switch for hexdump imports into the NDR testsuites. Guenther (cherry picked from commit 1250a6343560705423bcf5c9a25f6448e251e526) commit 8d50721e2aa064244d289c82976d6a3c879579d6 Author: Günther Deschner <g...@samba.org> Date: Thu Sep 16 14:31:53 2010 +0200 s4-smbtorture: activate spoolss_GetPrinterData NDR pull test. Guenther (cherry picked from commit dfe25088ba8b1e6fdaf49ef88d2da07fd8f1d950) commit 4cd16c5f52b317cff572dbcaff7ffa89b93aeb24 Author: Günther Deschner <g...@samba.org> Date: Wed Sep 15 23:02:43 2010 +0200 s4-smbtorture: try FSCTL_FIND_FILES_BY_SID with random blob data in RAW-IOCTL. Guenther (cherry picked from commit fe59119e06d334a06052b4aac71679488f581383) ----------------------------------------------------------------------- Summary of changes: librpc/idl/spoolss.idl | 4 +- source4/torture/ndr/README | 2 +- source4/torture/ndr/ndr.c | 193 +++++++++++++++++++++--------- source4/torture/ndr/ndr.h | 28 ++++- source4/torture/ndr/samr.c | 2 +- source4/torture/ndr/spoolss.c | 265 ++++++++++++++++++++++++++++++++++++++++- source4/torture/ndr/winreg.c | 12 +-- source4/torture/raw/ioctl.c | 21 ++++ 8 files changed, 452 insertions(+), 75 deletions(-) Changeset truncated at 500 lines: diff --git a/librpc/idl/spoolss.idl b/librpc/idl/spoolss.idl index c61cba5..f1b8e96 100644 --- a/librpc/idl/spoolss.idl +++ b/librpc/idl/spoolss.idl @@ -1925,7 +1925,7 @@ cpp_quote("#define spoolss_security_descriptor security_descriptor") const string SPOOL_REG_URL = "url"; const string SPOOL_REG_VERSIONNUMBER = "versionNumber"; - WERROR spoolss_GetPrinterData( + [public] WERROR spoolss_GetPrinterData( [in,ref] policy_handle *handle, [in] [string,charset(UTF16)] uint16 value_name[], [out,ref] winreg_Type *type, @@ -2358,7 +2358,7 @@ cpp_quote("#define spoolss_security_descriptor security_descriptor") /******************/ /* Function: 0x35 */ - WERROR spoolss_GetPrinterDriver2( + [public] WERROR spoolss_GetPrinterDriver2( [in,ref] policy_handle *handle, [in,unique] [string,charset(UTF16)] uint16 *architecture, [in] uint32 level, diff --git a/source4/torture/ndr/README b/source4/torture/ndr/README index d17d0b2..88123ea 100644 --- a/source4/torture/ndr/README +++ b/source4/torture/ndr/README @@ -1,4 +1,4 @@ use - hexdump -e '12/1 "0x%02x, " "\n"' infile|outfile + hexdump -v -e '12/1 "0x%02x, " "\n"' infile|outfile to import ndr dumps diff --git a/source4/torture/ndr/ndr.c b/source4/torture/ndr/ndr.c index 9d0f345..e13cb94 100644 --- a/source4/torture/ndr/ndr.c +++ b/source4/torture/ndr/ndr.c @@ -1,19 +1,19 @@ -/* +/* Unix SMB/CIFS implementation. test suite for winreg ndr operations Copyright (C) Jelmer Vernooij 2007 - + This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. - + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - + You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ @@ -26,14 +26,15 @@ struct ndr_pull_test_data { DATA_BLOB data; + DATA_BLOB data_context; size_t struct_size; ndr_pull_flags_fn_t pull_fn; int ndr_flags; }; static bool wrap_ndr_pull_test(struct torture_context *tctx, - struct torture_tcase *tcase, - struct torture_test *test) + struct torture_tcase *tcase, + struct torture_test *test) { bool (*check_fn) (struct torture_context *ctx, void *data) = test->fn; const struct ndr_pull_test_data *data = (const struct ndr_pull_test_data *)test->data; @@ -45,28 +46,28 @@ static bool wrap_ndr_pull_test(struct torture_context *tctx, torture_assert_ndr_success(tctx, data->pull_fn(ndr, data->ndr_flags, ds), "pulling"); - torture_assert(tctx, ndr->offset == ndr->data_size, - talloc_asprintf(tctx, + torture_assert(tctx, ndr->offset == ndr->data_size, + talloc_asprintf(tctx, "%d unread bytes", ndr->data_size - ndr->offset)); - if (check_fn != NULL) + if (check_fn != NULL) return check_fn(tctx, ds); else return true; } _PUBLIC_ struct torture_test *_torture_suite_add_ndr_pull_test( - struct torture_suite *suite, + struct torture_suite *suite, const char *name, ndr_pull_flags_fn_t pull_fn, - DATA_BLOB db, + DATA_BLOB db, size_t struct_size, int ndr_flags, bool (*check_fn) (struct torture_context *ctx, void *data)) { - struct torture_test *test; + struct torture_test *test; struct torture_tcase *tcase; struct ndr_pull_test_data *data; - + tcase = torture_suite_add_tcase(suite, name); test = talloc(tcase, struct torture_test); @@ -88,6 +89,88 @@ _PUBLIC_ struct torture_test *_torture_suite_add_ndr_pull_test( return test; } +static bool wrap_ndr_inout_pull_test(struct torture_context *tctx, + struct torture_tcase *tcase, + struct torture_test *test) +{ + bool (*check_fn) (struct torture_context *ctx, void *data) = test->fn; + const struct ndr_pull_test_data *data = (const struct ndr_pull_test_data *)test->data; + void *ds = talloc_zero_size(tctx, data->struct_size); + struct ndr_pull *ndr; + + /* handle NDR_IN context */ + + ndr = ndr_pull_init_blob(&(data->data_context), tctx); + torture_assert(tctx, ndr, "ndr init failed"); + + ndr->flags |= LIBNDR_FLAG_REF_ALLOC; + + torture_assert_ndr_success(tctx, + data->pull_fn(ndr, NDR_IN, ds), + "ndr pull of context failed"); + + torture_assert(tctx, ndr->offset == ndr->data_size, + talloc_asprintf(tctx, "%d unread bytes", ndr->data_size - ndr->offset)); + + talloc_free(ndr); + + /* handle NDR_OUT */ + + ndr = ndr_pull_init_blob(&(data->data), tctx); + torture_assert(tctx, ndr, "ndr init failed"); + + ndr->flags |= LIBNDR_FLAG_REF_ALLOC; + + torture_assert_ndr_success(tctx, + data->pull_fn(ndr, NDR_OUT, ds), + "ndr pull failed"); + + torture_assert(tctx, ndr->offset == ndr->data_size, + talloc_asprintf(tctx, "%d unread bytes", ndr->data_size - ndr->offset)); + + talloc_free(ndr); + + if (check_fn) { + return check_fn(tctx, ds); + } else { + return true; + } +} + +_PUBLIC_ struct torture_test *_torture_suite_add_ndr_pull_inout_test( + struct torture_suite *suite, + const char *name, ndr_pull_flags_fn_t pull_fn, + DATA_BLOB db_in, + DATA_BLOB db_out, + size_t struct_size, + bool (*check_fn) (struct torture_context *ctx, void *data)) +{ + struct torture_test *test; + struct torture_tcase *tcase; + struct ndr_pull_test_data *data; + + tcase = torture_suite_add_tcase(suite, name); + + test = talloc(tcase, struct torture_test); + + test->name = talloc_strdup(test, name); + test->description = NULL; + test->run = wrap_ndr_inout_pull_test; + data = talloc(test, struct ndr_pull_test_data); + data->data = db_out; + data->data_context = db_in; + data->ndr_flags = 0; + data->struct_size = struct_size; + data->pull_fn = pull_fn; + test->data = data; + test->fn = check_fn; + test->dangerous = false; + + DLIST_ADD_END(tcase->tests, test, struct torture_test *); + + return test; +} + static bool test_check_string_terminator(struct torture_context *tctx) { struct ndr_pull *ndr; @@ -96,7 +179,7 @@ static bool test_check_string_terminator(struct torture_context *tctx) /* Simple test */ blob = strhex_to_data_blob(tctx, "0000"); - + ndr = ndr_pull_init_blob(&blob, mem_ctx); torture_assert_ndr_success(tctx, ndr_check_string_terminator(ndr, 1, 2), @@ -109,7 +192,7 @@ static bool test_check_string_terminator(struct torture_context *tctx) torture_fail(tctx, "check_string_terminator checked beyond string boundaries"); } - torture_assert(tctx, ndr->offset == 0, + torture_assert(tctx, ndr->offset == 0, "check_string_terminator did not reset offset"); talloc_free(ndr); @@ -143,27 +226,27 @@ static bool test_guid_from_string_valid(struct torture_context *tctx) static bool test_guid_from_string_null(struct torture_context *tctx) { struct GUID guid; - torture_assert_ntstatus_equal(tctx, NT_STATUS_INVALID_PARAMETER, - GUID_from_string(NULL, &guid), - "NULL failed"); + torture_assert_ntstatus_equal(tctx, NT_STATUS_INVALID_PARAMETER, + GUID_from_string(NULL, &guid), + "NULL failed"); return true; } static bool test_guid_from_string_invalid(struct torture_context *tctx) { struct GUID g1; - torture_assert_ntstatus_equal(tctx, NT_STATUS_INVALID_PARAMETER, - GUID_from_string("bla", &g1), - "parameter not invalid"); + torture_assert_ntstatus_equal(tctx, NT_STATUS_INVALID_PARAMETER, + GUID_from_string("bla", &g1), + "parameter not invalid"); return true; -} +} static bool test_guid_from_string(struct torture_context *tctx) { struct GUID g1, exp; torture_assert_ntstatus_ok(tctx, - GUID_from_string("00000001-0002-0003-0405-060708090a0b", &g1), - "invalid return code"); + GUID_from_string("00000001-0002-0003-0405-060708090a0b", &g1), + "invalid return code"); exp.time_low = 1; exp.time_mid = 2; exp.time_hi_and_version = 3; @@ -177,8 +260,8 @@ static bool test_guid_from_string(struct torture_context *tctx) exp.node[5] = 11; torture_assert(tctx, GUID_equal(&g1, &exp), "UUID parsed incorrectly"); torture_assert_ntstatus_ok(tctx, - GUID_from_string("{00000001-0002-0003-0405-060708090a0b}", &g1), - "invalid return code"); + GUID_from_string("{00000001-0002-0003-0405-060708090a0b}", &g1), + "invalid return code"); torture_assert(tctx, GUID_equal(&g1, &exp), "UUID parsed incorrectly"); return true; @@ -198,8 +281,9 @@ static bool test_guid_string_valid(struct torture_context *tctx) g.node[3] = 9; g.node[4] = 10; g.node[5] = 11; - torture_assert_str_equal(tctx, "00000001-0002-0003-0405-060708090a0b", GUID_string(tctx, &g), - "parsing guid failed"); + torture_assert_str_equal(tctx, "00000001-0002-0003-0405-060708090a0b", + GUID_string(tctx, &g), + "parsing guid failed"); return true; } @@ -217,8 +301,9 @@ static bool test_guid_string2_valid(struct torture_context *tctx) g.node[3] = 9; g.node[4] = 10; g.node[5] = 11; - torture_assert_str_equal(tctx, "{00000001-0002-0003-0405-060708090a0b}", GUID_string2(tctx, &g), - "parsing guid failed"); + torture_assert_str_equal(tctx, "{00000001-0002-0003-0405-060708090a0b}", + GUID_string2(tctx, &g), + "parsing guid failed"); return true; } @@ -226,29 +311,29 @@ static bool test_compare_uuid(struct torture_context *tctx) { struct GUID g1, g2; ZERO_STRUCT(g1); ZERO_STRUCT(g2); - torture_assert_int_equal(tctx, 0, GUID_compare(&g1, &g2), - "GUIDs not equal"); + torture_assert_int_equal(tctx, 0, GUID_compare(&g1, &g2), + "GUIDs not equal"); g1.time_low = 1; - torture_assert_int_equal(tctx, 1, GUID_compare(&g1, &g2), - "GUID diff invalid"); + torture_assert_int_equal(tctx, 1, GUID_compare(&g1, &g2), + "GUID diff invalid"); g1.time_low = 10; torture_assert_int_equal(tctx, 1, GUID_compare(&g1, &g2), - "GUID diff invalid"); + "GUID diff invalid"); g1.time_low = 0; g1.clock_seq[1] = 20; torture_assert_int_equal(tctx, 1, GUID_compare(&g1, &g2), - "GUID diff invalid"); + "GUID diff invalid"); g1.time_low = ~0; torture_assert_int_equal(tctx, 1, GUID_compare(&g1, &g2), - "GUID diff invalid"); + "GUID diff invalid"); g1.time_low = 0; g2.time_low = ~0; torture_assert_int_equal(tctx, -1, GUID_compare(&g1, &g2), - "GUID diff invalid"); + "GUID diff invalid"); return true; } @@ -269,29 +354,29 @@ struct torture_suite *torture_local_ndr(TALLOC_CTX *mem_ctx) torture_suite_add_suite(suite, ndr_drsblobs_suite(suite)); torture_suite_add_suite(suite, ndr_nbt_suite(suite)); - torture_suite_add_simple_test(suite, "string terminator", - test_check_string_terminator); + torture_suite_add_simple_test(suite, "string terminator", + test_check_string_terminator); - torture_suite_add_simple_test(suite, "guid_from_string_null", - test_guid_from_string_null); + torture_suite_add_simple_test(suite, "guid_from_string_null", + test_guid_from_string_null); - torture_suite_add_simple_test(suite, "guid_from_string", - test_guid_from_string); + torture_suite_add_simple_test(suite, "guid_from_string", + test_guid_from_string); - torture_suite_add_simple_test(suite, "guid_from_string_invalid", - test_guid_from_string_invalid); + torture_suite_add_simple_test(suite, "guid_from_string_invalid", + test_guid_from_string_invalid); - torture_suite_add_simple_test(suite, "guid_string_valid", - test_guid_string_valid); + torture_suite_add_simple_test(suite, "guid_string_valid", + test_guid_string_valid); - torture_suite_add_simple_test(suite, "guid_string2_valid", - test_guid_string2_valid); + torture_suite_add_simple_test(suite, "guid_string2_valid", + test_guid_string2_valid); - torture_suite_add_simple_test(suite, "guid_from_string_valid", - test_guid_from_string_valid); + torture_suite_add_simple_test(suite, "guid_from_string_valid", + test_guid_from_string_valid); - torture_suite_add_simple_test(suite, "compare_uuid", - test_compare_uuid); + torture_suite_add_simple_test(suite, "compare_uuid", + test_compare_uuid); return suite; } diff --git a/source4/torture/ndr/ndr.h b/source4/torture/ndr/ndr.h index 517bcb6..3de6b8b 100644 --- a/source4/torture/ndr/ndr.h +++ b/source4/torture/ndr/ndr.h @@ -1,18 +1,18 @@ -/* +/* Unix SMB/CIFS implementation. SMB torture tester Copyright (C) Jelmer Vernooij 2007 - + This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. - + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - + You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ @@ -25,13 +25,21 @@ #include "libcli/security/security.h" _PUBLIC_ struct torture_test *_torture_suite_add_ndr_pull_test( - struct torture_suite *suite, + struct torture_suite *suite, const char *name, ndr_pull_flags_fn_t fn, - DATA_BLOB db, + DATA_BLOB db, size_t struct_size, int ndr_flags, bool (*check_fn) (struct torture_context *, void *data)); +_PUBLIC_ struct torture_test *_torture_suite_add_ndr_pull_inout_test( + struct torture_suite *suite, + const char *name, ndr_pull_flags_fn_t pull_fn, + DATA_BLOB db_in, + DATA_BLOB db_out, + size_t struct_size, + bool (*check_fn) (struct torture_context *ctx, void *data)); + #define torture_suite_add_ndr_pull_test(suite,name,data,check_fn) \ _torture_suite_add_ndr_pull_test(suite, #name, \ (ndr_pull_flags_fn_t)ndr_pull_ ## name, data_blob_talloc(suite, data, sizeof(data)), \ @@ -42,6 +50,14 @@ _PUBLIC_ struct torture_test *_torture_suite_add_ndr_pull_test( (ndr_pull_flags_fn_t)ndr_pull_ ## name, data_blob_talloc(suite, data, sizeof(data)), \ sizeof(struct name), flags, (bool (*) (struct torture_context *, void *)) check_fn); +#define torture_suite_add_ndr_pull_io_test(suite,name,data_in,data_out,check_fn_out) \ + _torture_suite_add_ndr_pull_inout_test(suite, #name "_INOUT", \ + (ndr_pull_flags_fn_t)ndr_pull_ ## name, \ + data_blob_talloc(suite, data_in, sizeof(data_in)), \ + data_blob_talloc(suite, data_out, sizeof(data_out)), \ + sizeof(struct name), \ + (bool (*) (struct torture_context *, void *)) check_fn_out); + #define torture_assert_sid_equal(torture_ctx,got,expected,cmt)\ do { struct dom_sid *__got = (got), *__expected = (expected); \ if (!dom_sid_equal(__got, __expected)) { \ diff --git a/source4/torture/ndr/samr.c b/source4/torture/ndr/samr.c index 5218b9b..a569d65 100644 --- a/source4/torture/ndr/samr.c +++ b/source4/torture/ndr/samr.c @@ -190,7 +190,7 @@ struct torture_suite *ndr_samr_suite(TALLOC_CTX *ctx) torture_suite_add_ndr_pull_fn_test(suite, samr_OpenUser, samr_openuser_out_data, NDR_OUT, NULL); torture_suite_add_ndr_pull_fn_test(suite, samr_QueryUserInfo, samr_queryuserinfo_in_data, NDR_IN, NULL); - /* torture_suite_add_ndr_pull_fn_test(suite, samr_QueryUserInfo, samr_queryuserinfo_out_data, NDR_OUT, NULL); */ + torture_suite_add_ndr_pull_io_test(suite, samr_QueryUserInfo, samr_queryuserinfo_in_data, samr_queryuserinfo_out_data, NULL); torture_suite_add_ndr_pull_fn_test(suite, samr_SetUserInfo, samr_setuserinfo_in_data, NDR_IN, NULL); torture_suite_add_ndr_pull_fn_test(suite, samr_SetUserInfo, samr_setuserinfo_out_data, NDR_OUT, NULL); diff --git a/source4/torture/ndr/spoolss.c b/source4/torture/ndr/spoolss.c index bdab29f..d028c90 100644 --- a/source4/torture/ndr/spoolss.c +++ b/source4/torture/ndr/spoolss.c @@ -445,6 +445,262 @@ static const uint8_t addprinterdriverex_in_data[] = { 0x74, 0x00, 0x00, 0x00, 0x18, 0x00, 0x01, 0x00 }; +static const uint8_t getprinterdriver2_in_data[] = { + 0x00, 0x00, 0x00, 0x00, 0x80, 0x74, 0xc9, 0xc0, 0x9f, 0x5f, 0x6f, 0x46, + 0xbb, 0x14, 0x48, 0xe6, 0xb6, 0xa8, 0x47, 0x40, 0x00, 0x00, 0x02, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x57, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x6f, 0x00, 0x77, 0x00, + 0x73, 0x00, 0x20, 0x00, 0x78, 0x00, 0x36, 0x00, 0x34, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x04, 0x00, 0x02, 0x00, 0x88, 0x04, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -- Samba Shared Repository