1/* 2 Unix SMB/CIFS implementation. 3 SMB torture tester - deny mode scanning functions 4 Copyright (C) Andrew Tridgell 2001 5 6 This program is free software; you can redistribute it and/or modify 7 it under the terms of the GNU General Public License as published by 8 the Free Software Foundation; either version 3 of the License, or 9 (at your option) any later version. 10 11 This program is distributed in the hope that it will be useful, 12 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 GNU General Public License for more details. 15 16 You should have received a copy of the GNU General Public License 17 along with this program. If not, see <http://www.gnu.org/licenses/>. 18*/ 19 20#include "includes.h" 21#include "torture/torture.h" 22#include "system/filesys.h" 23#include "libcli/raw/libcliraw.h" 24#include "libcli/libcli.h" 25#include "libcli/security/security.h" 26#include "torture/util.h" 27#include "torture/smbtorture.h" 28#include "libcli/util/clilsa.h" 29#include "cxd_known.h" 30 31extern int torture_failures; 32 33#define CHECK_MAX_FAILURES(label) do { if (++failures >= torture_failures) goto label; } while (0) 34 35enum deny_result {A_0=0, A_X=1, A_R=2, A_W=3, A_RW=5}; 36 37static const char *denystr(int denymode) 38{ 39 const struct { 40 int v; 41 const char *name; 42 } deny_modes[] = { 43 {DENY_DOS, "DENY_DOS"}, 44 {DENY_ALL, "DENY_ALL"}, 45 {DENY_WRITE, "DENY_WRITE"}, 46 {DENY_READ, "DENY_READ"}, 47 {DENY_NONE, "DENY_NONE"}, 48 {DENY_FCB, "DENY_FCB"}, 49 {-1, NULL}}; 50 int i; 51 for (i=0;deny_modes[i].name;i++) { 52 if (deny_modes[i].v == denymode) return deny_modes[i].name; 53 } 54 return "DENY_XXX"; 55} 56 57static const char *openstr(int mode) 58{ 59 const struct { 60 int v; 61 const char *name; 62 } open_modes[] = { 63 {O_RDWR, "O_RDWR"}, 64 {O_RDONLY, "O_RDONLY"}, 65 {O_WRONLY, "O_WRONLY"}, 66 {-1, NULL}}; 67 int i; 68 for (i=0;open_modes[i].name;i++) { 69 if (open_modes[i].v == mode) return open_modes[i].name; 70 } 71 return "O_XXX"; 72} 73 74static const char *resultstr(enum deny_result res) 75{ 76 const struct { 77 enum deny_result res; 78 const char *name; 79 } results[] = { 80 {A_X, "X"}, 81 {A_0, "-"}, 82 {A_R, "R"}, 83 {A_W, "W"}, 84 {A_RW,"RW"}}; 85 int i; 86 for (i=0;ARRAY_SIZE(results);i++) { 87 if (results[i].res == res) return results[i].name; 88 } 89 return "*"; 90} 91 92static const struct { 93 int isexe; 94 int mode1, deny1; 95 int mode2, deny2; 96 enum deny_result result; 97} denytable2[] = { 98{1, O_RDWR, DENY_DOS, O_RDWR, DENY_DOS, A_RW}, 99{1, O_RDWR, DENY_DOS, O_RDONLY, DENY_DOS, A_R}, 100{1, O_RDWR, DENY_DOS, O_WRONLY, DENY_DOS, A_W}, 101{1, O_RDWR, DENY_DOS, O_RDWR, DENY_ALL, A_0}, 102{1, O_RDWR, DENY_DOS, O_RDONLY, DENY_ALL, A_0}, 103{1, O_RDWR, DENY_DOS, O_WRONLY, DENY_ALL, A_0}, 104{1, O_RDWR, DENY_DOS, O_RDWR, DENY_WRITE, A_0}, 105{1, O_RDWR, DENY_DOS, O_RDONLY, DENY_WRITE, A_0}, 106{1, O_RDWR, DENY_DOS, O_WRONLY, DENY_WRITE, A_0}, 107{1, O_RDWR, DENY_DOS, O_RDWR, DENY_READ, A_0}, 108{1, O_RDWR, DENY_DOS, O_RDONLY, DENY_READ, A_0}, 109{1, O_RDWR, DENY_DOS, O_WRONLY, DENY_READ, A_0}, 110{1, O_RDWR, DENY_DOS, O_RDWR, DENY_NONE, A_RW}, 111{1, O_RDWR, DENY_DOS, O_RDONLY, DENY_NONE, A_R}, 112{1, O_RDWR, DENY_DOS, O_WRONLY, DENY_NONE, A_W}, 113{1, O_RDWR, DENY_DOS, O_RDWR, DENY_FCB, A_0}, 114{1, O_RDWR, DENY_DOS, O_RDONLY, DENY_FCB, A_0}, 115{1, O_RDWR, DENY_DOS, O_WRONLY, DENY_FCB, A_0}, 116{1, O_RDONLY, DENY_DOS, O_RDWR, DENY_DOS, A_RW}, 117{1, O_RDONLY, DENY_DOS, O_RDONLY, DENY_DOS, A_R}, 118{1, O_RDONLY, DENY_DOS, O_WRONLY, DENY_DOS, A_W}, 119{1, O_RDONLY, DENY_DOS, O_RDWR, DENY_ALL, A_0}, 120{1, O_RDONLY, DENY_DOS, O_RDONLY, DENY_ALL, A_0}, 121{1, O_RDONLY, DENY_DOS, O_WRONLY, DENY_ALL, A_0}, 122{1, O_RDONLY, DENY_DOS, O_RDWR, DENY_WRITE, A_RW}, 123{1, O_RDONLY, DENY_DOS, O_RDONLY, DENY_WRITE, A_R}, 124{1, O_RDONLY, DENY_DOS, O_WRONLY, DENY_WRITE, A_W}, 125{1, O_RDONLY, DENY_DOS, O_RDWR, DENY_READ, A_0}, 126{1, O_RDONLY, DENY_DOS, O_RDONLY, DENY_READ, A_0}, 127{1, O_RDONLY, DENY_DOS, O_WRONLY, DENY_READ, A_0}, 128{1, O_RDONLY, DENY_DOS, O_RDWR, DENY_NONE, A_RW}, 129{1, O_RDONLY, DENY_DOS, O_RDONLY, DENY_NONE, A_R}, 130{1, O_RDONLY, DENY_DOS, O_WRONLY, DENY_NONE, A_W}, 131{1, O_RDONLY, DENY_DOS, O_RDWR, DENY_FCB, A_0}, 132{1, O_RDONLY, DENY_DOS, O_RDONLY, DENY_FCB, A_0}, 133{1, O_RDONLY, DENY_DOS, O_WRONLY, DENY_FCB, A_0}, 134{1, O_WRONLY, DENY_DOS, O_RDWR, DENY_DOS, A_RW}, 135{1, O_WRONLY, DENY_DOS, O_RDONLY, DENY_DOS, A_R}, 136{1, O_WRONLY, DENY_DOS, O_WRONLY, DENY_DOS, A_W}, 137{1, O_WRONLY, DENY_DOS, O_RDWR, DENY_ALL, A_0}, 138{1, O_WRONLY, DENY_DOS, O_RDONLY, DENY_ALL, A_0}, 139{1, O_WRONLY, DENY_DOS, O_WRONLY, DENY_ALL, A_0}, 140{1, O_WRONLY, DENY_DOS, O_RDWR, DENY_WRITE, A_0}, 141{1, O_WRONLY, DENY_DOS, O_RDONLY, DENY_WRITE, A_0}, 142{1, O_WRONLY, DENY_DOS, O_WRONLY, DENY_WRITE, A_0}, 143{1, O_WRONLY, DENY_DOS, O_RDWR, DENY_READ, A_RW}, 144{1, O_WRONLY, DENY_DOS, O_RDONLY, DENY_READ, A_R}, 145{1, O_WRONLY, DENY_DOS, O_WRONLY, DENY_READ, A_W}, 146{1, O_WRONLY, DENY_DOS, O_RDWR, DENY_NONE, A_RW}, 147{1, O_WRONLY, DENY_DOS, O_RDONLY, DENY_NONE, A_R}, 148{1, O_WRONLY, DENY_DOS, O_WRONLY, DENY_NONE, A_W}, 149{1, O_WRONLY, DENY_DOS, O_RDWR, DENY_FCB, A_0}, 150{1, O_WRONLY, DENY_DOS, O_RDONLY, DENY_FCB, A_0}, 151{1, O_WRONLY, DENY_DOS, O_WRONLY, DENY_FCB, A_0}, 152{1, O_RDWR, DENY_ALL, O_RDWR, DENY_DOS, A_0}, 153{1, O_RDWR, DENY_ALL, O_RDONLY, DENY_DOS, A_0}, 154{1, O_RDWR, DENY_ALL, O_WRONLY, DENY_DOS, A_0}, 155{1, O_RDWR, DENY_ALL, O_RDWR, DENY_ALL, A_0}, 156{1, O_RDWR, DENY_ALL, O_RDONLY, DENY_ALL, A_0}, 157{1, O_RDWR, DENY_ALL, O_WRONLY, DENY_ALL, A_0}, 158{1, O_RDWR, DENY_ALL, O_RDWR, DENY_WRITE, A_0}, 159{1, O_RDWR, DENY_ALL, O_RDONLY, DENY_WRITE, A_0}, 160{1, O_RDWR, DENY_ALL, O_WRONLY, DENY_WRITE, A_0}, 161{1, O_RDWR, DENY_ALL, O_RDWR, DENY_READ, A_0}, 162{1, O_RDWR, DENY_ALL, O_RDONLY, DENY_READ, A_0}, 163{1, O_RDWR, DENY_ALL, O_WRONLY, DENY_READ, A_0}, 164{1, O_RDWR, DENY_ALL, O_RDWR, DENY_NONE, A_0}, 165{1, O_RDWR, DENY_ALL, O_RDONLY, DENY_NONE, A_0}, 166{1, O_RDWR, DENY_ALL, O_WRONLY, DENY_NONE, A_0}, 167{1, O_RDWR, DENY_ALL, O_RDWR, DENY_FCB, A_0}, 168{1, O_RDWR, DENY_ALL, O_RDONLY, DENY_FCB, A_0}, 169{1, O_RDWR, DENY_ALL, O_WRONLY, DENY_FCB, A_0}, 170{1, O_RDONLY, DENY_ALL, O_RDWR, DENY_DOS, A_0}, 171{1, O_RDONLY, DENY_ALL, O_RDONLY, DENY_DOS, A_0}, 172{1, O_RDONLY, DENY_ALL, O_WRONLY, DENY_DOS, A_0}, 173{1, O_RDONLY, DENY_ALL, O_RDWR, DENY_ALL, A_0}, 174{1, O_RDONLY, DENY_ALL, O_RDONLY, DENY_ALL, A_0}, 175{1, O_RDONLY, DENY_ALL, O_WRONLY, DENY_ALL, A_0}, 176{1, O_RDONLY, DENY_ALL, O_RDWR, DENY_WRITE, A_0}, 177{1, O_RDONLY, DENY_ALL, O_RDONLY, DENY_WRITE, A_0}, 178{1, O_RDONLY, DENY_ALL, O_WRONLY, DENY_WRITE, A_0}, 179{1, O_RDONLY, DENY_ALL, O_RDWR, DENY_READ, A_0}, 180{1, O_RDONLY, DENY_ALL, O_RDONLY, DENY_READ, A_0}, 181{1, O_RDONLY, DENY_ALL, O_WRONLY, DENY_READ, A_0}, 182{1, O_RDONLY, DENY_ALL, O_RDWR, DENY_NONE, A_0}, 183{1, O_RDONLY, DENY_ALL, O_RDONLY, DENY_NONE, A_0}, 184{1, O_RDONLY, DENY_ALL, O_WRONLY, DENY_NONE, A_0}, 185{1, O_RDONLY, DENY_ALL, O_RDWR, DENY_FCB, A_0}, 186{1, O_RDONLY, DENY_ALL, O_RDONLY, DENY_FCB, A_0}, 187{1, O_RDONLY, DENY_ALL, O_WRONLY, DENY_FCB, A_0}, 188{1, O_WRONLY, DENY_ALL, O_RDWR, DENY_DOS, A_0}, 189{1, O_WRONLY, DENY_ALL, O_RDONLY, DENY_DOS, A_0}, 190{1, O_WRONLY, DENY_ALL, O_WRONLY, DENY_DOS, A_0}, 191{1, O_WRONLY, DENY_ALL, O_RDWR, DENY_ALL, A_0}, 192{1, O_WRONLY, DENY_ALL, O_RDONLY, DENY_ALL, A_0}, 193{1, O_WRONLY, DENY_ALL, O_WRONLY, DENY_ALL, A_0}, 194{1, O_WRONLY, DENY_ALL, O_RDWR, DENY_WRITE, A_0}, 195{1, O_WRONLY, DENY_ALL, O_RDONLY, DENY_WRITE, A_0}, 196{1, O_WRONLY, DENY_ALL, O_WRONLY, DENY_WRITE, A_0}, 197{1, O_WRONLY, DENY_ALL, O_RDWR, DENY_READ, A_0}, 198{1, O_WRONLY, DENY_ALL, O_RDONLY, DENY_READ, A_0}, 199{1, O_WRONLY, DENY_ALL, O_WRONLY, DENY_READ, A_0}, 200{1, O_WRONLY, DENY_ALL, O_RDWR, DENY_NONE, A_0}, 201{1, O_WRONLY, DENY_ALL, O_RDONLY, DENY_NONE, A_0}, 202{1, O_WRONLY, DENY_ALL, O_WRONLY, DENY_NONE, A_0}, 203{1, O_WRONLY, DENY_ALL, O_RDWR, DENY_FCB, A_0}, 204{1, O_WRONLY, DENY_ALL, O_RDONLY, DENY_FCB, A_0}, 205{1, O_WRONLY, DENY_ALL, O_WRONLY, DENY_FCB, A_0}, 206{1, O_RDWR, DENY_WRITE, O_RDWR, DENY_DOS, A_0}, 207{1, O_RDWR, DENY_WRITE, O_RDONLY, DENY_DOS, A_R}, 208{1, O_RDWR, DENY_WRITE, O_WRONLY, DENY_DOS, A_0}, 209{1, O_RDWR, DENY_WRITE, O_RDWR, DENY_ALL, A_0}, 210{1, O_RDWR, DENY_WRITE, O_RDONLY, DENY_ALL, A_0}, 211{1, O_RDWR, DENY_WRITE, O_WRONLY, DENY_ALL, A_0}, 212{1, O_RDWR, DENY_WRITE, O_RDWR, DENY_WRITE, A_0}, 213{1, O_RDWR, DENY_WRITE, O_RDONLY, DENY_WRITE, A_0}, 214{1, O_RDWR, DENY_WRITE, O_WRONLY, DENY_WRITE, A_0}, 215{1, O_RDWR, DENY_WRITE, O_RDWR, DENY_READ, A_0}, 216{1, O_RDWR, DENY_WRITE, O_RDONLY, DENY_READ, A_0}, 217{1, O_RDWR, DENY_WRITE, O_WRONLY, DENY_READ, A_0}, 218{1, O_RDWR, DENY_WRITE, O_RDWR, DENY_NONE, A_0}, 219{1, O_RDWR, DENY_WRITE, O_RDONLY, DENY_NONE, A_R}, 220{1, O_RDWR, DENY_WRITE, O_WRONLY, DENY_NONE, A_0}, 221{1, O_RDWR, DENY_WRITE, O_RDWR, DENY_FCB, A_0}, 222{1, O_RDWR, DENY_WRITE, O_RDONLY, DENY_FCB, A_0}, 223{1, O_RDWR, DENY_WRITE, O_WRONLY, DENY_FCB, A_0}, 224{1, O_RDONLY, DENY_WRITE, O_RDWR, DENY_DOS, A_0}, 225{1, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_DOS, A_R}, 226{1, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_DOS, A_0}, 227{1, O_RDONLY, DENY_WRITE, O_RDWR, DENY_ALL, A_0}, 228{1, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_ALL, A_0}, 229{1, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_ALL, A_0}, 230{1, O_RDONLY, DENY_WRITE, O_RDWR, DENY_WRITE, A_0}, 231{1, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_WRITE, A_R}, 232{1, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_WRITE, A_0}, 233{1, O_RDONLY, DENY_WRITE, O_RDWR, DENY_READ, A_0}, 234{1, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_READ, A_0}, 235{1, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_READ, A_0}, 236{1, O_RDONLY, DENY_WRITE, O_RDWR, DENY_NONE, A_0}, 237{1, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_NONE, A_R}, 238{1, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_NONE, A_0}, 239{1, O_RDONLY, DENY_WRITE, O_RDWR, DENY_FCB, A_0}, 240{1, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_FCB, A_0}, 241{1, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_FCB, A_0}, 242{1, O_WRONLY, DENY_WRITE, O_RDWR, DENY_DOS, A_0}, 243{1, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_DOS, A_R}, 244{1, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_DOS, A_0}, 245{1, O_WRONLY, DENY_WRITE, O_RDWR, DENY_ALL, A_0}, 246{1, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_ALL, A_0}, 247{1, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_ALL, A_0}, 248{1, O_WRONLY, DENY_WRITE, O_RDWR, DENY_WRITE, A_0}, 249{1, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_WRITE, A_0}, 250{1, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_WRITE, A_0}, 251{1, O_WRONLY, DENY_WRITE, O_RDWR, DENY_READ, A_0}, 252{1, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_READ, A_R}, 253{1, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_READ, A_0}, 254{1, O_WRONLY, DENY_WRITE, O_RDWR, DENY_NONE, A_0}, 255{1, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_NONE, A_R}, 256{1, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_NONE, A_0}, 257{1, O_WRONLY, DENY_WRITE, O_RDWR, DENY_FCB, A_0}, 258{1, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_FCB, A_0}, 259{1, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_FCB, A_0}, 260{1, O_RDWR, DENY_READ, O_RDWR, DENY_DOS, A_0}, 261{1, O_RDWR, DENY_READ, O_RDONLY, DENY_DOS, A_0}, 262{1, O_RDWR, DENY_READ, O_WRONLY, DENY_DOS, A_W}, 263{1, O_RDWR, DENY_READ, O_RDWR, DENY_ALL, A_0}, 264{1, O_RDWR, DENY_READ, O_RDONLY, DENY_ALL, A_0}, 265{1, O_RDWR, DENY_READ, O_WRONLY, DENY_ALL, A_0}, 266{1, O_RDWR, DENY_READ, O_RDWR, DENY_WRITE, A_0}, 267{1, O_RDWR, DENY_READ, O_RDONLY, DENY_WRITE, A_0}, 268{1, O_RDWR, DENY_READ, O_WRONLY, DENY_WRITE, A_0}, 269{1, O_RDWR, DENY_READ, O_RDWR, DENY_READ, A_0}, 270{1, O_RDWR, DENY_READ, O_RDONLY, DENY_READ, A_0}, 271{1, O_RDWR, DENY_READ, O_WRONLY, DENY_READ, A_0}, 272{1, O_RDWR, DENY_READ, O_RDWR, DENY_NONE, A_0}, 273{1, O_RDWR, DENY_READ, O_RDONLY, DENY_NONE, A_0}, 274{1, O_RDWR, DENY_READ, O_WRONLY, DENY_NONE, A_W}, 275{1, O_RDWR, DENY_READ, O_RDWR, DENY_FCB, A_0}, 276{1, O_RDWR, DENY_READ, O_RDONLY, DENY_FCB, A_0}, 277{1, O_RDWR, DENY_READ, O_WRONLY, DENY_FCB, A_0}, 278{1, O_RDONLY, DENY_READ, O_RDWR, DENY_DOS, A_0}, 279{1, O_RDONLY, DENY_READ, O_RDONLY, DENY_DOS, A_0}, 280{1, O_RDONLY, DENY_READ, O_WRONLY, DENY_DOS, A_W}, 281{1, O_RDONLY, DENY_READ, O_RDWR, DENY_ALL, A_0}, 282{1, O_RDONLY, DENY_READ, O_RDONLY, DENY_ALL, A_0}, 283{1, O_RDONLY, DENY_READ, O_WRONLY, DENY_ALL, A_0}, 284{1, O_RDONLY, DENY_READ, O_RDWR, DENY_WRITE, A_0}, 285{1, O_RDONLY, DENY_READ, O_RDONLY, DENY_WRITE, A_0}, 286{1, O_RDONLY, DENY_READ, O_WRONLY, DENY_WRITE, A_W}, 287{1, O_RDONLY, DENY_READ, O_RDWR, DENY_READ, A_0}, 288{1, O_RDONLY, DENY_READ, O_RDONLY, DENY_READ, A_0}, 289{1, O_RDONLY, DENY_READ, O_WRONLY, DENY_READ, A_0}, 290{1, O_RDONLY, DENY_READ, O_RDWR, DENY_NONE, A_0}, 291{1, O_RDONLY, DENY_READ, O_RDONLY, DENY_NONE, A_0}, 292{1, O_RDONLY, DENY_READ, O_WRONLY, DENY_NONE, A_W}, 293{1, O_RDONLY, DENY_READ, O_RDWR, DENY_FCB, A_0}, 294{1, O_RDONLY, DENY_READ, O_RDONLY, DENY_FCB, A_0}, 295{1, O_RDONLY, DENY_READ, O_WRONLY, DENY_FCB, A_0}, 296{1, O_WRONLY, DENY_READ, O_RDWR, DENY_DOS, A_0}, 297{1, O_WRONLY, DENY_READ, O_RDONLY, DENY_DOS, A_0}, 298{1, O_WRONLY, DENY_READ, O_WRONLY, DENY_DOS, A_W}, 299{1, O_WRONLY, DENY_READ, O_RDWR, DENY_ALL, A_0}, 300{1, O_WRONLY, DENY_READ, O_RDONLY, DENY_ALL, A_0}, 301{1, O_WRONLY, DENY_READ, O_WRONLY, DENY_ALL, A_0}, 302{1, O_WRONLY, DENY_READ, O_RDWR, DENY_WRITE, A_0}, 303{1, O_WRONLY, DENY_READ, O_RDONLY, DENY_WRITE, A_0}, 304{1, O_WRONLY, DENY_READ, O_WRONLY, DENY_WRITE, A_0}, 305{1, O_WRONLY, DENY_READ, O_RDWR, DENY_READ, A_0}, 306{1, O_WRONLY, DENY_READ, O_RDONLY, DENY_READ, A_0}, 307{1, O_WRONLY, DENY_READ, O_WRONLY, DENY_READ, A_W}, 308{1, O_WRONLY, DENY_READ, O_RDWR, DENY_NONE, A_0}, 309{1, O_WRONLY, DENY_READ, O_RDONLY, DENY_NONE, A_0}, 310{1, O_WRONLY, DENY_READ, O_WRONLY, DENY_NONE, A_W}, 311{1, O_WRONLY, DENY_READ, O_RDWR, DENY_FCB, A_0}, 312{1, O_WRONLY, DENY_READ, O_RDONLY, DENY_FCB, A_0}, 313{1, O_WRONLY, DENY_READ, O_WRONLY, DENY_FCB, A_0}, 314{1, O_RDWR, DENY_NONE, O_RDWR, DENY_DOS, A_RW}, 315{1, O_RDWR, DENY_NONE, O_RDONLY, DENY_DOS, A_R}, 316{1, O_RDWR, DENY_NONE, O_WRONLY, DENY_DOS, A_W}, 317{1, O_RDWR, DENY_NONE, O_RDWR, DENY_ALL, A_0}, 318{1, O_RDWR, DENY_NONE, O_RDONLY, DENY_ALL, A_0}, 319{1, O_RDWR, DENY_NONE, O_WRONLY, DENY_ALL, A_0}, 320{1, O_RDWR, DENY_NONE, O_RDWR, DENY_WRITE, A_0}, 321{1, O_RDWR, DENY_NONE, O_RDONLY, DENY_WRITE, A_0}, 322{1, O_RDWR, DENY_NONE, O_WRONLY, DENY_WRITE, A_0}, 323{1, O_RDWR, DENY_NONE, O_RDWR, DENY_READ, A_0}, 324{1, O_RDWR, DENY_NONE, O_RDONLY, DENY_READ, A_0}, 325{1, O_RDWR, DENY_NONE, O_WRONLY, DENY_READ, A_0}, 326{1, O_RDWR, DENY_NONE, O_RDWR, DENY_NONE, A_RW}, 327{1, O_RDWR, DENY_NONE, O_RDONLY, DENY_NONE, A_R}, 328{1, O_RDWR, DENY_NONE, O_WRONLY, DENY_NONE, A_W}, 329{1, O_RDWR, DENY_NONE, O_RDWR, DENY_FCB, A_0}, 330{1, O_RDWR, DENY_NONE, O_RDONLY, DENY_FCB, A_0}, 331{1, O_RDWR, DENY_NONE, O_WRONLY, DENY_FCB, A_0}, 332{1, O_RDONLY, DENY_NONE, O_RDWR, DENY_DOS, A_RW}, 333{1, O_RDONLY, DENY_NONE, O_RDONLY, DENY_DOS, A_R}, 334{1, O_RDONLY, DENY_NONE, O_WRONLY, DENY_DOS, A_W}, 335{1, O_RDONLY, DENY_NONE, O_RDWR, DENY_ALL, A_0}, 336{1, O_RDONLY, DENY_NONE, O_RDONLY, DENY_ALL, A_0}, 337{1, O_RDONLY, DENY_NONE, O_WRONLY, DENY_ALL, A_0}, 338{1, O_RDONLY, DENY_NONE, O_RDWR, DENY_WRITE, A_RW}, 339{1, O_RDONLY, DENY_NONE, O_RDONLY, DENY_WRITE, A_R}, 340{1, O_RDONLY, DENY_NONE, O_WRONLY, DENY_WRITE, A_W}, 341{1, O_RDONLY, DENY_NONE, O_RDWR, DENY_READ, A_0}, 342{1, O_RDONLY, DENY_NONE, O_RDONLY, DENY_READ, A_0}, 343{1, O_RDONLY, DENY_NONE, O_WRONLY, DENY_READ, A_0}, 344{1, O_RDONLY, DENY_NONE, O_RDWR, DENY_NONE, A_RW}, 345{1, O_RDONLY, DENY_NONE, O_RDONLY, DENY_NONE, A_R}, 346{1, O_RDONLY, DENY_NONE, O_WRONLY, DENY_NONE, A_W}, 347{1, O_RDONLY, DENY_NONE, O_RDWR, DENY_FCB, A_0}, 348{1, O_RDONLY, DENY_NONE, O_RDONLY, DENY_FCB, A_0}, 349{1, O_RDONLY, DENY_NONE, O_WRONLY, DENY_FCB, A_0}, 350{1, O_WRONLY, DENY_NONE, O_RDWR, DENY_DOS, A_RW}, 351{1, O_WRONLY, DENY_NONE, O_RDONLY, DENY_DOS, A_R}, 352{1, O_WRONLY, DENY_NONE, O_WRONLY, DENY_DOS, A_W}, 353{1, O_WRONLY, DENY_NONE, O_RDWR, DENY_ALL, A_0}, 354{1, O_WRONLY, DENY_NONE, O_RDONLY, DENY_ALL, A_0}, 355{1, O_WRONLY, DENY_NONE, O_WRONLY, DENY_ALL, A_0}, 356{1, O_WRONLY, DENY_NONE, O_RDWR, DENY_WRITE, A_0}, 357{1, O_WRONLY, DENY_NONE, O_RDONLY, DENY_WRITE, A_0}, 358{1, O_WRONLY, DENY_NONE, O_WRONLY, DENY_WRITE, A_0}, 359{1, O_WRONLY, DENY_NONE, O_RDWR, DENY_READ, A_RW}, 360{1, O_WRONLY, DENY_NONE, O_RDONLY, DENY_READ, A_R}, 361{1, O_WRONLY, DENY_NONE, O_WRONLY, DENY_READ, A_W}, 362{1, O_WRONLY, DENY_NONE, O_RDWR, DENY_NONE, A_RW}, 363{1, O_WRONLY, DENY_NONE, O_RDONLY, DENY_NONE, A_R}, 364{1, O_WRONLY, DENY_NONE, O_WRONLY, DENY_NONE, A_W}, 365{1, O_WRONLY, DENY_NONE, O_RDWR, DENY_FCB, A_0}, 366{1, O_WRONLY, DENY_NONE, O_RDONLY, DENY_FCB, A_0}, 367{1, O_WRONLY, DENY_NONE, O_WRONLY, DENY_FCB, A_0}, 368{1, O_RDWR, DENY_FCB, O_RDWR, DENY_DOS, A_0}, 369{1, O_RDWR, DENY_FCB, O_RDONLY, DENY_DOS, A_0}, 370{1, O_RDWR, DENY_FCB, O_WRONLY, DENY_DOS, A_0}, 371{1, O_RDWR, DENY_FCB, O_RDWR, DENY_ALL, A_0}, 372{1, O_RDWR, DENY_FCB, O_RDONLY, DENY_ALL, A_0}, 373{1, O_RDWR, DENY_FCB, O_WRONLY, DENY_ALL, A_0}, 374{1, O_RDWR, DENY_FCB, O_RDWR, DENY_WRITE, A_0}, 375{1, O_RDWR, DENY_FCB, O_RDONLY, DENY_WRITE, A_0}, 376{1, O_RDWR, DENY_FCB, O_WRONLY, DENY_WRITE, A_0}, 377{1, O_RDWR, DENY_FCB, O_RDWR, DENY_READ, A_0}, 378{1, O_RDWR, DENY_FCB, O_RDONLY, DENY_READ, A_0}, 379{1, O_RDWR, DENY_FCB, O_WRONLY, DENY_READ, A_0}, 380{1, O_RDWR, DENY_FCB, O_RDWR, DENY_NONE, A_0}, 381{1, O_RDWR, DENY_FCB, O_RDONLY, DENY_NONE, A_0}, 382{1, O_RDWR, DENY_FCB, O_WRONLY, DENY_NONE, A_0}, 383{1, O_RDWR, DENY_FCB, O_RDWR, DENY_FCB, A_0}, 384{1, O_RDWR, DENY_FCB, O_RDONLY, DENY_FCB, A_0}, 385{1, O_RDWR, DENY_FCB, O_WRONLY, DENY_FCB, A_0}, 386{1, O_RDONLY, DENY_FCB, O_RDWR, DENY_DOS, A_0}, 387{1, O_RDONLY, DENY_FCB, O_RDONLY, DENY_DOS, A_0}, 388{1, O_RDONLY, DENY_FCB, O_WRONLY, DENY_DOS, A_0}, 389{1, O_RDONLY, DENY_FCB, O_RDWR, DENY_ALL, A_0}, 390{1, O_RDONLY, DENY_FCB, O_RDONLY, DENY_ALL, A_0}, 391{1, O_RDONLY, DENY_FCB, O_WRONLY, DENY_ALL, A_0}, 392{1, O_RDONLY, DENY_FCB, O_RDWR, DENY_WRITE, A_0}, 393{1, O_RDONLY, DENY_FCB, O_RDONLY, DENY_WRITE, A_0}, 394{1, O_RDONLY, DENY_FCB, O_WRONLY, DENY_WRITE, A_0}, 395{1, O_RDONLY, DENY_FCB, O_RDWR, DENY_READ, A_0}, 396{1, O_RDONLY, DENY_FCB, O_RDONLY, DENY_READ, A_0}, 397{1, O_RDONLY, DENY_FCB, O_WRONLY, DENY_READ, A_0}, 398{1, O_RDONLY, DENY_FCB, O_RDWR, DENY_NONE, A_0}, 399{1, O_RDONLY, DENY_FCB, O_RDONLY, DENY_NONE, A_0}, 400{1, O_RDONLY, DENY_FCB, O_WRONLY, DENY_NONE, A_0}, 401{1, O_RDONLY, DENY_FCB, O_RDWR, DENY_FCB, A_0}, 402{1, O_RDONLY, DENY_FCB, O_RDONLY, DENY_FCB, A_0}, 403{1, O_RDONLY, DENY_FCB, O_WRONLY, DENY_FCB, A_0}, 404{1, O_WRONLY, DENY_FCB, O_RDWR, DENY_DOS, A_0}, 405{1, O_WRONLY, DENY_FCB, O_RDONLY, DENY_DOS, A_0}, 406{1, O_WRONLY, DENY_FCB, O_WRONLY, DENY_DOS, A_0}, 407{1, O_WRONLY, DENY_FCB, O_RDWR, DENY_ALL, A_0}, 408{1, O_WRONLY, DENY_FCB, O_RDONLY, DENY_ALL, A_0}, 409{1, O_WRONLY, DENY_FCB, O_WRONLY, DENY_ALL, A_0}, 410{1, O_WRONLY, DENY_FCB, O_RDWR, DENY_WRITE, A_0}, 411{1, O_WRONLY, DENY_FCB, O_RDONLY, DENY_WRITE, A_0}, 412{1, O_WRONLY, DENY_FCB, O_WRONLY, DENY_WRITE, A_0}, 413{1, O_WRONLY, DENY_FCB, O_RDWR, DENY_READ, A_0}, 414{1, O_WRONLY, DENY_FCB, O_RDONLY, DENY_READ, A_0}, 415{1, O_WRONLY, DENY_FCB, O_WRONLY, DENY_READ, A_0}, 416{1, O_WRONLY, DENY_FCB, O_RDWR, DENY_NONE, A_0}, 417{1, O_WRONLY, DENY_FCB, O_RDONLY, DENY_NONE, A_0}, 418{1, O_WRONLY, DENY_FCB, O_WRONLY, DENY_NONE, A_0}, 419{1, O_WRONLY, DENY_FCB, O_RDWR, DENY_FCB, A_0}, 420{1, O_WRONLY, DENY_FCB, O_RDONLY, DENY_FCB, A_0}, 421{1, O_WRONLY, DENY_FCB, O_WRONLY, DENY_FCB, A_0}, 422{0, O_RDWR, DENY_DOS, O_RDWR, DENY_DOS, A_0}, 423{0, O_RDWR, DENY_DOS, O_RDONLY, DENY_DOS, A_0}, 424{0, O_RDWR, DENY_DOS, O_WRONLY, DENY_DOS, A_0}, 425{0, O_RDWR, DENY_DOS, O_RDWR, DENY_ALL, A_0}, 426{0, O_RDWR, DENY_DOS, O_RDONLY, DENY_ALL, A_0}, 427{0, O_RDWR, DENY_DOS, O_WRONLY, DENY_ALL, A_0}, 428{0, O_RDWR, DENY_DOS, O_RDWR, DENY_WRITE, A_0}, 429{0, O_RDWR, DENY_DOS, O_RDONLY, DENY_WRITE, A_0}, 430{0, O_RDWR, DENY_DOS, O_WRONLY, DENY_WRITE, A_0}, 431{0, O_RDWR, DENY_DOS, O_RDWR, DENY_READ, A_0}, 432{0, O_RDWR, DENY_DOS, O_RDONLY, DENY_READ, A_0}, 433{0, O_RDWR, DENY_DOS, O_WRONLY, DENY_READ, A_0}, 434{0, O_RDWR, DENY_DOS, O_RDWR, DENY_NONE, A_0}, 435{0, O_RDWR, DENY_DOS, O_RDONLY, DENY_NONE, A_0}, 436{0, O_RDWR, DENY_DOS, O_WRONLY, DENY_NONE, A_0}, 437{0, O_RDWR, DENY_DOS, O_RDWR, DENY_FCB, A_0}, 438{0, O_RDWR, DENY_DOS, O_RDONLY, DENY_FCB, A_0}, 439{0, O_RDWR, DENY_DOS, O_WRONLY, DENY_FCB, A_0}, 440{0, O_RDONLY, DENY_DOS, O_RDWR, DENY_DOS, A_0}, 441{0, O_RDONLY, DENY_DOS, O_RDONLY, DENY_DOS, A_R}, 442{0, O_RDONLY, DENY_DOS, O_WRONLY, DENY_DOS, A_0}, 443{0, O_RDONLY, DENY_DOS, O_RDWR, DENY_ALL, A_0}, 444{0, O_RDONLY, DENY_DOS, O_RDONLY, DENY_ALL, A_0}, 445{0, O_RDONLY, DENY_DOS, O_WRONLY, DENY_ALL, A_0}, 446{0, O_RDONLY, DENY_DOS, O_RDWR, DENY_WRITE, A_0}, 447{0, O_RDONLY, DENY_DOS, O_RDONLY, DENY_WRITE, A_R}, 448{0, O_RDONLY, DENY_DOS, O_WRONLY, DENY_WRITE, A_0}, 449{0, O_RDONLY, DENY_DOS, O_RDWR, DENY_READ, A_0}, 450{0, O_RDONLY, DENY_DOS, O_RDONLY, DENY_READ, A_0}, 451{0, O_RDONLY, DENY_DOS, O_WRONLY, DENY_READ, A_0}, 452{0, O_RDONLY, DENY_DOS, O_RDWR, DENY_NONE, A_0}, 453{0, O_RDONLY, DENY_DOS, O_RDONLY, DENY_NONE, A_R}, 454{0, O_RDONLY, DENY_DOS, O_WRONLY, DENY_NONE, A_0}, 455{0, O_RDONLY, DENY_DOS, O_RDWR, DENY_FCB, A_0}, 456{0, O_RDONLY, DENY_DOS, O_RDONLY, DENY_FCB, A_0}, 457{0, O_RDONLY, DENY_DOS, O_WRONLY, DENY_FCB, A_0}, 458{0, O_WRONLY, DENY_DOS, O_RDWR, DENY_DOS, A_0}, 459{0, O_WRONLY, DENY_DOS, O_RDONLY, DENY_DOS, A_0}, 460{0, O_WRONLY, DENY_DOS, O_WRONLY, DENY_DOS, A_0}, 461{0, O_WRONLY, DENY_DOS, O_RDWR, DENY_ALL, A_0}, 462{0, O_WRONLY, DENY_DOS, O_RDONLY, DENY_ALL, A_0}, 463{0, O_WRONLY, DENY_DOS, O_WRONLY, DENY_ALL, A_0}, 464{0, O_WRONLY, DENY_DOS, O_RDWR, DENY_WRITE, A_0}, 465{0, O_WRONLY, DENY_DOS, O_RDONLY, DENY_WRITE, A_0}, 466{0, O_WRONLY, DENY_DOS, O_WRONLY, DENY_WRITE, A_0}, 467{0, O_WRONLY, DENY_DOS, O_RDWR, DENY_READ, A_0}, 468{0, O_WRONLY, DENY_DOS, O_RDONLY, DENY_READ, A_0}, 469{0, O_WRONLY, DENY_DOS, O_WRONLY, DENY_READ, A_0}, 470{0, O_WRONLY, DENY_DOS, O_RDWR, DENY_NONE, A_0}, 471{0, O_WRONLY, DENY_DOS, O_RDONLY, DENY_NONE, A_0}, 472{0, O_WRONLY, DENY_DOS, O_WRONLY, DENY_NONE, A_0}, 473{0, O_WRONLY, DENY_DOS, O_RDWR, DENY_FCB, A_0}, 474{0, O_WRONLY, DENY_DOS, O_RDONLY, DENY_FCB, A_0}, 475{0, O_WRONLY, DENY_DOS, O_WRONLY, DENY_FCB, A_0}, 476{0, O_RDWR, DENY_ALL, O_RDWR, DENY_DOS, A_0}, 477{0, O_RDWR, DENY_ALL, O_RDONLY, DENY_DOS, A_0}, 478{0, O_RDWR, DENY_ALL, O_WRONLY, DENY_DOS, A_0}, 479{0, O_RDWR, DENY_ALL, O_RDWR, DENY_ALL, A_0}, 480{0, O_RDWR, DENY_ALL, O_RDONLY, DENY_ALL, A_0}, 481{0, O_RDWR, DENY_ALL, O_WRONLY, DENY_ALL, A_0}, 482{0, O_RDWR, DENY_ALL, O_RDWR, DENY_WRITE, A_0}, 483{0, O_RDWR, DENY_ALL, O_RDONLY, DENY_WRITE, A_0}, 484{0, O_RDWR, DENY_ALL, O_WRONLY, DENY_WRITE, A_0}, 485{0, O_RDWR, DENY_ALL, O_RDWR, DENY_READ, A_0}, 486{0, O_RDWR, DENY_ALL, O_RDONLY, DENY_READ, A_0}, 487{0, O_RDWR, DENY_ALL, O_WRONLY, DENY_READ, A_0}, 488{0, O_RDWR, DENY_ALL, O_RDWR, DENY_NONE, A_0}, 489{0, O_RDWR, DENY_ALL, O_RDONLY, DENY_NONE, A_0}, 490{0, O_RDWR, DENY_ALL, O_WRONLY, DENY_NONE, A_0}, 491{0, O_RDWR, DENY_ALL, O_RDWR, DENY_FCB, A_0}, 492{0, O_RDWR, DENY_ALL, O_RDONLY, DENY_FCB, A_0}, 493{0, O_RDWR, DENY_ALL, O_WRONLY, DENY_FCB, A_0}, 494{0, O_RDONLY, DENY_ALL, O_RDWR, DENY_DOS, A_0}, 495{0, O_RDONLY, DENY_ALL, O_RDONLY, DENY_DOS, A_0}, 496{0, O_RDONLY, DENY_ALL, O_WRONLY, DENY_DOS, A_0}, 497{0, O_RDONLY, DENY_ALL, O_RDWR, DENY_ALL, A_0}, 498{0, O_RDONLY, DENY_ALL, O_RDONLY, DENY_ALL, A_0}, 499{0, O_RDONLY, DENY_ALL, O_WRONLY, DENY_ALL, A_0}, 500{0, O_RDONLY, DENY_ALL, O_RDWR, DENY_WRITE, A_0}, 501{0, O_RDONLY, DENY_ALL, O_RDONLY, DENY_WRITE, A_0}, 502{0, O_RDONLY, DENY_ALL, O_WRONLY, DENY_WRITE, A_0}, 503{0, O_RDONLY, DENY_ALL, O_RDWR, DENY_READ, A_0}, 504{0, O_RDONLY, DENY_ALL, O_RDONLY, DENY_READ, A_0}, 505{0, O_RDONLY, DENY_ALL, O_WRONLY, DENY_READ, A_0}, 506{0, O_RDONLY, DENY_ALL, O_RDWR, DENY_NONE, A_0}, 507{0, O_RDONLY, DENY_ALL, O_RDONLY, DENY_NONE, A_0}, 508{0, O_RDONLY, DENY_ALL, O_WRONLY, DENY_NONE, A_0}, 509{0, O_RDONLY, DENY_ALL, O_RDWR, DENY_FCB, A_0}, 510{0, O_RDONLY, DENY_ALL, O_RDONLY, DENY_FCB, A_0}, 511{0, O_RDONLY, DENY_ALL, O_WRONLY, DENY_FCB, A_0}, 512{0, O_WRONLY, DENY_ALL, O_RDWR, DENY_DOS, A_0}, 513{0, O_WRONLY, DENY_ALL, O_RDONLY, DENY_DOS, A_0}, 514{0, O_WRONLY, DENY_ALL, O_WRONLY, DENY_DOS, A_0}, 515{0, O_WRONLY, DENY_ALL, O_RDWR, DENY_ALL, A_0}, 516{0, O_WRONLY, DENY_ALL, O_RDONLY, DENY_ALL, A_0}, 517{0, O_WRONLY, DENY_ALL, O_WRONLY, DENY_ALL, A_0}, 518{0, O_WRONLY, DENY_ALL, O_RDWR, DENY_WRITE, A_0}, 519{0, O_WRONLY, DENY_ALL, O_RDONLY, DENY_WRITE, A_0}, 520{0, O_WRONLY, DENY_ALL, O_WRONLY, DENY_WRITE, A_0}, 521{0, O_WRONLY, DENY_ALL, O_RDWR, DENY_READ, A_0}, 522{0, O_WRONLY, DENY_ALL, O_RDONLY, DENY_READ, A_0}, 523{0, O_WRONLY, DENY_ALL, O_WRONLY, DENY_READ, A_0}, 524{0, O_WRONLY, DENY_ALL, O_RDWR, DENY_NONE, A_0}, 525{0, O_WRONLY, DENY_ALL, O_RDONLY, DENY_NONE, A_0}, 526{0, O_WRONLY, DENY_ALL, O_WRONLY, DENY_NONE, A_0}, 527{0, O_WRONLY, DENY_ALL, O_RDWR, DENY_FCB, A_0}, 528{0, O_WRONLY, DENY_ALL, O_RDONLY, DENY_FCB, A_0}, 529{0, O_WRONLY, DENY_ALL, O_WRONLY, DENY_FCB, A_0}, 530{0, O_RDWR, DENY_WRITE, O_RDWR, DENY_DOS, A_0}, 531{0, O_RDWR, DENY_WRITE, O_RDONLY, DENY_DOS, A_0}, 532{0, O_RDWR, DENY_WRITE, O_WRONLY, DENY_DOS, A_0}, 533{0, O_RDWR, DENY_WRITE, O_RDWR, DENY_ALL, A_0}, 534{0, O_RDWR, DENY_WRITE, O_RDONLY, DENY_ALL, A_0}, 535{0, O_RDWR, DENY_WRITE, O_WRONLY, DENY_ALL, A_0}, 536{0, O_RDWR, DENY_WRITE, O_RDWR, DENY_WRITE, A_0}, 537{0, O_RDWR, DENY_WRITE, O_RDONLY, DENY_WRITE, A_0}, 538{0, O_RDWR, DENY_WRITE, O_WRONLY, DENY_WRITE, A_0}, 539{0, O_RDWR, DENY_WRITE, O_RDWR, DENY_READ, A_0}, 540{0, O_RDWR, DENY_WRITE, O_RDONLY, DENY_READ, A_0}, 541{0, O_RDWR, DENY_WRITE, O_WRONLY, DENY_READ, A_0}, 542{0, O_RDWR, DENY_WRITE, O_RDWR, DENY_NONE, A_0}, 543{0, O_RDWR, DENY_WRITE, O_RDONLY, DENY_NONE, A_R}, 544{0, O_RDWR, DENY_WRITE, O_WRONLY, DENY_NONE, A_0}, 545{0, O_RDWR, DENY_WRITE, O_RDWR, DENY_FCB, A_0}, 546{0, O_RDWR, DENY_WRITE, O_RDONLY, DENY_FCB, A_0}, 547{0, O_RDWR, DENY_WRITE, O_WRONLY, DENY_FCB, A_0}, 548{0, O_RDONLY, DENY_WRITE, O_RDWR, DENY_DOS, A_0}, 549{0, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_DOS, A_R}, 550{0, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_DOS, A_0}, 551{0, O_RDONLY, DENY_WRITE, O_RDWR, DENY_ALL, A_0}, 552{0, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_ALL, A_0}, 553{0, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_ALL, A_0}, 554{0, O_RDONLY, DENY_WRITE, O_RDWR, DENY_WRITE, A_0}, 555{0, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_WRITE, A_R}, 556{0, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_WRITE, A_0}, 557{0, O_RDONLY, DENY_WRITE, O_RDWR, DENY_READ, A_0}, 558{0, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_READ, A_0}, 559{0, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_READ, A_0}, 560{0, O_RDONLY, DENY_WRITE, O_RDWR, DENY_NONE, A_0}, 561{0, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_NONE, A_R}, 562{0, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_NONE, A_0}, 563{0, O_RDONLY, DENY_WRITE, O_RDWR, DENY_FCB, A_0}, 564{0, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_FCB, A_0}, 565{0, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_FCB, A_0}, 566{0, O_WRONLY, DENY_WRITE, O_RDWR, DENY_DOS, A_0}, 567{0, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_DOS, A_0}, 568{0, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_DOS, A_0}, 569{0, O_WRONLY, DENY_WRITE, O_RDWR, DENY_ALL, A_0}, 570{0, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_ALL, A_0}, 571{0, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_ALL, A_0}, 572{0, O_WRONLY, DENY_WRITE, O_RDWR, DENY_WRITE, A_0}, 573{0, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_WRITE, A_0}, 574{0, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_WRITE, A_0}, 575{0, O_WRONLY, DENY_WRITE, O_RDWR, DENY_READ, A_0}, 576{0, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_READ, A_R}, 577{0, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_READ, A_0}, 578{0, O_WRONLY, DENY_WRITE, O_RDWR, DENY_NONE, A_0}, 579{0, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_NONE, A_R}, 580{0, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_NONE, A_0}, 581{0, O_WRONLY, DENY_WRITE, O_RDWR, DENY_FCB, A_0}, 582{0, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_FCB, A_0}, 583{0, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_FCB, A_0}, 584{0, O_RDWR, DENY_READ, O_RDWR, DENY_DOS, A_0}, 585{0, O_RDWR, DENY_READ, O_RDONLY, DENY_DOS, A_0}, 586{0, O_RDWR, DENY_READ, O_WRONLY, DENY_DOS, A_0}, 587{0, O_RDWR, DENY_READ, O_RDWR, DENY_ALL, A_0}, 588{0, O_RDWR, DENY_READ, O_RDONLY, DENY_ALL, A_0}, 589{0, O_RDWR, DENY_READ, O_WRONLY, DENY_ALL, A_0}, 590{0, O_RDWR, DENY_READ, O_RDWR, DENY_WRITE, A_0}, 591{0, O_RDWR, DENY_READ, O_RDONLY, DENY_WRITE, A_0}, 592{0, O_RDWR, DENY_READ, O_WRONLY, DENY_WRITE, A_0}, 593{0, O_RDWR, DENY_READ, O_RDWR, DENY_READ, A_0}, 594{0, O_RDWR, DENY_READ, O_RDONLY, DENY_READ, A_0}, 595{0, O_RDWR, DENY_READ, O_WRONLY, DENY_READ, A_0}, 596{0, O_RDWR, DENY_READ, O_RDWR, DENY_NONE, A_0}, 597{0, O_RDWR, DENY_READ, O_RDONLY, DENY_NONE, A_0}, 598{0, O_RDWR, DENY_READ, O_WRONLY, DENY_NONE, A_W}, 599{0, O_RDWR, DENY_READ, O_RDWR, DENY_FCB, A_0}, 600{0, O_RDWR, DENY_READ, O_RDONLY, DENY_FCB, A_0}, 601{0, O_RDWR, DENY_READ, O_WRONLY, DENY_FCB, A_0}, 602{0, O_RDONLY, DENY_READ, O_RDWR, DENY_DOS, A_0}, 603{0, O_RDONLY, DENY_READ, O_RDONLY, DENY_DOS, A_0}, 604{0, O_RDONLY, DENY_READ, O_WRONLY, DENY_DOS, A_0}, 605{0, O_RDONLY, DENY_READ, O_RDWR, DENY_ALL, A_0}, 606{0, O_RDONLY, DENY_READ, O_RDONLY, DENY_ALL, A_0}, 607{0, O_RDONLY, DENY_READ, O_WRONLY, DENY_ALL, A_0}, 608{0, O_RDONLY, DENY_READ, O_RDWR, DENY_WRITE, A_0}, 609{0, O_RDONLY, DENY_READ, O_RDONLY, DENY_WRITE, A_0}, 610{0, O_RDONLY, DENY_READ, O_WRONLY, DENY_WRITE, A_W}, 611{0, O_RDONLY, DENY_READ, O_RDWR, DENY_READ, A_0}, 612{0, O_RDONLY, DENY_READ, O_RDONLY, DENY_READ, A_0}, 613{0, O_RDONLY, DENY_READ, O_WRONLY, DENY_READ, A_0}, 614{0, O_RDONLY, DENY_READ, O_RDWR, DENY_NONE, A_0}, 615{0, O_RDONLY, DENY_READ, O_RDONLY, DENY_NONE, A_0}, 616{0, O_RDONLY, DENY_READ, O_WRONLY, DENY_NONE, A_W}, 617{0, O_RDONLY, DENY_READ, O_RDWR, DENY_FCB, A_0}, 618{0, O_RDONLY, DENY_READ, O_RDONLY, DENY_FCB, A_0}, 619{0, O_RDONLY, DENY_READ, O_WRONLY, DENY_FCB, A_0}, 620{0, O_WRONLY, DENY_READ, O_RDWR, DENY_DOS, A_0}, 621{0, O_WRONLY, DENY_READ, O_RDONLY, DENY_DOS, A_0}, 622{0, O_WRONLY, DENY_READ, O_WRONLY, DENY_DOS, A_0}, 623{0, O_WRONLY, DENY_READ, O_RDWR, DENY_ALL, A_0}, 624{0, O_WRONLY, DENY_READ, O_RDONLY, DENY_ALL, A_0}, 625{0, O_WRONLY, DENY_READ, O_WRONLY, DENY_ALL, A_0}, 626{0, O_WRONLY, DENY_READ, O_RDWR, DENY_WRITE, A_0}, 627{0, O_WRONLY, DENY_READ, O_RDONLY, DENY_WRITE, A_0}, 628{0, O_WRONLY, DENY_READ, O_WRONLY, DENY_WRITE, A_0}, 629{0, O_WRONLY, DENY_READ, O_RDWR, DENY_READ, A_0}, 630{0, O_WRONLY, DENY_READ, O_RDONLY, DENY_READ, A_0}, 631{0, O_WRONLY, DENY_READ, O_WRONLY, DENY_READ, A_W}, 632{0, O_WRONLY, DENY_READ, O_RDWR, DENY_NONE, A_0}, 633{0, O_WRONLY, DENY_READ, O_RDONLY, DENY_NONE, A_0}, 634{0, O_WRONLY, DENY_READ, O_WRONLY, DENY_NONE, A_W}, 635{0, O_WRONLY, DENY_READ, O_RDWR, DENY_FCB, A_0}, 636{0, O_WRONLY, DENY_READ, O_RDONLY, DENY_FCB, A_0}, 637{0, O_WRONLY, DENY_READ, O_WRONLY, DENY_FCB, A_0}, 638{0, O_RDWR, DENY_NONE, O_RDWR, DENY_DOS, A_0}, 639{0, O_RDWR, DENY_NONE, O_RDONLY, DENY_DOS, A_0}, 640{0, O_RDWR, DENY_NONE, O_WRONLY, DENY_DOS, A_0}, 641{0, O_RDWR, DENY_NONE, O_RDWR, DENY_ALL, A_0}, 642{0, O_RDWR, DENY_NONE, O_RDONLY, DENY_ALL, A_0}, 643{0, O_RDWR, DENY_NONE, O_WRONLY, DENY_ALL, A_0}, 644{0, O_RDWR, DENY_NONE, O_RDWR, DENY_WRITE, A_0}, 645{0, O_RDWR, DENY_NONE, O_RDONLY, DENY_WRITE, A_0}, 646{0, O_RDWR, DENY_NONE, O_WRONLY, DENY_WRITE, A_0}, 647{0, O_RDWR, DENY_NONE, O_RDWR, DENY_READ, A_0}, 648{0, O_RDWR, DENY_NONE, O_RDONLY, DENY_READ, A_0}, 649{0, O_RDWR, DENY_NONE, O_WRONLY, DENY_READ, A_0}, 650{0, O_RDWR, DENY_NONE, O_RDWR, DENY_NONE, A_RW}, 651{0, O_RDWR, DENY_NONE, O_RDONLY, DENY_NONE, A_R}, 652{0, O_RDWR, DENY_NONE, O_WRONLY, DENY_NONE, A_W}, 653{0, O_RDWR, DENY_NONE, O_RDWR, DENY_FCB, A_0}, 654{0, O_RDWR, DENY_NONE, O_RDONLY, DENY_FCB, A_0}, 655{0, O_RDWR, DENY_NONE, O_WRONLY, DENY_FCB, A_0}, 656{0, O_RDONLY, DENY_NONE, O_RDWR, DENY_DOS, A_0}, 657{0, O_RDONLY, DENY_NONE, O_RDONLY, DENY_DOS, A_R}, 658{0, O_RDONLY, DENY_NONE, O_WRONLY, DENY_DOS, A_0}, 659{0, O_RDONLY, DENY_NONE, O_RDWR, DENY_ALL, A_0}, 660{0, O_RDONLY, DENY_NONE, O_RDONLY, DENY_ALL, A_0}, 661{0, O_RDONLY, DENY_NONE, O_WRONLY, DENY_ALL, A_0}, 662{0, O_RDONLY, DENY_NONE, O_RDWR, DENY_WRITE, A_RW}, 663{0, O_RDONLY, DENY_NONE, O_RDONLY, DENY_WRITE, A_R}, 664{0, O_RDONLY, DENY_NONE, O_WRONLY, DENY_WRITE, A_W}, 665{0, O_RDONLY, DENY_NONE, O_RDWR, DENY_READ, A_0}, 666{0, O_RDONLY, DENY_NONE, O_RDONLY, DENY_READ, A_0}, 667{0, O_RDONLY, DENY_NONE, O_WRONLY, DENY_READ, A_0}, 668{0, O_RDONLY, DENY_NONE, O_RDWR, DENY_NONE, A_RW}, 669{0, O_RDONLY, DENY_NONE, O_RDONLY, DENY_NONE, A_R}, 670{0, O_RDONLY, DENY_NONE, O_WRONLY, DENY_NONE, A_W}, 671{0, O_RDONLY, DENY_NONE, O_RDWR, DENY_FCB, A_0}, 672{0, O_RDONLY, DENY_NONE, O_RDONLY, DENY_FCB, A_0}, 673{0, O_RDONLY, DENY_NONE, O_WRONLY, DENY_FCB, A_0}, 674{0, O_WRONLY, DENY_NONE, O_RDWR, DENY_DOS, A_0}, 675{0, O_WRONLY, DENY_NONE, O_RDONLY, DENY_DOS, A_0}, 676{0, O_WRONLY, DENY_NONE, O_WRONLY, DENY_DOS, A_0}, 677{0, O_WRONLY, DENY_NONE, O_RDWR, DENY_ALL, A_0}, 678{0, O_WRONLY, DENY_NONE, O_RDONLY, DENY_ALL, A_0}, 679{0, O_WRONLY, DENY_NONE, O_WRONLY, DENY_ALL, A_0}, 680{0, O_WRONLY, DENY_NONE, O_RDWR, DENY_WRITE, A_0}, 681{0, O_WRONLY, DENY_NONE, O_RDONLY, DENY_WRITE, A_0}, 682{0, O_WRONLY, DENY_NONE, O_WRONLY, DENY_WRITE, A_0}, 683{0, O_WRONLY, DENY_NONE, O_RDWR, DENY_READ, A_RW}, 684{0, O_WRONLY, DENY_NONE, O_RDONLY, DENY_READ, A_R}, 685{0, O_WRONLY, DENY_NONE, O_WRONLY, DENY_READ, A_W}, 686{0, O_WRONLY, DENY_NONE, O_RDWR, DENY_NONE, A_RW}, 687{0, O_WRONLY, DENY_NONE, O_RDONLY, DENY_NONE, A_R}, 688{0, O_WRONLY, DENY_NONE, O_WRONLY, DENY_NONE, A_W}, 689{0, O_WRONLY, DENY_NONE, O_RDWR, DENY_FCB, A_0}, 690{0, O_WRONLY, DENY_NONE, O_RDONLY, DENY_FCB, A_0}, 691{0, O_WRONLY, DENY_NONE, O_WRONLY, DENY_FCB, A_0}, 692{0, O_RDWR, DENY_FCB, O_RDWR, DENY_DOS, A_0}, 693{0, O_RDWR, DENY_FCB, O_RDONLY, DENY_DOS, A_0}, 694{0, O_RDWR, DENY_FCB, O_WRONLY, DENY_DOS, A_0}, 695{0, O_RDWR, DENY_FCB, O_RDWR, DENY_ALL, A_0}, 696{0, O_RDWR, DENY_FCB, O_RDONLY, DENY_ALL, A_0}, 697{0, O_RDWR, DENY_FCB, O_WRONLY, DENY_ALL, A_0}, 698{0, O_RDWR, DENY_FCB, O_RDWR, DENY_WRITE, A_0}, 699{0, O_RDWR, DENY_FCB, O_RDONLY, DENY_WRITE, A_0}, 700{0, O_RDWR, DENY_FCB, O_WRONLY, DENY_WRITE, A_0}, 701{0, O_RDWR, DENY_FCB, O_RDWR, DENY_READ, A_0}, 702{0, O_RDWR, DENY_FCB, O_RDONLY, DENY_READ, A_0}, 703{0, O_RDWR, DENY_FCB, O_WRONLY, DENY_READ, A_0}, 704{0, O_RDWR, DENY_FCB, O_RDWR, DENY_NONE, A_0}, 705{0, O_RDWR, DENY_FCB, O_RDONLY, DENY_NONE, A_0}, 706{0, O_RDWR, DENY_FCB, O_WRONLY, DENY_NONE, A_0}, 707{0, O_RDWR, DENY_FCB, O_RDWR, DENY_FCB, A_0}, 708{0, O_RDWR, DENY_FCB, O_RDONLY, DENY_FCB, A_0}, 709{0, O_RDWR, DENY_FCB, O_WRONLY, DENY_FCB, A_0}, 710{0, O_RDONLY, DENY_FCB, O_RDWR, DENY_DOS, A_0}, 711{0, O_RDONLY, DENY_FCB, O_RDONLY, DENY_DOS, A_0}, 712{0, O_RDONLY, DENY_FCB, O_WRONLY, DENY_DOS, A_0}, 713{0, O_RDONLY, DENY_FCB, O_RDWR, DENY_ALL, A_0}, 714{0, O_RDONLY, DENY_FCB, O_RDONLY, DENY_ALL, A_0}, 715{0, O_RDONLY, DENY_FCB, O_WRONLY, DENY_ALL, A_0}, 716{0, O_RDONLY, DENY_FCB, O_RDWR, DENY_WRITE, A_0}, 717{0, O_RDONLY, DENY_FCB, O_RDONLY, DENY_WRITE, A_0}, 718{0, O_RDONLY, DENY_FCB, O_WRONLY, DENY_WRITE, A_0}, 719{0, O_RDONLY, DENY_FCB, O_RDWR, DENY_READ, A_0}, 720{0, O_RDONLY, DENY_FCB, O_RDONLY, DENY_READ, A_0}, 721{0, O_RDONLY, DENY_FCB, O_WRONLY, DENY_READ, A_0}, 722{0, O_RDONLY, DENY_FCB, O_RDWR, DENY_NONE, A_0}, 723{0, O_RDONLY, DENY_FCB, O_RDONLY, DENY_NONE, A_0}, 724{0, O_RDONLY, DENY_FCB, O_WRONLY, DENY_NONE, A_0}, 725{0, O_RDONLY, DENY_FCB, O_RDWR, DENY_FCB, A_0}, 726{0, O_RDONLY, DENY_FCB, O_RDONLY, DENY_FCB, A_0}, 727{0, O_RDONLY, DENY_FCB, O_WRONLY, DENY_FCB, A_0}, 728{0, O_WRONLY, DENY_FCB, O_RDWR, DENY_DOS, A_0}, 729{0, O_WRONLY, DENY_FCB, O_RDONLY, DENY_DOS, A_0}, 730{0, O_WRONLY, DENY_FCB, O_WRONLY, DENY_DOS, A_0}, 731{0, O_WRONLY, DENY_FCB, O_RDWR, DENY_ALL, A_0}, 732{0, O_WRONLY, DENY_FCB, O_RDONLY, DENY_ALL, A_0}, 733{0, O_WRONLY, DENY_FCB, O_WRONLY, DENY_ALL, A_0}, 734{0, O_WRONLY, DENY_FCB, O_RDWR, DENY_WRITE, A_0}, 735{0, O_WRONLY, DENY_FCB, O_RDONLY, DENY_WRITE, A_0}, 736{0, O_WRONLY, DENY_FCB, O_WRONLY, DENY_WRITE, A_0}, 737{0, O_WRONLY, DENY_FCB, O_RDWR, DENY_READ, A_0}, 738{0, O_WRONLY, DENY_FCB, O_RDONLY, DENY_READ, A_0}, 739{0, O_WRONLY, DENY_FCB, O_WRONLY, DENY_READ, A_0}, 740{0, O_WRONLY, DENY_FCB, O_RDWR, DENY_NONE, A_0}, 741{0, O_WRONLY, DENY_FCB, O_RDONLY, DENY_NONE, A_0}, 742{0, O_WRONLY, DENY_FCB, O_WRONLY, DENY_NONE, A_0}, 743{0, O_WRONLY, DENY_FCB, O_RDWR, DENY_FCB, A_0}, 744{0, O_WRONLY, DENY_FCB, O_RDONLY, DENY_FCB, A_0}, 745{0, O_WRONLY, DENY_FCB, O_WRONLY, DENY_FCB, A_0} 746}; 747 748 749static const struct { 750 int isexe; 751 int mode1, deny1; 752 int mode2, deny2; 753 enum deny_result result; 754} denytable1[] = { 755{1, O_RDWR, DENY_DOS, O_RDWR, DENY_DOS, A_RW}, 756{1, O_RDWR, DENY_DOS, O_RDONLY, DENY_DOS, A_R}, 757{1, O_RDWR, DENY_DOS, O_WRONLY, DENY_DOS, A_W}, 758{1, O_RDWR, DENY_DOS, O_RDWR, DENY_ALL, A_0}, 759{1, O_RDWR, DENY_DOS, O_RDONLY, DENY_ALL, A_0}, 760{1, O_RDWR, DENY_DOS, O_WRONLY, DENY_ALL, A_0}, 761{1, O_RDWR, DENY_DOS, O_RDWR, DENY_WRITE, A_0}, 762{1, O_RDWR, DENY_DOS, O_RDONLY, DENY_WRITE, A_0}, 763{1, O_RDWR, DENY_DOS, O_WRONLY, DENY_WRITE, A_0}, 764{1, O_RDWR, DENY_DOS, O_RDWR, DENY_READ, A_0}, 765{1, O_RDWR, DENY_DOS, O_RDONLY, DENY_READ, A_0}, 766{1, O_RDWR, DENY_DOS, O_WRONLY, DENY_READ, A_0}, 767{1, O_RDWR, DENY_DOS, O_RDWR, DENY_NONE, A_RW}, 768{1, O_RDWR, DENY_DOS, O_RDONLY, DENY_NONE, A_R}, 769{1, O_RDWR, DENY_DOS, O_WRONLY, DENY_NONE, A_W}, 770{1, O_RDWR, DENY_DOS, O_RDWR, DENY_FCB, A_0}, 771{1, O_RDWR, DENY_DOS, O_RDONLY, DENY_FCB, A_0}, 772{1, O_RDWR, DENY_DOS, O_WRONLY, DENY_FCB, A_0}, 773{1, O_RDONLY, DENY_DOS, O_RDWR, DENY_DOS, A_RW}, 774{1, O_RDONLY, DENY_DOS, O_RDONLY, DENY_DOS, A_R}, 775{1, O_RDONLY, DENY_DOS, O_WRONLY, DENY_DOS, A_W}, 776{1, O_RDONLY, DENY_DOS, O_RDWR, DENY_ALL, A_0}, 777{1, O_RDONLY, DENY_DOS, O_RDONLY, DENY_ALL, A_0}, 778{1, O_RDONLY, DENY_DOS, O_WRONLY, DENY_ALL, A_0}, 779{1, O_RDONLY, DENY_DOS, O_RDWR, DENY_WRITE, A_RW}, 780{1, O_RDONLY, DENY_DOS, O_RDONLY, DENY_WRITE, A_R}, 781{1, O_RDONLY, DENY_DOS, O_WRONLY, DENY_WRITE, A_W}, 782{1, O_RDONLY, DENY_DOS, O_RDWR, DENY_READ, A_0}, 783{1, O_RDONLY, DENY_DOS, O_RDONLY, DENY_READ, A_0}, 784{1, O_RDONLY, DENY_DOS, O_WRONLY, DENY_READ, A_0}, 785{1, O_RDONLY, DENY_DOS, O_RDWR, DENY_NONE, A_RW}, 786{1, O_RDONLY, DENY_DOS, O_RDONLY, DENY_NONE, A_R}, 787{1, O_RDONLY, DENY_DOS, O_WRONLY, DENY_NONE, A_W}, 788{1, O_RDONLY, DENY_DOS, O_RDWR, DENY_FCB, A_0}, 789{1, O_RDONLY, DENY_DOS, O_RDONLY, DENY_FCB, A_0}, 790{1, O_RDONLY, DENY_DOS, O_WRONLY, DENY_FCB, A_0}, 791{1, O_WRONLY, DENY_DOS, O_RDWR, DENY_DOS, A_RW}, 792{1, O_WRONLY, DENY_DOS, O_RDONLY, DENY_DOS, A_R}, 793{1, O_WRONLY, DENY_DOS, O_WRONLY, DENY_DOS, A_W}, 794{1, O_WRONLY, DENY_DOS, O_RDWR, DENY_ALL, A_0}, 795{1, O_WRONLY, DENY_DOS, O_RDONLY, DENY_ALL, A_0}, 796{1, O_WRONLY, DENY_DOS, O_WRONLY, DENY_ALL, A_0}, 797{1, O_WRONLY, DENY_DOS, O_RDWR, DENY_WRITE, A_0}, 798{1, O_WRONLY, DENY_DOS, O_RDONLY, DENY_WRITE, A_0}, 799{1, O_WRONLY, DENY_DOS, O_WRONLY, DENY_WRITE, A_0}, 800{1, O_WRONLY, DENY_DOS, O_RDWR, DENY_READ, A_RW}, 801{1, O_WRONLY, DENY_DOS, O_RDONLY, DENY_READ, A_R}, 802{1, O_WRONLY, DENY_DOS, O_WRONLY, DENY_READ, A_W}, 803{1, O_WRONLY, DENY_DOS, O_RDWR, DENY_NONE, A_RW}, 804{1, O_WRONLY, DENY_DOS, O_RDONLY, DENY_NONE, A_R}, 805{1, O_WRONLY, DENY_DOS, O_WRONLY, DENY_NONE, A_W}, 806{1, O_WRONLY, DENY_DOS, O_RDWR, DENY_FCB, A_0}, 807{1, O_WRONLY, DENY_DOS, O_RDONLY, DENY_FCB, A_0}, 808{1, O_WRONLY, DENY_DOS, O_WRONLY, DENY_FCB, A_0}, 809{1, O_RDWR, DENY_ALL, O_RDWR, DENY_DOS, A_0}, 810{1, O_RDWR, DENY_ALL, O_RDONLY, DENY_DOS, A_0}, 811{1, O_RDWR, DENY_ALL, O_WRONLY, DENY_DOS, A_0}, 812{1, O_RDWR, DENY_ALL, O_RDWR, DENY_ALL, A_0}, 813{1, O_RDWR, DENY_ALL, O_RDONLY, DENY_ALL, A_0}, 814{1, O_RDWR, DENY_ALL, O_WRONLY, DENY_ALL, A_0}, 815{1, O_RDWR, DENY_ALL, O_RDWR, DENY_WRITE, A_0}, 816{1, O_RDWR, DENY_ALL, O_RDONLY, DENY_WRITE, A_0}, 817{1, O_RDWR, DENY_ALL, O_WRONLY, DENY_WRITE, A_0}, 818{1, O_RDWR, DENY_ALL, O_RDWR, DENY_READ, A_0}, 819{1, O_RDWR, DENY_ALL, O_RDONLY, DENY_READ, A_0}, 820{1, O_RDWR, DENY_ALL, O_WRONLY, DENY_READ, A_0}, 821{1, O_RDWR, DENY_ALL, O_RDWR, DENY_NONE, A_0}, 822{1, O_RDWR, DENY_ALL, O_RDONLY, DENY_NONE, A_0}, 823{1, O_RDWR, DENY_ALL, O_WRONLY, DENY_NONE, A_0}, 824{1, O_RDWR, DENY_ALL, O_RDWR, DENY_FCB, A_0}, 825{1, O_RDWR, DENY_ALL, O_RDONLY, DENY_FCB, A_0}, 826{1, O_RDWR, DENY_ALL, O_WRONLY, DENY_FCB, A_0}, 827{1, O_RDONLY, DENY_ALL, O_RDWR, DENY_DOS, A_0}, 828{1, O_RDONLY, DENY_ALL, O_RDONLY, DENY_DOS, A_0}, 829{1, O_RDONLY, DENY_ALL, O_WRONLY, DENY_DOS, A_0}, 830{1, O_RDONLY, DENY_ALL, O_RDWR, DENY_ALL, A_0}, 831{1, O_RDONLY, DENY_ALL, O_RDONLY, DENY_ALL, A_0}, 832{1, O_RDONLY, DENY_ALL, O_WRONLY, DENY_ALL, A_0}, 833{1, O_RDONLY, DENY_ALL, O_RDWR, DENY_WRITE, A_0}, 834{1, O_RDONLY, DENY_ALL, O_RDONLY, DENY_WRITE, A_0}, 835{1, O_RDONLY, DENY_ALL, O_WRONLY, DENY_WRITE, A_0}, 836{1, O_RDONLY, DENY_ALL, O_RDWR, DENY_READ, A_0}, 837{1, O_RDONLY, DENY_ALL, O_RDONLY, DENY_READ, A_0}, 838{1, O_RDONLY, DENY_ALL, O_WRONLY, DENY_READ, A_0}, 839{1, O_RDONLY, DENY_ALL, O_RDWR, DENY_NONE, A_0}, 840{1, O_RDONLY, DENY_ALL, O_RDONLY, DENY_NONE, A_0}, 841{1, O_RDONLY, DENY_ALL, O_WRONLY, DENY_NONE, A_0}, 842{1, O_RDONLY, DENY_ALL, O_RDWR, DENY_FCB, A_0}, 843{1, O_RDONLY, DENY_ALL, O_RDONLY, DENY_FCB, A_0}, 844{1, O_RDONLY, DENY_ALL, O_WRONLY, DENY_FCB, A_0}, 845{1, O_WRONLY, DENY_ALL, O_RDWR, DENY_DOS, A_0}, 846{1, O_WRONLY, DENY_ALL, O_RDONLY, DENY_DOS, A_0}, 847{1, O_WRONLY, DENY_ALL, O_WRONLY, DENY_DOS, A_0}, 848{1, O_WRONLY, DENY_ALL, O_RDWR, DENY_ALL, A_0}, 849{1, O_WRONLY, DENY_ALL, O_RDONLY, DENY_ALL, A_0}, 850{1, O_WRONLY, DENY_ALL, O_WRONLY, DENY_ALL, A_0}, 851{1, O_WRONLY, DENY_ALL, O_RDWR, DENY_WRITE, A_0}, 852{1, O_WRONLY, DENY_ALL, O_RDONLY, DENY_WRITE, A_0}, 853{1, O_WRONLY, DENY_ALL, O_WRONLY, DENY_WRITE, A_0}, 854{1, O_WRONLY, DENY_ALL, O_RDWR, DENY_READ, A_0}, 855{1, O_WRONLY, DENY_ALL, O_RDONLY, DENY_READ, A_0}, 856{1, O_WRONLY, DENY_ALL, O_WRONLY, DENY_READ, A_0}, 857{1, O_WRONLY, DENY_ALL, O_RDWR, DENY_NONE, A_0}, 858{1, O_WRONLY, DENY_ALL, O_RDONLY, DENY_NONE, A_0}, 859{1, O_WRONLY, DENY_ALL, O_WRONLY, DENY_NONE, A_0}, 860{1, O_WRONLY, DENY_ALL, O_RDWR, DENY_FCB, A_0}, 861{1, O_WRONLY, DENY_ALL, O_RDONLY, DENY_FCB, A_0}, 862{1, O_WRONLY, DENY_ALL, O_WRONLY, DENY_FCB, A_0}, 863{1, O_RDWR, DENY_WRITE, O_RDWR, DENY_DOS, A_0}, 864{1, O_RDWR, DENY_WRITE, O_RDONLY, DENY_DOS, A_R}, 865{1, O_RDWR, DENY_WRITE, O_WRONLY, DENY_DOS, A_0}, 866{1, O_RDWR, DENY_WRITE, O_RDWR, DENY_ALL, A_0}, 867{1, O_RDWR, DENY_WRITE, O_RDONLY, DENY_ALL, A_0}, 868{1, O_RDWR, DENY_WRITE, O_WRONLY, DENY_ALL, A_0}, 869{1, O_RDWR, DENY_WRITE, O_RDWR, DENY_WRITE, A_0}, 870{1, O_RDWR, DENY_WRITE, O_RDONLY, DENY_WRITE, A_0}, 871{1, O_RDWR, DENY_WRITE, O_WRONLY, DENY_WRITE, A_0}, 872{1, O_RDWR, DENY_WRITE, O_RDWR, DENY_READ, A_0}, 873{1, O_RDWR, DENY_WRITE, O_RDONLY, DENY_READ, A_0}, 874{1, O_RDWR, DENY_WRITE, O_WRONLY, DENY_READ, A_0}, 875{1, O_RDWR, DENY_WRITE, O_RDWR, DENY_NONE, A_0}, 876{1, O_RDWR, DENY_WRITE, O_RDONLY, DENY_NONE, A_R}, 877{1, O_RDWR, DENY_WRITE, O_WRONLY, DENY_NONE, A_0}, 878{1, O_RDWR, DENY_WRITE, O_RDWR, DENY_FCB, A_0}, 879{1, O_RDWR, DENY_WRITE, O_RDONLY, DENY_FCB, A_0}, 880{1, O_RDWR, DENY_WRITE, O_WRONLY, DENY_FCB, A_0}, 881{1, O_RDONLY, DENY_WRITE, O_RDWR, DENY_DOS, A_0}, 882{1, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_DOS, A_R}, 883{1, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_DOS, A_0}, 884{1, O_RDONLY, DENY_WRITE, O_RDWR, DENY_ALL, A_0}, 885{1, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_ALL, A_0}, 886{1, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_ALL, A_0}, 887{1, O_RDONLY, DENY_WRITE, O_RDWR, DENY_WRITE, A_0}, 888{1, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_WRITE, A_R}, 889{1, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_WRITE, A_0}, 890{1, O_RDONLY, DENY_WRITE, O_RDWR, DENY_READ, A_0}, 891{1, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_READ, A_0}, 892{1, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_READ, A_0}, 893{1, O_RDONLY, DENY_WRITE, O_RDWR, DENY_NONE, A_0}, 894{1, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_NONE, A_R}, 895{1, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_NONE, A_0}, 896{1, O_RDONLY, DENY_WRITE, O_RDWR, DENY_FCB, A_0}, 897{1, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_FCB, A_0}, 898{1, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_FCB, A_0}, 899{1, O_WRONLY, DENY_WRITE, O_RDWR, DENY_DOS, A_0}, 900{1, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_DOS, A_R}, 901{1, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_DOS, A_0}, 902{1, O_WRONLY, DENY_WRITE, O_RDWR, DENY_ALL, A_0}, 903{1, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_ALL, A_0}, 904{1, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_ALL, A_0}, 905{1, O_WRONLY, DENY_WRITE, O_RDWR, DENY_WRITE, A_0}, 906{1, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_WRITE, A_0}, 907{1, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_WRITE, A_0}, 908{1, O_WRONLY, DENY_WRITE, O_RDWR, DENY_READ, A_0}, 909{1, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_READ, A_R}, 910{1, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_READ, A_0}, 911{1, O_WRONLY, DENY_WRITE, O_RDWR, DENY_NONE, A_0}, 912{1, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_NONE, A_R}, 913{1, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_NONE, A_0}, 914{1, O_WRONLY, DENY_WRITE, O_RDWR, DENY_FCB, A_0}, 915{1, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_FCB, A_0}, 916{1, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_FCB, A_0}, 917{1, O_RDWR, DENY_READ, O_RDWR, DENY_DOS, A_0}, 918{1, O_RDWR, DENY_READ, O_RDONLY, DENY_DOS, A_0}, 919{1, O_RDWR, DENY_READ, O_WRONLY, DENY_DOS, A_W}, 920{1, O_RDWR, DENY_READ, O_RDWR, DENY_ALL, A_0}, 921{1, O_RDWR, DENY_READ, O_RDONLY, DENY_ALL, A_0}, 922{1, O_RDWR, DENY_READ, O_WRONLY, DENY_ALL, A_0}, 923{1, O_RDWR, DENY_READ, O_RDWR, DENY_WRITE, A_0}, 924{1, O_RDWR, DENY_READ, O_RDONLY, DENY_WRITE, A_0}, 925{1, O_RDWR, DENY_READ, O_WRONLY, DENY_WRITE, A_0}, 926{1, O_RDWR, DENY_READ, O_RDWR, DENY_READ, A_0}, 927{1, O_RDWR, DENY_READ, O_RDONLY, DENY_READ, A_0}, 928{1, O_RDWR, DENY_READ, O_WRONLY, DENY_READ, A_0}, 929{1, O_RDWR, DENY_READ, O_RDWR, DENY_NONE, A_0}, 930{1, O_RDWR, DENY_READ, O_RDONLY, DENY_NONE, A_0}, 931{1, O_RDWR, DENY_READ, O_WRONLY, DENY_NONE, A_W}, 932{1, O_RDWR, DENY_READ, O_RDWR, DENY_FCB, A_0}, 933{1, O_RDWR, DENY_READ, O_RDONLY, DENY_FCB, A_0}, 934{1, O_RDWR, DENY_READ, O_WRONLY, DENY_FCB, A_0}, 935{1, O_RDONLY, DENY_READ, O_RDWR, DENY_DOS, A_0}, 936{1, O_RDONLY, DENY_READ, O_RDONLY, DENY_DOS, A_0}, 937{1, O_RDONLY, DENY_READ, O_WRONLY, DENY_DOS, A_W}, 938{1, O_RDONLY, DENY_READ, O_RDWR, DENY_ALL, A_0}, 939{1, O_RDONLY, DENY_READ, O_RDONLY, DENY_ALL, A_0}, 940{1, O_RDONLY, DENY_READ, O_WRONLY, DENY_ALL, A_0}, 941{1, O_RDONLY, DENY_READ, O_RDWR, DENY_WRITE, A_0}, 942{1, O_RDONLY, DENY_READ, O_RDONLY, DENY_WRITE, A_0}, 943{1, O_RDONLY, DENY_READ, O_WRONLY, DENY_WRITE, A_W}, 944{1, O_RDONLY, DENY_READ, O_RDWR, DENY_READ, A_0}, 945{1, O_RDONLY, DENY_READ, O_RDONLY, DENY_READ, A_0}, 946{1, O_RDONLY, DENY_READ, O_WRONLY, DENY_READ, A_0}, 947{1, O_RDONLY, DENY_READ, O_RDWR, DENY_NONE, A_0}, 948{1, O_RDONLY, DENY_READ, O_RDONLY, DENY_NONE, A_0}, 949{1, O_RDONLY, DENY_READ, O_WRONLY, DENY_NONE, A_W}, 950{1, O_RDONLY, DENY_READ, O_RDWR, DENY_FCB, A_0}, 951{1, O_RDONLY, DENY_READ, O_RDONLY, DENY_FCB, A_0}, 952{1, O_RDONLY, DENY_READ, O_WRONLY, DENY_FCB, A_0}, 953{1, O_WRONLY, DENY_READ, O_RDWR, DENY_DOS, A_0}, 954{1, O_WRONLY, DENY_READ, O_RDONLY, DENY_DOS, A_0}, 955{1, O_WRONLY, DENY_READ, O_WRONLY, DENY_DOS, A_W}, 956{1, O_WRONLY, DENY_READ, O_RDWR, DENY_ALL, A_0}, 957{1, O_WRONLY, DENY_READ, O_RDONLY, DENY_ALL, A_0}, 958{1, O_WRONLY, DENY_READ, O_WRONLY, DENY_ALL, A_0}, 959{1, O_WRONLY, DENY_READ, O_RDWR, DENY_WRITE, A_0}, 960{1, O_WRONLY, DENY_READ, O_RDONLY, DENY_WRITE, A_0}, 961{1, O_WRONLY, DENY_READ, O_WRONLY, DENY_WRITE, A_0}, 962{1, O_WRONLY, DENY_READ, O_RDWR, DENY_READ, A_0}, 963{1, O_WRONLY, DENY_READ, O_RDONLY, DENY_READ, A_0}, 964{1, O_WRONLY, DENY_READ, O_WRONLY, DENY_READ, A_W}, 965{1, O_WRONLY, DENY_READ, O_RDWR, DENY_NONE, A_0}, 966{1, O_WRONLY, DENY_READ, O_RDONLY, DENY_NONE, A_0}, 967{1, O_WRONLY, DENY_READ, O_WRONLY, DENY_NONE, A_W}, 968{1, O_WRONLY, DENY_READ, O_RDWR, DENY_FCB, A_0}, 969{1, O_WRONLY, DENY_READ, O_RDONLY, DENY_FCB, A_0}, 970{1, O_WRONLY, DENY_READ, O_WRONLY, DENY_FCB, A_0}, 971{1, O_RDWR, DENY_NONE, O_RDWR, DENY_DOS, A_RW}, 972{1, O_RDWR, DENY_NONE, O_RDONLY, DENY_DOS, A_R}, 973{1, O_RDWR, DENY_NONE, O_WRONLY, DENY_DOS, A_W}, 974{1, O_RDWR, DENY_NONE, O_RDWR, DENY_ALL, A_0}, 975{1, O_RDWR, DENY_NONE, O_RDONLY, DENY_ALL, A_0}, 976{1, O_RDWR, DENY_NONE, O_WRONLY, DENY_ALL, A_0}, 977{1, O_RDWR, DENY_NONE, O_RDWR, DENY_WRITE, A_0}, 978{1, O_RDWR, DENY_NONE, O_RDONLY, DENY_WRITE, A_0}, 979{1, O_RDWR, DENY_NONE, O_WRONLY, DENY_WRITE, A_0}, 980{1, O_RDWR, DENY_NONE, O_RDWR, DENY_READ, A_0}, 981{1, O_RDWR, DENY_NONE, O_RDONLY, DENY_READ, A_0}, 982{1, O_RDWR, DENY_NONE, O_WRONLY, DENY_READ, A_0}, 983{1, O_RDWR, DENY_NONE, O_RDWR, DENY_NONE, A_RW}, 984{1, O_RDWR, DENY_NONE, O_RDONLY, DENY_NONE, A_R}, 985{1, O_RDWR, DENY_NONE, O_WRONLY, DENY_NONE, A_W}, 986{1, O_RDWR, DENY_NONE, O_RDWR, DENY_FCB, A_0}, 987{1, O_RDWR, DENY_NONE, O_RDONLY, DENY_FCB, A_0}, 988{1, O_RDWR, DENY_NONE, O_WRONLY, DENY_FCB, A_0}, 989{1, O_RDONLY, DENY_NONE, O_RDWR, DENY_DOS, A_RW}, 990{1, O_RDONLY, DENY_NONE, O_RDONLY, DENY_DOS, A_R}, 991{1, O_RDONLY, DENY_NONE, O_WRONLY, DENY_DOS, A_W}, 992{1, O_RDONLY, DENY_NONE, O_RDWR, DENY_ALL, A_0}, 993{1, O_RDONLY, DENY_NONE, O_RDONLY, DENY_ALL, A_0}, 994{1, O_RDONLY, DENY_NONE, O_WRONLY, DENY_ALL, A_0}, 995{1, O_RDONLY, DENY_NONE, O_RDWR, DENY_WRITE, A_RW}, 996{1, O_RDONLY, DENY_NONE, O_RDONLY, DENY_WRITE, A_R}, 997{1, O_RDONLY, DENY_NONE, O_WRONLY, DENY_WRITE, A_W}, 998{1, O_RDONLY, DENY_NONE, O_RDWR, DENY_READ, A_0}, 999{1, O_RDONLY, DENY_NONE, O_RDONLY, DENY_READ, A_0}, 1000{1, O_RDONLY, DENY_NONE, O_WRONLY, DENY_READ, A_0}, 1001{1, O_RDONLY, DENY_NONE, O_RDWR, DENY_NONE, A_RW}, 1002{1, O_RDONLY, DENY_NONE, O_RDONLY, DENY_NONE, A_R}, 1003{1, O_RDONLY, DENY_NONE, O_WRONLY, DENY_NONE, A_W}, 1004{1, O_RDONLY, DENY_NONE, O_RDWR, DENY_FCB, A_0}, 1005{1, O_RDONLY, DENY_NONE, O_RDONLY, DENY_FCB, A_0}, 1006{1, O_RDONLY, DENY_NONE, O_WRONLY, DENY_FCB, A_0}, 1007{1, O_WRONLY, DENY_NONE, O_RDWR, DENY_DOS, A_RW}, 1008{1, O_WRONLY, DENY_NONE, O_RDONLY, DENY_DOS, A_R}, 1009{1, O_WRONLY, DENY_NONE, O_WRONLY, DENY_DOS, A_W}, 1010{1, O_WRONLY, DENY_NONE, O_RDWR, DENY_ALL, A_0}, 1011{1, O_WRONLY, DENY_NONE, O_RDONLY, DENY_ALL, A_0}, 1012{1, O_WRONLY, DENY_NONE, O_WRONLY, DENY_ALL, A_0}, 1013{1, O_WRONLY, DENY_NONE, O_RDWR, DENY_WRITE, A_0}, 1014{1, O_WRONLY, DENY_NONE, O_RDONLY, DENY_WRITE, A_0}, 1015{1, O_WRONLY, DENY_NONE, O_WRONLY, DENY_WRITE, A_0}, 1016{1, O_WRONLY, DENY_NONE, O_RDWR, DENY_READ, A_RW}, 1017{1, O_WRONLY, DENY_NONE, O_RDONLY, DENY_READ, A_R}, 1018{1, O_WRONLY, DENY_NONE, O_WRONLY, DENY_READ, A_W}, 1019{1, O_WRONLY, DENY_NONE, O_RDWR, DENY_NONE, A_RW}, 1020{1, O_WRONLY, DENY_NONE, O_RDONLY, DENY_NONE, A_R}, 1021{1, O_WRONLY, DENY_NONE, O_WRONLY, DENY_NONE, A_W}, 1022{1, O_WRONLY, DENY_NONE, O_RDWR, DENY_FCB, A_0}, 1023{1, O_WRONLY, DENY_NONE, O_RDONLY, DENY_FCB, A_0}, 1024{1, O_WRONLY, DENY_NONE, O_WRONLY, DENY_FCB, A_0}, 1025{1, O_RDWR, DENY_FCB, O_RDWR, DENY_DOS, A_RW}, 1026{1, O_RDWR, DENY_FCB, O_RDONLY, DENY_DOS, A_R}, 1027{1, O_RDWR, DENY_FCB, O_WRONLY, DENY_DOS, A_W}, 1028{1, O_RDWR, DENY_FCB, O_RDWR, DENY_ALL, A_0}, 1029{1, O_RDWR, DENY_FCB, O_RDONLY, DENY_ALL, A_0}, 1030{1, O_RDWR, DENY_FCB, O_WRONLY, DENY_ALL, A_0}, 1031{1, O_RDWR, DENY_FCB, O_RDWR, DENY_WRITE, A_0}, 1032{1, O_RDWR, DENY_FCB, O_RDONLY, DENY_WRITE, A_0}, 1033{1, O_RDWR, DENY_FCB, O_WRONLY, DENY_WRITE, A_0}, 1034{1, O_RDWR, DENY_FCB, O_RDWR, DENY_READ, A_0}, 1035{1, O_RDWR, DENY_FCB, O_RDONLY, DENY_READ, A_0}, 1036{1, O_RDWR, DENY_FCB, O_WRONLY, DENY_READ, A_0}, 1037{1, O_RDWR, DENY_FCB, O_RDWR, DENY_NONE, A_0}, 1038{1, O_RDWR, DENY_FCB, O_RDONLY, DENY_NONE, A_0}, 1039{1, O_RDWR, DENY_FCB, O_WRONLY, DENY_NONE, A_0}, 1040{1, O_RDWR, DENY_FCB, O_RDWR, DENY_FCB, A_RW}, 1041{1, O_RDWR, DENY_FCB, O_RDONLY, DENY_FCB, A_RW}, 1042{1, O_RDWR, DENY_FCB, O_WRONLY, DENY_FCB, A_RW}, 1043{1, O_RDONLY, DENY_FCB, O_RDWR, DENY_DOS, A_RW}, 1044{1, O_RDONLY, DENY_FCB, O_RDONLY, DENY_DOS, A_R}, 1045{1, O_RDONLY, DENY_FCB, O_WRONLY, DENY_DOS, A_W}, 1046{1, O_RDONLY, DENY_FCB, O_RDWR, DENY_ALL, A_0}, 1047{1, O_RDONLY, DENY_FCB, O_RDONLY, DENY_ALL, A_0}, 1048{1, O_RDONLY, DENY_FCB, O_WRONLY, DENY_ALL, A_0}, 1049{1, O_RDONLY, DENY_FCB, O_RDWR, DENY_WRITE, A_0}, 1050{1, O_RDONLY, DENY_FCB, O_RDONLY, DENY_WRITE, A_0}, 1051{1, O_RDONLY, DENY_FCB, O_WRONLY, DENY_WRITE, A_0}, 1052{1, O_RDONLY, DENY_FCB, O_RDWR, DENY_READ, A_0}, 1053{1, O_RDONLY, DENY_FCB, O_RDONLY, DENY_READ, A_0}, 1054{1, O_RDONLY, DENY_FCB, O_WRONLY, DENY_READ, A_0}, 1055{1, O_RDONLY, DENY_FCB, O_RDWR, DENY_NONE, A_0}, 1056{1, O_RDONLY, DENY_FCB, O_RDONLY, DENY_NONE, A_0}, 1057{1, O_RDONLY, DENY_FCB, O_WRONLY, DENY_NONE, A_0}, 1058{1, O_RDONLY, DENY_FCB, O_RDWR, DENY_FCB, A_RW}, 1059{1, O_RDONLY, DENY_FCB, O_RDONLY, DENY_FCB, A_RW}, 1060{1, O_RDONLY, DENY_FCB, O_WRONLY, DENY_FCB, A_RW}, 1061{1, O_WRONLY, DENY_FCB, O_RDWR, DENY_DOS, A_RW}, 1062{1, O_WRONLY, DENY_FCB, O_RDONLY, DENY_DOS, A_R}, 1063{1, O_WRONLY, DENY_FCB, O_WRONLY, DENY_DOS, A_W}, 1064{1, O_WRONLY, DENY_FCB, O_RDWR, DENY_ALL, A_0}, 1065{1, O_WRONLY, DENY_FCB, O_RDONLY, DENY_ALL, A_0}, 1066{1, O_WRONLY, DENY_FCB, O_WRONLY, DENY_ALL, A_0}, 1067{1, O_WRONLY, DENY_FCB, O_RDWR, DENY_WRITE, A_0}, 1068{1, O_WRONLY, DENY_FCB, O_RDONLY, DENY_WRITE, A_0}, 1069{1, O_WRONLY, DENY_FCB, O_WRONLY, DENY_WRITE, A_0}, 1070{1, O_WRONLY, DENY_FCB, O_RDWR, DENY_READ, A_0}, 1071{1, O_WRONLY, DENY_FCB, O_RDONLY, DENY_READ, A_0}, 1072{1, O_WRONLY, DENY_FCB, O_WRONLY, DENY_READ, A_0}, 1073{1, O_WRONLY, DENY_FCB, O_RDWR, DENY_NONE, A_0}, 1074{1, O_WRONLY, DENY_FCB, O_RDONLY, DENY_NONE, A_0}, 1075{1, O_WRONLY, DENY_FCB, O_WRONLY, DENY_NONE, A_0}, 1076{1, O_WRONLY, DENY_FCB, O_RDWR, DENY_FCB, A_RW}, 1077{1, O_WRONLY, DENY_FCB, O_RDONLY, DENY_FCB, A_RW}, 1078{1, O_WRONLY, DENY_FCB, O_WRONLY, DENY_FCB, A_RW}, 1079{0, O_RDWR, DENY_DOS, O_RDWR, DENY_DOS, A_RW}, 1080{0, O_RDWR, DENY_DOS, O_RDONLY, DENY_DOS, A_R}, 1081{0, O_RDWR, DENY_DOS, O_WRONLY, DENY_DOS, A_W}, 1082{0, O_RDWR, DENY_DOS, O_RDWR, DENY_ALL, A_0}, 1083{0, O_RDWR, DENY_DOS, O_RDONLY, DENY_ALL, A_0}, 1084{0, O_RDWR, DENY_DOS, O_WRONLY, DENY_ALL, A_0}, 1085{0, O_RDWR, DENY_DOS, O_RDWR, DENY_WRITE, A_0}, 1086{0, O_RDWR, DENY_DOS, O_RDONLY, DENY_WRITE, A_0}, 1087{0, O_RDWR, DENY_DOS, O_WRONLY, DENY_WRITE, A_0}, 1088{0, O_RDWR, DENY_DOS, O_RDWR, DENY_READ, A_0}, 1089{0, O_RDWR, DENY_DOS, O_RDONLY, DENY_READ, A_0}, 1090{0, O_RDWR, DENY_DOS, O_WRONLY, DENY_READ, A_0}, 1091{0, O_RDWR, DENY_DOS, O_RDWR, DENY_NONE, A_0}, 1092{0, O_RDWR, DENY_DOS, O_RDONLY, DENY_NONE, A_0}, 1093{0, O_RDWR, DENY_DOS, O_WRONLY, DENY_NONE, A_0}, 1094{0, O_RDWR, DENY_DOS, O_RDWR, DENY_FCB, A_RW}, 1095{0, O_RDWR, DENY_DOS, O_RDONLY, DENY_FCB, A_RW}, 1096{0, O_RDWR, DENY_DOS, O_WRONLY, DENY_FCB, A_RW}, 1097{0, O_RDONLY, DENY_DOS, O_RDWR, DENY_DOS, A_0}, 1098{0, O_RDONLY, DENY_DOS, O_RDONLY, DENY_DOS, A_R}, 1099{0, O_RDONLY, DENY_DOS, O_WRONLY, DENY_DOS, A_0}, 1100{0, O_RDONLY, DENY_DOS, O_RDWR, DENY_ALL, A_0}, 1101{0, O_RDONLY, DENY_DOS, O_RDONLY, DENY_ALL, A_0}, 1102{0, O_RDONLY, DENY_DOS, O_WRONLY, DENY_ALL, A_0}, 1103{0, O_RDONLY, DENY_DOS, O_RDWR, DENY_WRITE, A_0}, 1104{0, O_RDONLY, DENY_DOS, O_RDONLY, DENY_WRITE, A_R}, 1105{0, O_RDONLY, DENY_DOS, O_WRONLY, DENY_WRITE, A_0}, 1106{0, O_RDONLY, DENY_DOS, O_RDWR, DENY_READ, A_0}, 1107{0, O_RDONLY, DENY_DOS, O_RDONLY, DENY_READ, A_0}, 1108{0, O_RDONLY, DENY_DOS, O_WRONLY, DENY_READ, A_0}, 1109{0, O_RDONLY, DENY_DOS, O_RDWR, DENY_NONE, A_0}, 1110{0, O_RDONLY, DENY_DOS, O_RDONLY, DENY_NONE, A_R}, 1111{0, O_RDONLY, DENY_DOS, O_WRONLY, DENY_NONE, A_0}, 1112{0, O_RDONLY, DENY_DOS, O_RDWR, DENY_FCB, A_0}, 1113{0, O_RDONLY, DENY_DOS, O_RDONLY, DENY_FCB, A_0}, 1114{0, O_RDONLY, DENY_DOS, O_WRONLY, DENY_FCB, A_0}, 1115{0, O_WRONLY, DENY_DOS, O_RDWR, DENY_DOS, A_RW}, 1116{0, O_WRONLY, DENY_DOS, O_RDONLY, DENY_DOS, A_R}, 1117{0, O_WRONLY, DENY_DOS, O_WRONLY, DENY_DOS, A_W}, 1118{0, O_WRONLY, DENY_DOS, O_RDWR, DENY_ALL, A_0}, 1119{0, O_WRONLY, DENY_DOS, O_RDONLY, DENY_ALL, A_0}, 1120{0, O_WRONLY, DENY_DOS, O_WRONLY, DENY_ALL, A_0}, 1121{0, O_WRONLY, DENY_DOS, O_RDWR, DENY_WRITE, A_0}, 1122{0, O_WRONLY, DENY_DOS, O_RDONLY, DENY_WRITE, A_0}, 1123{0, O_WRONLY, DENY_DOS, O_WRONLY, DENY_WRITE, A_0}, 1124{0, O_WRONLY, DENY_DOS, O_RDWR, DENY_READ, A_0}, 1125{0, O_WRONLY, DENY_DOS, O_RDONLY, DENY_READ, A_0}, 1126{0, O_WRONLY, DENY_DOS, O_WRONLY, DENY_READ, A_0}, 1127{0, O_WRONLY, DENY_DOS, O_RDWR, DENY_NONE, A_0}, 1128{0, O_WRONLY, DENY_DOS, O_RDONLY, DENY_NONE, A_0}, 1129{0, O_WRONLY, DENY_DOS, O_WRONLY, DENY_NONE, A_0}, 1130{0, O_WRONLY, DENY_DOS, O_RDWR, DENY_FCB, A_RW}, 1131{0, O_WRONLY, DENY_DOS, O_RDONLY, DENY_FCB, A_RW}, 1132{0, O_WRONLY, DENY_DOS, O_WRONLY, DENY_FCB, A_RW}, 1133{0, O_RDWR, DENY_ALL, O_RDWR, DENY_DOS, A_0}, 1134{0, O_RDWR, DENY_ALL, O_RDONLY, DENY_DOS, A_0}, 1135{0, O_RDWR, DENY_ALL, O_WRONLY, DENY_DOS, A_0}, 1136{0, O_RDWR, DENY_ALL, O_RDWR, DENY_ALL, A_0}, 1137{0, O_RDWR, DENY_ALL, O_RDONLY, DENY_ALL, A_0}, 1138{0, O_RDWR, DENY_ALL, O_WRONLY, DENY_ALL, A_0}, 1139{0, O_RDWR, DENY_ALL, O_RDWR, DENY_WRITE, A_0}, 1140{0, O_RDWR, DENY_ALL, O_RDONLY, DENY_WRITE, A_0}, 1141{0, O_RDWR, DENY_ALL, O_WRONLY, DENY_WRITE, A_0}, 1142{0, O_RDWR, DENY_ALL, O_RDWR, DENY_READ, A_0}, 1143{0, O_RDWR, DENY_ALL, O_RDONLY, DENY_READ, A_0}, 1144{0, O_RDWR, DENY_ALL, O_WRONLY, DENY_READ, A_0}, 1145{0, O_RDWR, DENY_ALL, O_RDWR, DENY_NONE, A_0}, 1146{0, O_RDWR, DENY_ALL, O_RDONLY, DENY_NONE, A_0}, 1147{0, O_RDWR, DENY_ALL, O_WRONLY, DENY_NONE, A_0}, 1148{0, O_RDWR, DENY_ALL, O_RDWR, DENY_FCB, A_0}, 1149{0, O_RDWR, DENY_ALL, O_RDONLY, DENY_FCB, A_0}, 1150{0, O_RDWR, DENY_ALL, O_WRONLY, DENY_FCB, A_0}, 1151{0, O_RDONLY, DENY_ALL, O_RDWR, DENY_DOS, A_0}, 1152{0, O_RDONLY, DENY_ALL, O_RDONLY, DENY_DOS, A_0}, 1153{0, O_RDONLY, DENY_ALL, O_WRONLY, DENY_DOS, A_0}, 1154{0, O_RDONLY, DENY_ALL, O_RDWR, DENY_ALL, A_0}, 1155{0, O_RDONLY, DENY_ALL, O_RDONLY, DENY_ALL, A_0}, 1156{0, O_RDONLY, DENY_ALL, O_WRONLY, DENY_ALL, A_0}, 1157{0, O_RDONLY, DENY_ALL, O_RDWR, DENY_WRITE, A_0}, 1158{0, O_RDONLY, DENY_ALL, O_RDONLY, DENY_WRITE, A_0}, 1159{0, O_RDONLY, DENY_ALL, O_WRONLY, DENY_WRITE, A_0}, 1160{0, O_RDONLY, DENY_ALL, O_RDWR, DENY_READ, A_0}, 1161{0, O_RDONLY, DENY_ALL, O_RDONLY, DENY_READ, A_0}, 1162{0, O_RDONLY, DENY_ALL, O_WRONLY, DENY_READ, A_0}, 1163{0, O_RDONLY, DENY_ALL, O_RDWR, DENY_NONE, A_0}, 1164{0, O_RDONLY, DENY_ALL, O_RDONLY, DENY_NONE, A_0}, 1165{0, O_RDONLY, DENY_ALL, O_WRONLY, DENY_NONE, A_0}, 1166{0, O_RDONLY, DENY_ALL, O_RDWR, DENY_FCB, A_0}, 1167{0, O_RDONLY, DENY_ALL, O_RDONLY, DENY_FCB, A_0}, 1168{0, O_RDONLY, DENY_ALL, O_WRONLY, DENY_FCB, A_0}, 1169{0, O_WRONLY, DENY_ALL, O_RDWR, DENY_DOS, A_0}, 1170{0, O_WRONLY, DENY_ALL, O_RDONLY, DENY_DOS, A_0}, 1171{0, O_WRONLY, DENY_ALL, O_WRONLY, DENY_DOS, A_0}, 1172{0, O_WRONLY, DENY_ALL, O_RDWR, DENY_ALL, A_0}, 1173{0, O_WRONLY, DENY_ALL, O_RDONLY, DENY_ALL, A_0}, 1174{0, O_WRONLY, DENY_ALL, O_WRONLY, DENY_ALL, A_0}, 1175{0, O_WRONLY, DENY_ALL, O_RDWR, DENY_WRITE, A_0}, 1176{0, O_WRONLY, DENY_ALL, O_RDONLY, DENY_WRITE, A_0}, 1177{0, O_WRONLY, DENY_ALL, O_WRONLY, DENY_WRITE, A_0}, 1178{0, O_WRONLY, DENY_ALL, O_RDWR, DENY_READ, A_0}, 1179{0, O_WRONLY, DENY_ALL, O_RDONLY, DENY_READ, A_0}, 1180{0, O_WRONLY, DENY_ALL, O_WRONLY, DENY_READ, A_0}, 1181{0, O_WRONLY, DENY_ALL, O_RDWR, DENY_NONE, A_0}, 1182{0, O_WRONLY, DENY_ALL, O_RDONLY, DENY_NONE, A_0}, 1183{0, O_WRONLY, DENY_ALL, O_WRONLY, DENY_NONE, A_0}, 1184{0, O_WRONLY, DENY_ALL, O_RDWR, DENY_FCB, A_0}, 1185{0, O_WRONLY, DENY_ALL, O_RDONLY, DENY_FCB, A_0}, 1186{0, O_WRONLY, DENY_ALL, O_WRONLY, DENY_FCB, A_0}, 1187{0, O_RDWR, DENY_WRITE, O_RDWR, DENY_DOS, A_0}, 1188{0, O_RDWR, DENY_WRITE, O_RDONLY, DENY_DOS, A_0}, 1189{0, O_RDWR, DENY_WRITE, O_WRONLY, DENY_DOS, A_0}, 1190{0, O_RDWR, DENY_WRITE, O_RDWR, DENY_ALL, A_0}, 1191{0, O_RDWR, DENY_WRITE, O_RDONLY, DENY_ALL, A_0}, 1192{0, O_RDWR, DENY_WRITE, O_WRONLY, DENY_ALL, A_0}, 1193{0, O_RDWR, DENY_WRITE, O_RDWR, DENY_WRITE, A_0}, 1194{0, O_RDWR, DENY_WRITE, O_RDONLY, DENY_WRITE, A_0}, 1195{0, O_RDWR, DENY_WRITE, O_WRONLY, DENY_WRITE, A_0}, 1196{0, O_RDWR, DENY_WRITE, O_RDWR, DENY_READ, A_0}, 1197{0, O_RDWR, DENY_WRITE, O_RDONLY, DENY_READ, A_0}, 1198{0, O_RDWR, DENY_WRITE, O_WRONLY, DENY_READ, A_0}, 1199{0, O_RDWR, DENY_WRITE, O_RDWR, DENY_NONE, A_0}, 1200{0, O_RDWR, DENY_WRITE, O_RDONLY, DENY_NONE, A_R}, 1201{0, O_RDWR, DENY_WRITE, O_WRONLY, DENY_NONE, A_0}, 1202{0, O_RDWR, DENY_WRITE, O_RDWR, DENY_FCB, A_0}, 1203{0, O_RDWR, DENY_WRITE, O_RDONLY, DENY_FCB, A_0}, 1204{0, O_RDWR, DENY_WRITE, O_WRONLY, DENY_FCB, A_0}, 1205{0, O_RDONLY, DENY_WRITE, O_RDWR, DENY_DOS, A_0}, 1206{0, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_DOS, A_R}, 1207{0, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_DOS, A_0}, 1208{0, O_RDONLY, DENY_WRITE, O_RDWR, DENY_ALL, A_0}, 1209{0, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_ALL, A_0}, 1210{0, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_ALL, A_0}, 1211{0, O_RDONLY, DENY_WRITE, O_RDWR, DENY_WRITE, A_0}, 1212{0, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_WRITE, A_R}, 1213{0, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_WRITE, A_0}, 1214{0, O_RDONLY, DENY_WRITE, O_RDWR, DENY_READ, A_0}, 1215{0, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_READ, A_0}, 1216{0, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_READ, A_0}, 1217{0, O_RDONLY, DENY_WRITE, O_RDWR, DENY_NONE, A_0}, 1218{0, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_NONE, A_R}, 1219{0, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_NONE, A_0}, 1220{0, O_RDONLY, DENY_WRITE, O_RDWR, DENY_FCB, A_0}, 1221{0, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_FCB, A_0}, 1222{0, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_FCB, A_0}, 1223{0, O_WRONLY, DENY_WRITE, O_RDWR, DENY_DOS, A_0}, 1224{0, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_DOS, A_0}, 1225{0, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_DOS, A_0}, 1226{0, O_WRONLY, DENY_WRITE, O_RDWR, DENY_ALL, A_0}, 1227{0, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_ALL, A_0}, 1228{0, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_ALL, A_0}, 1229{0, O_WRONLY, DENY_WRITE, O_RDWR, DENY_WRITE, A_0}, 1230{0, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_WRITE, A_0}, 1231{0, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_WRITE, A_0}, 1232{0, O_WRONLY, DENY_WRITE, O_RDWR, DENY_READ, A_0}, 1233{0, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_READ, A_R}, 1234{0, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_READ, A_0}, 1235{0, O_WRONLY, DENY_WRITE, O_RDWR, DENY_NONE, A_0}, 1236{0, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_NONE, A_R}, 1237{0, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_NONE, A_0}, 1238{0, O_WRONLY, DENY_WRITE, O_RDWR, DENY_FCB, A_0}, 1239{0, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_FCB, A_0}, 1240{0, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_FCB, A_0}, 1241{0, O_RDWR, DENY_READ, O_RDWR, DENY_DOS, A_0}, 1242{0, O_RDWR, DENY_READ, O_RDONLY, DENY_DOS, A_0}, 1243{0, O_RDWR, DENY_READ, O_WRONLY, DENY_DOS, A_0}, 1244{0, O_RDWR, DENY_READ, O_RDWR, DENY_ALL, A_0}, 1245{0, O_RDWR, DENY_READ, O_RDONLY, DENY_ALL, A_0}, 1246{0, O_RDWR, DENY_READ, O_WRONLY, DENY_ALL, A_0}, 1247{0, O_RDWR, DENY_READ, O_RDWR, DENY_WRITE, A_0}, 1248{0, O_RDWR, DENY_READ, O_RDONLY, DENY_WRITE, A_0}, 1249{0, O_RDWR, DENY_READ, O_WRONLY, DENY_WRITE, A_0}, 1250{0, O_RDWR, DENY_READ, O_RDWR, DENY_READ, A_0}, 1251{0, O_RDWR, DENY_READ, O_RDONLY, DENY_READ, A_0}, 1252{0, O_RDWR, DENY_READ, O_WRONLY, DENY_READ, A_0}, 1253{0, O_RDWR, DENY_READ, O_RDWR, DENY_NONE, A_0}, 1254{0, O_RDWR, DENY_READ, O_RDONLY, DENY_NONE, A_0}, 1255{0, O_RDWR, DENY_READ, O_WRONLY, DENY_NONE, A_W}, 1256{0, O_RDWR, DENY_READ, O_RDWR, DENY_FCB, A_0}, 1257{0, O_RDWR, DENY_READ, O_RDONLY, DENY_FCB, A_0}, 1258{0, O_RDWR, DENY_READ, O_WRONLY, DENY_FCB, A_0}, 1259{0, O_RDONLY, DENY_READ, O_RDWR, DENY_DOS, A_0}, 1260{0, O_RDONLY, DENY_READ, O_RDONLY, DENY_DOS, A_0}, 1261{0, O_RDONLY, DENY_READ, O_WRONLY, DENY_DOS, A_0}, 1262{0, O_RDONLY, DENY_READ, O_RDWR, DENY_ALL, A_0}, 1263{0, O_RDONLY, DENY_READ, O_RDONLY, DENY_ALL, A_0}, 1264{0, O_RDONLY, DENY_READ, O_WRONLY, DENY_ALL, A_0}, 1265{0, O_RDONLY, DENY_READ, O_RDWR, DENY_WRITE, A_0}, 1266{0, O_RDONLY, DENY_READ, O_RDONLY, DENY_WRITE, A_0}, 1267{0, O_RDONLY, DENY_READ, O_WRONLY, DENY_WRITE, A_W}, 1268{0, O_RDONLY, DENY_READ, O_RDWR, DENY_READ, A_0}, 1269{0, O_RDONLY, DENY_READ, O_RDONLY, DENY_READ, A_0}, 1270{0, O_RDONLY, DENY_READ, O_WRONLY, DENY_READ, A_0}, 1271{0, O_RDONLY, DENY_READ, O_RDWR, DENY_NONE, A_0}, 1272{0, O_RDONLY, DENY_READ, O_RDONLY, DENY_NONE, A_0}, 1273{0, O_RDONLY, DENY_READ, O_WRONLY, DENY_NONE, A_W}, 1274{0, O_RDONLY, DENY_READ, O_RDWR, DENY_FCB, A_0}, 1275{0, O_RDONLY, DENY_READ, O_RDONLY, DENY_FCB, A_0}, 1276{0, O_RDONLY, DENY_READ, O_WRONLY, DENY_FCB, A_0}, 1277{0, O_WRONLY, DENY_READ, O_RDWR, DENY_DOS, A_0}, 1278{0, O_WRONLY, DENY_READ, O_RDONLY, DENY_DOS, A_0}, 1279{0, O_WRONLY, DENY_READ, O_WRONLY, DENY_DOS, A_0}, 1280{0, O_WRONLY, DENY_READ, O_RDWR, DENY_ALL, A_0}, 1281{0, O_WRONLY, DENY_READ, O_RDONLY, DENY_ALL, A_0}, 1282{0, O_WRONLY, DENY_READ, O_WRONLY, DENY_ALL, A_0}, 1283{0, O_WRONLY, DENY_READ, O_RDWR, DENY_WRITE, A_0}, 1284{0, O_WRONLY, DENY_READ, O_RDONLY, DENY_WRITE, A_0}, 1285{0, O_WRONLY, DENY_READ, O_WRONLY, DENY_WRITE, A_0}, 1286{0, O_WRONLY, DENY_READ, O_RDWR, DENY_READ, A_0}, 1287{0, O_WRONLY, DENY_READ, O_RDONLY, DENY_READ, A_0}, 1288{0, O_WRONLY, DENY_READ, O_WRONLY, DENY_READ, A_W}, 1289{0, O_WRONLY, DENY_READ, O_RDWR, DENY_NONE, A_0}, 1290{0, O_WRONLY, DENY_READ, O_RDONLY, DENY_NONE, A_0}, 1291{0, O_WRONLY, DENY_READ, O_WRONLY, DENY_NONE, A_W}, 1292{0, O_WRONLY, DENY_READ, O_RDWR, DENY_FCB, A_0}, 1293{0, O_WRONLY, DENY_READ, O_RDONLY, DENY_FCB, A_0}, 1294{0, O_WRONLY, DENY_READ, O_WRONLY, DENY_FCB, A_0}, 1295{0, O_RDWR, DENY_NONE, O_RDWR, DENY_DOS, A_0}, 1296{0, O_RDWR, DENY_NONE, O_RDONLY, DENY_DOS, A_0}, 1297{0, O_RDWR, DENY_NONE, O_WRONLY, DENY_DOS, A_0}, 1298{0, O_RDWR, DENY_NONE, O_RDWR, DENY_ALL, A_0}, 1299{0, O_RDWR, DENY_NONE, O_RDONLY, DENY_ALL, A_0}, 1300{0, O_RDWR, DENY_NONE, O_WRONLY, DENY_ALL, A_0}, 1301{0, O_RDWR, DENY_NONE, O_RDWR, DENY_WRITE, A_0}, 1302{0, O_RDWR, DENY_NONE, O_RDONLY, DENY_WRITE, A_0}, 1303{0, O_RDWR, DENY_NONE, O_WRONLY, DENY_WRITE, A_0}, 1304{0, O_RDWR, DENY_NONE, O_RDWR, DENY_READ, A_0}, 1305{0, O_RDWR, DENY_NONE, O_RDONLY, DENY_READ, A_0}, 1306{0, O_RDWR, DENY_NONE, O_WRONLY, DENY_READ, A_0}, 1307{0, O_RDWR, DENY_NONE, O_RDWR, DENY_NONE, A_RW}, 1308{0, O_RDWR, DENY_NONE, O_RDONLY, DENY_NONE, A_R}, 1309{0, O_RDWR, DENY_NONE, O_WRONLY, DENY_NONE, A_W}, 1310{0, O_RDWR, DENY_NONE, O_RDWR, DENY_FCB, A_0}, 1311{0, O_RDWR, DENY_NONE, O_RDONLY, DENY_FCB, A_0}, 1312{0, O_RDWR, DENY_NONE, O_WRONLY, DENY_FCB, A_0}, 1313{0, O_RDONLY, DENY_NONE, O_RDWR, DENY_DOS, A_0}, 1314{0, O_RDONLY, DENY_NONE, O_RDONLY, DENY_DOS, A_R}, 1315{0, O_RDONLY, DENY_NONE, O_WRONLY, DENY_DOS, A_0}, 1316{0, O_RDONLY, DENY_NONE, O_RDWR, DENY_ALL, A_0}, 1317{0, O_RDONLY, DENY_NONE, O_RDONLY, DENY_ALL, A_0}, 1318{0, O_RDONLY, DENY_NONE, O_WRONLY, DENY_ALL, A_0}, 1319{0, O_RDONLY, DENY_NONE, O_RDWR, DENY_WRITE, A_RW}, 1320{0, O_RDONLY, DENY_NONE, O_RDONLY, DENY_WRITE, A_R}, 1321{0, O_RDONLY, DENY_NONE, O_WRONLY, DENY_WRITE, A_W}, 1322{0, O_RDONLY, DENY_NONE, O_RDWR, DENY_READ, A_0}, 1323{0, O_RDONLY, DENY_NONE, O_RDONLY, DENY_READ, A_0}, 1324{0, O_RDONLY, DENY_NONE, O_WRONLY, DENY_READ, A_0}, 1325{0, O_RDONLY, DENY_NONE, O_RDWR, DENY_NONE, A_RW}, 1326{0, O_RDONLY, DENY_NONE, O_RDONLY, DENY_NONE, A_R}, 1327{0, O_RDONLY, DENY_NONE, O_WRONLY, DENY_NONE, A_W}, 1328{0, O_RDONLY, DENY_NONE, O_RDWR, DENY_FCB, A_0}, 1329{0, O_RDONLY, DENY_NONE, O_RDONLY, DENY_FCB, A_0}, 1330{0, O_RDONLY, DENY_NONE, O_WRONLY, DENY_FCB, A_0}, 1331{0, O_WRONLY, DENY_NONE, O_RDWR, DENY_DOS, A_0}, 1332{0, O_WRONLY, DENY_NONE, O_RDONLY, DENY_DOS, A_0}, 1333{0, O_WRONLY, DENY_NONE, O_WRONLY, DENY_DOS, A_0}, 1334{0, O_WRONLY, DENY_NONE, O_RDWR, DENY_ALL, A_0}, 1335{0, O_WRONLY, DENY_NONE, O_RDONLY, DENY_ALL, A_0}, 1336{0, O_WRONLY, DENY_NONE, O_WRONLY, DENY_ALL, A_0}, 1337{0, O_WRONLY, DENY_NONE, O_RDWR, DENY_WRITE, A_0}, 1338{0, O_WRONLY, DENY_NONE, O_RDONLY, DENY_WRITE, A_0}, 1339{0, O_WRONLY, DENY_NONE, O_WRONLY, DENY_WRITE, A_0}, 1340{0, O_WRONLY, DENY_NONE, O_RDWR, DENY_READ, A_RW}, 1341{0, O_WRONLY, DENY_NONE, O_RDONLY, DENY_READ, A_R}, 1342{0, O_WRONLY, DENY_NONE, O_WRONLY, DENY_READ, A_W}, 1343{0, O_WRONLY, DENY_NONE, O_RDWR, DENY_NONE, A_RW}, 1344{0, O_WRONLY, DENY_NONE, O_RDONLY, DENY_NONE, A_R}, 1345{0, O_WRONLY, DENY_NONE, O_WRONLY, DENY_NONE, A_W}, 1346{0, O_WRONLY, DENY_NONE, O_RDWR, DENY_FCB, A_0}, 1347{0, O_WRONLY, DENY_NONE, O_RDONLY, DENY_FCB, A_0}, 1348{0, O_WRONLY, DENY_NONE, O_WRONLY, DENY_FCB, A_0}, 1349{0, O_RDWR, DENY_FCB, O_RDWR, DENY_DOS, A_RW}, 1350{0, O_RDWR, DENY_FCB, O_RDONLY, DENY_DOS, A_R}, 1351{0, O_RDWR, DENY_FCB, O_WRONLY, DENY_DOS, A_W}, 1352{0, O_RDWR, DENY_FCB, O_RDWR, DENY_ALL, A_0}, 1353{0, O_RDWR, DENY_FCB, O_RDONLY, DENY_ALL, A_0}, 1354{0, O_RDWR, DENY_FCB, O_WRONLY, DENY_ALL, A_0}, 1355{0, O_RDWR, DENY_FCB, O_RDWR, DENY_WRITE, A_0}, 1356{0, O_RDWR, DENY_FCB, O_RDONLY, DENY_WRITE, A_0}, 1357{0, O_RDWR, DENY_FCB, O_WRONLY, DENY_WRITE, A_0}, 1358{0, O_RDWR, DENY_FCB, O_RDWR, DENY_READ, A_0}, 1359{0, O_RDWR, DENY_FCB, O_RDONLY, DENY_READ, A_0}, 1360{0, O_RDWR, DENY_FCB, O_WRONLY, DENY_READ, A_0}, 1361{0, O_RDWR, DENY_FCB, O_RDWR, DENY_NONE, A_0}, 1362{0, O_RDWR, DENY_FCB, O_RDONLY, DENY_NONE, A_0}, 1363{0, O_RDWR, DENY_FCB, O_WRONLY, DENY_NONE, A_0}, 1364{0, O_RDWR, DENY_FCB, O_RDWR, DENY_FCB, A_RW}, 1365{0, O_RDWR, DENY_FCB, O_RDONLY, DENY_FCB, A_RW}, 1366{0, O_RDWR, DENY_FCB, O_WRONLY, DENY_FCB, A_RW}, 1367{0, O_RDONLY, DENY_FCB, O_RDWR, DENY_DOS, A_RW}, 1368{0, O_RDONLY, DENY_FCB, O_RDONLY, DENY_DOS, A_R}, 1369{0, O_RDONLY, DENY_FCB, O_WRONLY, DENY_DOS, A_W}, 1370{0, O_RDONLY, DENY_FCB, O_RDWR, DENY_ALL, A_0}, 1371{0, O_RDONLY, DENY_FCB, O_RDONLY, DENY_ALL, A_0}, 1372{0, O_RDONLY, DENY_FCB, O_WRONLY, DENY_ALL, A_0}, 1373{0, O_RDONLY, DENY_FCB, O_RDWR, DENY_WRITE, A_0}, 1374{0, O_RDONLY, DENY_FCB, O_RDONLY, DENY_WRITE, A_0}, 1375{0, O_RDONLY, DENY_FCB, O_WRONLY, DENY_WRITE, A_0}, 1376{0, O_RDONLY, DENY_FCB, O_RDWR, DENY_READ, A_0}, 1377{0, O_RDONLY, DENY_FCB, O_RDONLY, DENY_READ, A_0}, 1378{0, O_RDONLY, DENY_FCB, O_WRONLY, DENY_READ, A_0}, 1379{0, O_RDONLY, DENY_FCB, O_RDWR, DENY_NONE, A_0}, 1380{0, O_RDONLY, DENY_FCB, O_RDONLY, DENY_NONE, A_0}, 1381{0, O_RDONLY, DENY_FCB, O_WRONLY, DENY_NONE, A_0}, 1382{0, O_RDONLY, DENY_FCB, O_RDWR, DENY_FCB, A_RW}, 1383{0, O_RDONLY, DENY_FCB, O_RDONLY, DENY_FCB, A_RW}, 1384{0, O_RDONLY, DENY_FCB, O_WRONLY, DENY_FCB, A_RW}, 1385{0, O_WRONLY, DENY_FCB, O_RDWR, DENY_DOS, A_RW}, 1386{0, O_WRONLY, DENY_FCB, O_RDONLY, DENY_DOS, A_R}, 1387{0, O_WRONLY, DENY_FCB, O_WRONLY, DENY_DOS, A_W}, 1388{0, O_WRONLY, DENY_FCB, O_RDWR, DENY_ALL, A_0}, 1389{0, O_WRONLY, DENY_FCB, O_RDONLY, DENY_ALL, A_0}, 1390{0, O_WRONLY, DENY_FCB, O_WRONLY, DENY_ALL, A_0}, 1391{0, O_WRONLY, DENY_FCB, O_RDWR, DENY_WRITE, A_0}, 1392{0, O_WRONLY, DENY_FCB, O_RDONLY, DENY_WRITE, A_0}, 1393{0, O_WRONLY, DENY_FCB, O_WRONLY, DENY_WRITE, A_0}, 1394{0, O_WRONLY, DENY_FCB, O_RDWR, DENY_READ, A_0}, 1395{0, O_WRONLY, DENY_FCB, O_RDONLY, DENY_READ, A_0}, 1396{0, O_WRONLY, DENY_FCB, O_WRONLY, DENY_READ, A_0}, 1397{0, O_WRONLY, DENY_FCB, O_RDWR, DENY_NONE, A_0}, 1398{0, O_WRONLY, DENY_FCB, O_RDONLY, DENY_NONE, A_0}, 1399{0, O_WRONLY, DENY_FCB, O_WRONLY, DENY_NONE, A_0}, 1400{0, O_WRONLY, DENY_FCB, O_RDWR, DENY_FCB, A_RW}, 1401{0, O_WRONLY, DENY_FCB, O_RDONLY, DENY_FCB, A_RW}, 1402{0, O_WRONLY, DENY_FCB, O_WRONLY, DENY_FCB, A_RW} 1403}; 1404 1405 1406static void progress_bar(struct torture_context *tctx, uint_t i, uint_t total) 1407{ 1408 if (torture_setting_bool(tctx, "progress", true)) { 1409 torture_comment(tctx, "%5d/%5d\r", i, total); 1410 fflush(stdout); 1411 } 1412} 1413 1414/* 1415 this produces a matrix of deny mode behaviour for 1 connection 1416 */ 1417bool torture_denytest1(struct torture_context *tctx, 1418 struct smbcli_state *cli1) 1419{ 1420 int fnum1, fnum2; 1421 int i; 1422 bool correct = true; 1423 struct timeval tv, tv_start; 1424 const char *fnames[2] = {"\\denytest1.dat", "\\denytest1.exe"}; 1425 int failures=0; 1426 1427 torture_comment(tctx, "Testing deny modes with 1 connection\n"); 1428 1429 for (i=0;i<2;i++) { 1430 smbcli_unlink(cli1->tree, fnames[i]); 1431 fnum1 = smbcli_open(cli1->tree, fnames[i], O_RDWR|O_CREAT, DENY_NONE); 1432 smbcli_write(cli1->tree, fnum1, 0, fnames[i], 0, strlen(fnames[i])); 1433 smbcli_close(cli1->tree, fnum1); 1434 } 1435 1436 torture_comment(tctx, "testing %d entries\n", (int)ARRAY_SIZE(denytable1)); 1437 1438 GetTimeOfDay(&tv_start); 1439 1440 for (i=0; i<ARRAY_SIZE(denytable1); i++) { 1441 enum deny_result res; 1442 const char *fname = fnames[denytable1[i].isexe]; 1443 1444 progress_bar(tctx, i, ARRAY_SIZE(denytable1)); 1445 1446 fnum1 = smbcli_open(cli1->tree, fname, 1447 denytable1[i].mode1, 1448 denytable1[i].deny1); 1449 fnum2 = smbcli_open(cli1->tree, fname, 1450 denytable1[i].mode2, 1451 denytable1[i].deny2); 1452 1453 if (fnum1 == -1) { 1454 res = A_X; 1455 } else if (fnum2 == -1) { 1456 res = A_0; 1457 } else { 1458 uint8_t x = 1; 1459 res = A_0; 1460 if (smbcli_read(cli1->tree, fnum2, &x, 0, 1) == 1) { 1461 res += A_R; 1462 } 1463 if (smbcli_write(cli1->tree, fnum2, 0, &x, 0, 1) == 1) { 1464 res += A_W; 1465 } 1466 } 1467 1468 if (torture_setting_bool(tctx, "showall", false) || 1469 res != denytable1[i].result) { 1470 int64_t tdif; 1471 GetTimeOfDay(&tv); 1472 tdif = usec_time_diff(&tv, &tv_start); 1473 tdif /= 1000; 1474 torture_comment(tctx, "%lld: %s %8s %10s %8s %10s %s (correct=%s)\n", 1475 (long long)tdif, 1476 fname, 1477 denystr(denytable1[i].deny1), 1478 openstr(denytable1[i].mode1), 1479 denystr(denytable1[i].deny2), 1480 openstr(denytable1[i].mode2), 1481 resultstr(res), 1482 resultstr(denytable1[i].result)); 1483 } 1484 1485 if (res != denytable1[i].result) { 1486 correct = false; 1487 CHECK_MAX_FAILURES(failed); 1488 } 1489 1490 smbcli_close(cli1->tree, fnum1); 1491 smbcli_close(cli1->tree, fnum2); 1492 } 1493 1494failed: 1495 for (i=0;i<2;i++) { 1496 smbcli_unlink(cli1->tree, fnames[i]); 1497 } 1498 1499 torture_comment(tctx, "finshed denytest1 (%d failures)\n", failures); 1500 return correct; 1501} 1502 1503 1504/* 1505 this produces a matrix of deny mode behaviour with 2 connections 1506 */ 1507bool torture_denytest2(struct torture_context *tctx, 1508 struct smbcli_state *cli1, 1509 struct smbcli_state *cli2) 1510{ 1511 int fnum1, fnum2; 1512 int i; 1513 bool correct = true; 1514 const char *fnames[2] = {"\\denytest2.dat", "\\denytest2.exe"}; 1515 struct timeval tv, tv_start; 1516 int failures=0; 1517 1518 for (i=0;i<2;i++) { 1519 smbcli_unlink(cli1->tree, fnames[i]); 1520 fnum1 = smbcli_open(cli1->tree, fnames[i], O_RDWR|O_CREAT, DENY_NONE); 1521 smbcli_write(cli1->tree, fnum1, 0, fnames[i], 0, strlen(fnames[i])); 1522 smbcli_close(cli1->tree, fnum1); 1523 } 1524 1525 GetTimeOfDay(&tv_start); 1526 1527 for (i=0; i<ARRAY_SIZE(denytable2); i++) { 1528 enum deny_result res; 1529 const char *fname = fnames[denytable2[i].isexe]; 1530 1531 progress_bar(tctx, i, ARRAY_SIZE(denytable1)); 1532 1533 fnum1 = smbcli_open(cli1->tree, fname, 1534 denytable2[i].mode1, 1535 denytable2[i].deny1); 1536 fnum2 = smbcli_open(cli2->tree, fname, 1537 denytable2[i].mode2, 1538 denytable2[i].deny2); 1539 1540 if (fnum1 == -1) { 1541 res = A_X; 1542 } else if (fnum2 == -1) { 1543 res = A_0; 1544 } else { 1545 uint8_t x = 1; 1546 res = A_0; 1547 if (smbcli_read(cli2->tree, fnum2, &x, 0, 1) == 1) { 1548 res += A_R; 1549 } 1550 if (smbcli_write(cli2->tree, fnum2, 0, &x, 0, 1) == 1) { 1551 res += A_W; 1552 } 1553 } 1554 1555 if (torture_setting_bool(tctx, "showall", false) || 1556 res != denytable2[i].result) { 1557 int64_t tdif; 1558 GetTimeOfDay(&tv); 1559 tdif = usec_time_diff(&tv, &tv_start); 1560 tdif /= 1000; 1561 torture_comment(tctx, "%lld: %s %8s %10s %8s %10s %s (correct=%s)\n", 1562 (long long)tdif, 1563 fname, 1564 denystr(denytable2[i].deny1), 1565 openstr(denytable2[i].mode1), 1566 denystr(denytable2[i].deny2), 1567 openstr(denytable2[i].mode2), 1568 resultstr(res), 1569 resultstr(denytable2[i].result)); 1570 } 1571 1572 if (res != denytable2[i].result) { 1573 correct = false; 1574 CHECK_MAX_FAILURES(failed); 1575 } 1576 1577 smbcli_close(cli1->tree, fnum1); 1578 smbcli_close(cli2->tree, fnum2); 1579 } 1580 1581failed: 1582 for (i=0;i<2;i++) { 1583 smbcli_unlink(cli1->tree, fnames[i]); 1584 } 1585 1586 torture_comment(tctx, "finshed denytest2 (%d failures)\n", failures); 1587 return correct; 1588} 1589 1590 1591 1592/* 1593 simple test harness for playing with deny modes 1594 */ 1595bool torture_denytest3(struct torture_context *tctx, 1596 struct smbcli_state *cli1, 1597 struct smbcli_state *cli2) 1598{ 1599 int fnum1, fnum2; 1600 const char *fname; 1601 1602 fname = "\\deny_dos1.dat"; 1603 1604 smbcli_unlink(cli1->tree, fname); 1605 fnum1 = smbcli_open(cli1->tree, fname, O_CREAT|O_TRUNC|O_WRONLY, DENY_DOS); 1606 fnum2 = smbcli_open(cli1->tree, fname, O_CREAT|O_TRUNC|O_WRONLY, DENY_DOS); 1607 if (fnum1 != -1) smbcli_close(cli1->tree, fnum1); 1608 if (fnum2 != -1) smbcli_close(cli1->tree, fnum2); 1609 smbcli_unlink(cli1->tree, fname); 1610 torture_comment(tctx, "fnum1=%d fnum2=%d\n", fnum1, fnum2); 1611 1612 1613 fname = "\\deny_dos2.dat"; 1614 1615 smbcli_unlink(cli1->tree, fname); 1616 fnum1 = smbcli_open(cli1->tree, fname, O_CREAT|O_TRUNC|O_WRONLY, DENY_DOS); 1617 fnum2 = smbcli_open(cli2->tree, fname, O_CREAT|O_TRUNC|O_WRONLY, DENY_DOS); 1618 if (fnum1 != -1) smbcli_close(cli1->tree, fnum1); 1619 if (fnum2 != -1) smbcli_close(cli2->tree, fnum2); 1620 smbcli_unlink(cli1->tree, fname); 1621 torture_comment(tctx, "fnum1=%d fnum2=%d\n", fnum1, fnum2); 1622 1623 return true; 1624} 1625 1626struct bit_value { 1627 uint32_t value; 1628 const char *name; 1629}; 1630 1631static uint32_t map_bits(const struct bit_value *bv, int b, int nbits) 1632{ 1633 int i; 1634 uint32_t ret = 0; 1635 for (i=0;i<nbits;i++) { 1636 if (b & (1<<i)) { 1637 ret |= bv[i].value; 1638 } 1639 } 1640 return ret; 1641} 1642 1643static const char *bit_string(TALLOC_CTX *mem_ctx, const struct bit_value *bv, int b, int nbits) 1644{ 1645 char *ret = NULL; 1646 int i; 1647 for (i=0;i<nbits;i++) { 1648 if (b & (1<<i)) { 1649 if (ret == NULL) { 1650 ret = talloc_asprintf(mem_ctx, "%s", bv[i].name); 1651 } else { 1652 ret = talloc_asprintf_append_buffer(ret, " | %s", bv[i].name); 1653 } 1654 } 1655 } 1656 if (ret == NULL) ret = talloc_strdup(mem_ctx, "(NONE)"); 1657 return ret; 1658} 1659 1660 1661/* 1662 determine if two opens conflict 1663*/ 1664static NTSTATUS predict_share_conflict(uint32_t sa1, uint32_t am1, uint32_t sa2, uint32_t am2, 1665 bool read_for_execute, enum deny_result *res) 1666{ 1667#define CHECK_MASK(am, sa, right, share) do { \ 1668 if (((am) & (right)) && !((sa) & (share))) { \ 1669 *res = A_0; \ 1670 return NT_STATUS_SHARING_VIOLATION; \ 1671 }} while (0) 1672 1673 *res = A_0; 1674 if (am2 & (SEC_FILE_WRITE_DATA | SEC_FILE_APPEND_DATA)) { 1675 *res += A_W; 1676 } 1677 if (am2 & SEC_FILE_READ_DATA) { 1678 *res += A_R; 1679 } else if ((am2 & SEC_FILE_EXECUTE) && read_for_execute) { 1680 *res += A_R; 1681 } 1682 1683 /* if either open involves no read.write or delete access then 1684 it can't conflict */ 1685 if (!(am1 & (SEC_FILE_WRITE_DATA | 1686 SEC_FILE_APPEND_DATA | 1687 SEC_FILE_READ_DATA | 1688 SEC_FILE_EXECUTE | 1689 SEC_STD_DELETE))) { 1690 return NT_STATUS_OK; 1691 } 1692 if (!(am2 & (SEC_FILE_WRITE_DATA | 1693 SEC_FILE_APPEND_DATA | 1694 SEC_FILE_READ_DATA | 1695 SEC_FILE_EXECUTE | 1696 SEC_STD_DELETE))) { 1697 return NT_STATUS_OK; 1698 } 1699 1700 /* check the basic share access */ 1701 CHECK_MASK(am1, sa2, 1702 SEC_FILE_WRITE_DATA | SEC_FILE_APPEND_DATA, 1703 NTCREATEX_SHARE_ACCESS_WRITE); 1704 CHECK_MASK(am2, sa1, 1705 SEC_FILE_WRITE_DATA | SEC_FILE_APPEND_DATA, 1706 NTCREATEX_SHARE_ACCESS_WRITE); 1707 1708 CHECK_MASK(am1, sa2, 1709 SEC_FILE_READ_DATA | SEC_FILE_EXECUTE, 1710 NTCREATEX_SHARE_ACCESS_READ); 1711 CHECK_MASK(am2, sa1, 1712 SEC_FILE_READ_DATA | SEC_FILE_EXECUTE, 1713 NTCREATEX_SHARE_ACCESS_READ); 1714 1715 CHECK_MASK(am1, sa2, 1716 SEC_STD_DELETE, 1717 NTCREATEX_SHARE_ACCESS_DELETE); 1718 CHECK_MASK(am2, sa1, 1719 SEC_STD_DELETE, 1720 NTCREATEX_SHARE_ACCESS_DELETE); 1721 1722 return NT_STATUS_OK; 1723} 1724 1725/* 1726 a denytest for ntcreatex 1727 */ 1728static bool torture_ntdenytest(struct torture_context *tctx, 1729 struct smbcli_state *cli1, struct smbcli_state *cli2, int client) 1730{ 1731 const struct bit_value share_access_bits[] = { 1732 { NTCREATEX_SHARE_ACCESS_READ, "S_R" }, 1733 { NTCREATEX_SHARE_ACCESS_WRITE, "S_W" }, 1734 { NTCREATEX_SHARE_ACCESS_DELETE, "S_D" } 1735 }; 1736 const struct bit_value access_mask_bits[] = { 1737 { SEC_FILE_READ_DATA, "R_DATA" }, 1738 { SEC_FILE_WRITE_DATA, "W_DATA" }, 1739 { SEC_FILE_READ_ATTRIBUTE, "R_ATTR" }, 1740 { SEC_FILE_WRITE_ATTRIBUTE, "W_ATTR" }, 1741 { SEC_FILE_READ_EA, "R_EAS " }, 1742 { SEC_FILE_WRITE_EA, "W_EAS " }, 1743 { SEC_FILE_APPEND_DATA, "A_DATA" }, 1744 { SEC_FILE_EXECUTE, "EXEC " } 1745 }; 1746 int fnum1; 1747 int i; 1748 bool correct = true; 1749 struct timeval tv, tv_start; 1750 const char *fname; 1751 int nbits1 = ARRAY_SIZE(share_access_bits); 1752 int nbits2 = ARRAY_SIZE(access_mask_bits); 1753 union smb_open io1, io2; 1754 extern int torture_numops; 1755 int failures = 0; 1756 uint8_t buf[1]; 1757 1758 torture_comment(tctx, "format: server correct\n"); 1759 1760 ZERO_STRUCT(buf); 1761 1762 fname = talloc_asprintf(cli1, "\\ntdeny_%d.dll", client); 1763 1764 smbcli_unlink(cli1->tree, fname); 1765 fnum1 = smbcli_open(cli1->tree, fname, O_RDWR|O_CREAT, DENY_NONE); 1766 smbcli_write(cli1->tree, fnum1, 0, buf, 0, sizeof(buf)); 1767 smbcli_close(cli1->tree, fnum1); 1768 1769 GetTimeOfDay(&tv_start); 1770 1771 io1.ntcreatex.level = RAW_OPEN_NTCREATEX; 1772 io1.ntcreatex.in.root_fid = 0; 1773 io1.ntcreatex.in.flags = NTCREATEX_FLAGS_EXTENDED; 1774 io1.ntcreatex.in.create_options = NTCREATEX_OPTIONS_NON_DIRECTORY_FILE; 1775 io1.ntcreatex.in.file_attr = 0; 1776 io1.ntcreatex.in.alloc_size = 0; 1777 io1.ntcreatex.in.open_disposition = NTCREATEX_DISP_OPEN; 1778 io1.ntcreatex.in.impersonation = NTCREATEX_IMPERSONATION_IMPERSONATION; 1779 io1.ntcreatex.in.security_flags = 0; 1780 io1.ntcreatex.in.fname = fname; 1781 io2 = io1; 1782 1783 torture_comment(tctx, "testing %d entries on %s\n", torture_numops, fname); 1784 1785 for (i=0;i<torture_numops;i++) { 1786 NTSTATUS status1, status2, status2_p; 1787 int64_t tdif; 1788 TALLOC_CTX *mem_ctx = talloc_new(NULL); 1789 enum deny_result res, res2; 1790 int b_sa1 = random() & ((1<<nbits1)-1); 1791 int b_am1 = random() & ((1<<nbits2)-1); 1792 int b_sa2 = random() & ((1<<nbits1)-1); 1793 int b_am2 = random() & ((1<<nbits2)-1); 1794 bool read_for_execute; 1795 1796 progress_bar(tctx, i, torture_numops); 1797 1798 io1.ntcreatex.in.share_access = map_bits(share_access_bits, b_sa1, nbits1); 1799 io1.ntcreatex.in.access_mask = map_bits(access_mask_bits, b_am1, nbits2); 1800 1801 io2.ntcreatex.in.share_access = map_bits(share_access_bits, b_sa2, nbits1); 1802 io2.ntcreatex.in.access_mask = map_bits(access_mask_bits, b_am2, nbits2); 1803 1804 status1 = smb_raw_open(cli1->tree, mem_ctx, &io1); 1805 status2 = smb_raw_open(cli2->tree, mem_ctx, &io2); 1806 1807 if (random() % 2 == 0) { 1808 read_for_execute = true; 1809 } else { 1810 read_for_execute = false; 1811 } 1812 1813 if (!NT_STATUS_IS_OK(status1)) { 1814 res = A_X; 1815 } else if (!NT_STATUS_IS_OK(status2)) { 1816 res = A_0; 1817 } else { 1818 union smb_read r; 1819 NTSTATUS status; 1820 1821 /* we can't use smbcli_read() as we need to 1822 set read_for_execute */ 1823 r.readx.level = RAW_READ_READX; 1824 r.readx.in.file.fnum = io2.ntcreatex.out.file.fnum; 1825 r.readx.in.offset = 0; 1826 r.readx.in.mincnt = sizeof(buf); 1827 r.readx.in.maxcnt = sizeof(buf); 1828 r.readx.in.remaining = 0; 1829 r.readx.in.read_for_execute = read_for_execute; 1830 r.readx.out.data = buf; 1831 1832 res = A_0; 1833 status = smb_raw_read(cli2->tree, &r); 1834 if (NT_STATUS_IS_OK(status)) { 1835 res += A_R; 1836 } 1837 if (smbcli_write(cli2->tree, io2.ntcreatex.out.file.fnum, 1838 0, buf, 0, sizeof(buf)) >= 1) { 1839 res += A_W; 1840 } 1841 } 1842 1843 if (NT_STATUS_IS_OK(status1)) { 1844 smbcli_close(cli1->tree, io1.ntcreatex.out.file.fnum); 1845 } 1846 if (NT_STATUS_IS_OK(status2)) { 1847 smbcli_close(cli2->tree, io2.ntcreatex.out.file.fnum); 1848 } 1849 1850 status2_p = predict_share_conflict(io1.ntcreatex.in.share_access, 1851 io1.ntcreatex.in.access_mask, 1852 io2.ntcreatex.in.share_access, 1853 io2.ntcreatex.in.access_mask, 1854 read_for_execute, 1855 &res2); 1856 1857 GetTimeOfDay(&tv); 1858 tdif = usec_time_diff(&tv, &tv_start); 1859 tdif /= 1000; 1860 if (torture_setting_bool(tctx, "showall", false) || 1861 !NT_STATUS_EQUAL(status2, status2_p) || 1862 res != res2) { 1863 torture_comment(tctx, "\n%-20s %-70s\n%-20s %-70s %4s %4s %s/%s\n", 1864 bit_string(mem_ctx, share_access_bits, b_sa1, nbits1), 1865 bit_string(mem_ctx, access_mask_bits, b_am1, nbits2), 1866 bit_string(mem_ctx, share_access_bits, b_sa2, nbits1), 1867 bit_string(mem_ctx, access_mask_bits, b_am2, nbits2), 1868 resultstr(res), 1869 resultstr(res2), 1870 nt_errstr(status2), 1871 nt_errstr(status2_p)); 1872 fflush(stdout); 1873 } 1874 1875 if (res != res2 || 1876 !NT_STATUS_EQUAL(status2, status2_p)) { 1877 CHECK_MAX_FAILURES(failed); 1878 correct = false; 1879 } 1880 1881 talloc_free(mem_ctx); 1882 } 1883 1884failed: 1885 smbcli_unlink(cli1->tree, fname); 1886 1887 torture_comment(tctx, "finshed ntdenytest (%d failures)\n", failures); 1888 return correct; 1889} 1890 1891 1892 1893/* 1894 a denytest for ntcreatex 1895 */ 1896bool torture_ntdenytest1(struct torture_context *tctx, 1897 struct smbcli_state *cli, int client) 1898{ 1899 extern int torture_seed; 1900 1901 srandom(torture_seed + client); 1902 1903 torture_comment(tctx, "starting ntdenytest1 client %d\n", client); 1904 1905 return torture_ntdenytest(tctx, cli, cli, client); 1906} 1907 1908/* 1909 a denytest for ntcreatex 1910 */ 1911bool torture_ntdenytest2(struct torture_context *torture, 1912 struct smbcli_state *cli1, 1913 struct smbcli_state *cli2) 1914{ 1915 return torture_ntdenytest(torture, cli1, cli2, 0); 1916} 1917 1918#define COMPARE_STATUS(status, correct) do { \ 1919 if (!NT_STATUS_EQUAL(status, correct)) { \ 1920 torture_result(tctx, TORTURE_FAIL, \ 1921 "(%s) Incorrect status %s - should be %s\n", \ 1922 __location__, nt_errstr(status), nt_errstr(correct)); \ 1923 ret = false; \ 1924 failed = true; \ 1925 }} while (0) 1926 1927#define CHECK_STATUS(status, correct) do { \ 1928 if (!NT_STATUS_EQUAL(status, correct)) { \ 1929 torture_result(tctx, TORTURE_FAIL, \ 1930 "(%s) Incorrect status %s - should be %s\n", \ 1931 __location__, nt_errstr(status), nt_errstr(correct)); \ 1932 ret = false; \ 1933 goto done; \ 1934 }} while (0) 1935 1936#define CHECK_VAL(v, correct) do { \ 1937 if ((v) != (correct)) { \ 1938 torture_result(tctx, TORTURE_FAIL, \ 1939 "(%s) wrong value for %s 0x%x - should be 0x%x\n", \ 1940 __location__, #v, (int)(v), (int)correct); \ 1941 ret = false; \ 1942 }} while (0) 1943 1944/* 1945 test sharing of handles with DENY_DOS on a single connection 1946*/ 1947bool torture_denydos_sharing(struct torture_context *tctx, 1948 struct smbcli_state *cli) 1949{ 1950 union smb_open io; 1951 union smb_fileinfo finfo; 1952 const char *fname = "\\torture_denydos.txt"; 1953 NTSTATUS status; 1954 int fnum1 = -1, fnum2 = -1; 1955 bool ret = true; 1956 union smb_setfileinfo sfinfo; 1957 TALLOC_CTX *mem_ctx; 1958 1959 mem_ctx = talloc_new(cli); 1960 1961 torture_comment(tctx, "Checking DENY_DOS shared handle semantics\n"); 1962 smbcli_unlink(cli->tree, fname); 1963 1964 io.openx.level = RAW_OPEN_OPENX; 1965 io.openx.in.fname = fname; 1966 io.openx.in.flags = OPENX_FLAGS_ADDITIONAL_INFO; 1967 io.openx.in.open_mode = OPENX_MODE_ACCESS_RDWR | OPENX_MODE_DENY_DOS; 1968 io.openx.in.open_func = OPENX_OPEN_FUNC_OPEN | OPENX_OPEN_FUNC_CREATE; 1969 io.openx.in.search_attrs = 0; 1970 io.openx.in.file_attrs = 0; 1971 io.openx.in.write_time = 0; 1972 io.openx.in.size = 0; 1973 io.openx.in.timeout = 0; 1974 1975 torture_comment(tctx, "openx twice with RDWR/DENY_DOS\n"); 1976 status = smb_raw_open(cli->tree, mem_ctx, &io); 1977 CHECK_STATUS(status, NT_STATUS_OK); 1978 fnum1 = io.openx.out.file.fnum; 1979 1980 status = smb_raw_open(cli->tree, mem_ctx, &io); 1981 CHECK_STATUS(status, NT_STATUS_OK); 1982 fnum2 = io.openx.out.file.fnum; 1983 1984 torture_comment(tctx, "fnum1=%d fnum2=%d\n", fnum1, fnum2); 1985 1986 sfinfo.generic.level = RAW_SFILEINFO_POSITION_INFORMATION; 1987 sfinfo.position_information.in.file.fnum = fnum1; 1988 sfinfo.position_information.in.position = 1000; 1989 status = smb_raw_setfileinfo(cli->tree, &sfinfo); 1990 CHECK_STATUS(status, NT_STATUS_OK); 1991 1992 torture_comment(tctx, "two handles should be same file handle\n"); 1993 finfo.position_information.level = RAW_FILEINFO_POSITION_INFORMATION; 1994 finfo.position_information.in.file.fnum = fnum1; 1995 status = smb_raw_fileinfo(cli->tree, mem_ctx, &finfo); 1996 CHECK_STATUS(status, NT_STATUS_OK); 1997 CHECK_VAL(finfo.position_information.out.position, 1000); 1998 1999 finfo.position_information.in.file.fnum = fnum2; 2000 status = smb_raw_fileinfo(cli->tree, mem_ctx, &finfo); 2001 CHECK_STATUS(status, NT_STATUS_OK); 2002 CHECK_VAL(finfo.position_information.out.position, 1000); 2003 2004 2005 smbcli_close(cli->tree, fnum1); 2006 smbcli_close(cli->tree, fnum2); 2007 2008 torture_comment(tctx, "openx twice with RDWR/DENY_NONE\n"); 2009 io.openx.in.open_mode = OPENX_MODE_ACCESS_RDWR | OPENX_MODE_DENY_NONE; 2010 status = smb_raw_open(cli->tree, mem_ctx, &io); 2011 CHECK_STATUS(status, NT_STATUS_OK); 2012 fnum1 = io.openx.out.file.fnum; 2013 2014 io.openx.in.open_func = OPENX_OPEN_FUNC_OPEN; 2015 status = smb_raw_open(cli->tree, mem_ctx, &io); 2016 CHECK_STATUS(status, NT_STATUS_OK); 2017 fnum2 = io.openx.out.file.fnum; 2018 2019 torture_comment(tctx, "fnum1=%d fnum2=%d\n", fnum1, fnum2); 2020 2021 torture_comment(tctx, "two handles should be separate\n"); 2022 sfinfo.generic.level = RAW_SFILEINFO_POSITION_INFORMATION; 2023 sfinfo.position_information.in.file.fnum = fnum1; 2024 sfinfo.position_information.in.position = 1000; 2025 status = smb_raw_setfileinfo(cli->tree, &sfinfo); 2026 CHECK_STATUS(status, NT_STATUS_OK); 2027 2028 finfo.position_information.level = RAW_FILEINFO_POSITION_INFORMATION; 2029 finfo.position_information.in.file.fnum = fnum1; 2030 status = smb_raw_fileinfo(cli->tree, mem_ctx, &finfo); 2031 CHECK_STATUS(status, NT_STATUS_OK); 2032 CHECK_VAL(finfo.position_information.out.position, 1000); 2033 2034 finfo.position_information.in.file.fnum = fnum2; 2035 status = smb_raw_fileinfo(cli->tree, mem_ctx, &finfo); 2036 CHECK_STATUS(status, NT_STATUS_OK); 2037 CHECK_VAL(finfo.position_information.out.position, 0); 2038 2039done: 2040 smbcli_close(cli->tree, fnum1); 2041 smbcli_close(cli->tree, fnum2); 2042 smbcli_unlink(cli->tree, fname); 2043 2044 return ret; 2045} 2046 2047#define CXD_MATCHES(_cxd, i) \ 2048 ((cxd_known[i].cxd_test == (_cxd)->cxd_test) && \ 2049 (cxd_known[i].cxd_flags == (_cxd)->cxd_flags) && \ 2050 (cxd_known[i].cxd_access1 == (_cxd)->cxd_access1) && \ 2051 (cxd_known[i].cxd_sharemode1 == (_cxd)->cxd_sharemode1) && \ 2052 (cxd_known[i].cxd_access2 == (_cxd)->cxd_access2) && \ 2053 (cxd_known[i].cxd_sharemode2 == (_cxd)->cxd_sharemode2)) 2054 2055static int cxd_find_known(struct createx_data *cxd) 2056{ 2057 static int i = -1; 2058 2059 /* Optimization for tests which we don't have results saved for. */ 2060 if ((cxd->cxd_test == CXD_TEST_CREATEX_ACCESS_EXHAUSTIVE) || 2061 (cxd->cxd_test == CXD_TEST_CREATEX_SHAREMODE_EXTENDED)) 2062 return -1; 2063 2064 /* Optimization: If our cxd_known table is too large, it hurts test 2065 * performance to search through the entire table each time. If the 2066 * caller can pass in the previous result, we can try the next entry. 2067 * This works if results are taken directly from the same code. */ 2068 i++; 2069 if ((i >= 0) && (i < sizeof(cxd_known) / sizeof(cxd_known[0])) && 2070 CXD_MATCHES(cxd, i)) 2071 return i; 2072 2073 for (i = 0; i < (sizeof(cxd_known) / sizeof(cxd_known[0])); i++) { 2074 if (CXD_MATCHES(cxd, i)) 2075 return i; 2076 } 2077 2078 return -1; 2079} 2080 2081#define FILL_NTCREATEX(_struct, _init...) \ 2082 do { \ 2083 (_struct)->generic.level = RAW_OPEN_NTCREATEX; \ 2084 (_struct)->ntcreatex.in \ 2085 = (typeof((_struct)->ntcreatex.in)) {_init};\ 2086 } while (0) 2087 2088#define CREATEX_NAME "\\createx_dir" 2089 2090static bool createx_make_dir(struct torture_context *tctx, 2091 struct smbcli_tree *tree, TALLOC_CTX *mem_ctx, const char *fname) 2092{ 2093 bool ret = true; 2094 NTSTATUS status; 2095 2096 status = smbcli_mkdir(tree, fname); 2097 CHECK_STATUS(status, NT_STATUS_OK); 2098 2099 done: 2100 return ret; 2101} 2102 2103static bool createx_make_file(struct torture_context *tctx, 2104 struct smbcli_tree *tree, TALLOC_CTX *mem_ctx, const char *fname) 2105{ 2106 union smb_open open_parms; 2107 bool ret = true; 2108 NTSTATUS status; 2109 2110 FILL_NTCREATEX(&open_parms, 2111 .flags = 0, 2112 .access_mask = SEC_RIGHTS_FILE_ALL, 2113 .file_attr = FILE_ATTRIBUTE_NORMAL, 2114 .share_access = 0, 2115 .open_disposition = NTCREATEX_DISP_CREATE, 2116 .create_options = 0, 2117 .fname = fname, 2118 ); 2119 status = smb_raw_open(tree, mem_ctx, &open_parms); 2120 CHECK_STATUS(status, NT_STATUS_OK); 2121 2122 status = smbcli_close(tree, open_parms.ntcreatex.out.file.fnum); 2123 CHECK_STATUS(status, NT_STATUS_OK); 2124 2125 done: 2126 return ret; 2127} 2128 2129static void createx_fill_dir(union smb_open *open_parms, int accessmode, 2130 int sharemode, const char *fname) 2131{ 2132 FILL_NTCREATEX(open_parms, 2133 .flags = 0, 2134 .access_mask = accessmode, 2135 .file_attr = FILE_ATTRIBUTE_DIRECTORY, 2136 .share_access = sharemode, 2137 .open_disposition = NTCREATEX_DISP_OPEN_IF, 2138 .create_options = NTCREATEX_OPTIONS_DIRECTORY, 2139 .fname = fname, 2140 ); 2141} 2142 2143static void createx_fill_file(union smb_open *open_parms, int accessmode, 2144 int sharemode, const char *fname) 2145{ 2146 FILL_NTCREATEX(open_parms, 2147 .flags = 0, 2148 .access_mask = accessmode, 2149 .file_attr = FILE_ATTRIBUTE_NORMAL, 2150 .share_access = sharemode, 2151 .open_disposition = NTCREATEX_DISP_OPEN_IF, 2152 .create_options = 0, 2153 .fname = fname, 2154 ); 2155} 2156 2157static int data_file_fd = -1; 2158 2159#define KNOWN "known" 2160#define CHILD "child" 2161static bool createx_test_dir(struct torture_context *tctx, 2162 struct smbcli_tree *tree, int fnum, TALLOC_CTX *mem_ctx, NTSTATUS *result) 2163{ 2164 bool ret = true; 2165 NTSTATUS status; 2166 union smb_open open_parms; 2167 2168 /* bypass original handle to guarantee creation */ 2169 FILL_NTCREATEX(&open_parms, 2170 .flags = 0, 2171 .access_mask = SEC_RIGHTS_FILE_ALL, 2172 .file_attr = FILE_ATTRIBUTE_NORMAL, 2173 .share_access = 0, 2174 .open_disposition = NTCREATEX_DISP_CREATE, 2175 .create_options = 0, 2176 .fname = CREATEX_NAME "\\" KNOWN, 2177 ); 2178 status = smb_raw_open(tree, mem_ctx, &open_parms); 2179 CHECK_STATUS(status, NT_STATUS_OK); 2180 smbcli_close(tree, open_parms.ntcreatex.out.file.fnum); 2181 2182 result[CXD_DIR_ENUMERATE] = NT_STATUS_OK; 2183 2184 /* try to create a child */ 2185 FILL_NTCREATEX(&open_parms, 2186 .flags = 0, 2187 .access_mask = SEC_RIGHTS_FILE_ALL, 2188 .file_attr = FILE_ATTRIBUTE_NORMAL, 2189 .share_access = 0, 2190 .open_disposition = NTCREATEX_DISP_CREATE, 2191 .create_options = 0, 2192 .fname = CHILD, 2193 .root_fid = fnum, 2194 ); 2195 2196 result[CXD_DIR_CREATE_CHILD] = 2197 smb_raw_open(tree, mem_ctx, &open_parms); 2198 smbcli_close(tree, open_parms.ntcreatex.out.file.fnum); 2199 2200 /* try to traverse dir to known good file */ 2201 FILL_NTCREATEX(&open_parms, 2202 .flags = 0, 2203 .access_mask = SEC_RIGHTS_FILE_ALL, 2204 .file_attr = FILE_ATTRIBUTE_NORMAL, 2205 .share_access = 0, 2206 .open_disposition = NTCREATEX_DISP_OPEN, 2207 .create_options = 0, 2208 .fname = KNOWN, 2209 .root_fid = fnum, 2210 ); 2211 2212 result[CXD_DIR_TRAVERSE] = 2213 smb_raw_open(tree, mem_ctx, &open_parms); 2214 2215 2216 smbcli_close(tree, open_parms.ntcreatex.out.file.fnum); 2217 smbcli_unlink(tree, CREATEX_NAME "\\" KNOWN); 2218 smbcli_unlink(tree, CREATEX_NAME "\\" CHILD); 2219 2220 done: 2221 return ret; 2222} 2223 2224static bool createx_test_file(struct torture_context *tctx, 2225 struct smbcli_tree *tree, int fnum, TALLOC_CTX *mem_ctx, NTSTATUS *result) 2226{ 2227 union smb_read rd = {}; 2228 union smb_write wr = {}; 2229 char buf[256] = ""; 2230 2231 rd.readx.level = RAW_READ_READX; 2232 rd.readx.in.file.fnum = fnum; 2233 rd.readx.in.mincnt = sizeof(buf); 2234 rd.readx.in.maxcnt = sizeof(buf); 2235 rd.readx.out.data = buf; 2236 2237 result[CXD_FILE_READ] = smb_raw_read(tree, &rd); 2238 2239 wr.writex.level = RAW_WRITE_WRITEX; 2240 wr.writex.in.file.fnum = fnum; 2241 wr.writex.in.count = sizeof(buf); 2242 wr.writex.in.data = buf; 2243 2244 result[CXD_FILE_WRITE] = smb_raw_write(tree, &wr); 2245 2246 memset(&rd, 0, sizeof(rd)); 2247 rd.readx.level = RAW_READ_READX; 2248 rd.readx.in.file.fnum = fnum; 2249 rd.readx.in.mincnt = sizeof(buf); 2250 rd.readx.in.maxcnt = sizeof(buf); 2251 rd.readx.in.read_for_execute = 1; 2252 rd.readx.out.data = buf; 2253 2254 result[CXD_FILE_EXECUTE] = smb_raw_read(tree, &rd); 2255 2256 return true; 2257} 2258 2259/* TODO When redirecting stdout to a file, the progress bar really screws up 2260 * the output. Could use a switch "--noprogress", or direct the progress bar to 2261 * stderr? No other solution? */ 2262static void createx_progress_bar(struct torture_context *tctx, uint_t i, 2263 uint_t total, uint_t skipped) 2264{ 2265 if (torture_setting_bool(tctx, "progress", true)) { 2266 torture_comment(tctx, "%5d/%5d (%d skipped)\r", i, total, 2267 skipped); 2268 fflush(stdout); 2269 } 2270} 2271 2272static bool torture_createx_specific(struct torture_context *tctx, struct 2273 smbcli_state *cli, struct smbcli_state *cli2, TALLOC_CTX *mem_ctx, struct 2274 createx_data *cxd, int estimated_count) 2275{ 2276 static int call_count = 1; 2277 static int unskipped_call_count = 1; 2278 const char *fname = CREATEX_NAME; 2279 int fnum = -1, fnum2 = -1, res, i; 2280 union smb_open open_parms1, open_parms2; 2281 bool ret = true; 2282 bool is_dir = cxd->cxd_flags & CXD_FLAGS_DIRECTORY; 2283 NTSTATUS *result = &cxd->cxd_result[0]; 2284 NTSTATUS *result2 = &cxd->cxd_result2[0]; 2285 bool found = false, failed = false; 2286 2287 bool (*make_func)(struct torture_context *, 2288 struct smbcli_tree *, TALLOC_CTX *, const char *); 2289 void (*fill_func)(union smb_open *, int, int, const char *); 2290 bool (*test_func)(struct torture_context *, 2291 struct smbcli_tree *, int, TALLOC_CTX *, NTSTATUS *); 2292 NTSTATUS (*destroy_func)(struct smbcli_tree *, const char *); 2293 2294 if (is_dir) { 2295 make_func = createx_make_dir; 2296 fill_func = createx_fill_dir; 2297 test_func = createx_test_dir; 2298 destroy_func = smbcli_rmdir; 2299 } else { 2300 make_func = createx_make_file; 2301 fill_func = createx_fill_file; 2302 test_func = createx_test_file; 2303 destroy_func = smbcli_unlink; 2304 } 2305 2306 /* Skip all SACL related tests. */ 2307 if ((!torture_setting_bool(tctx, "sacl_support", true)) && 2308 ((cxd->cxd_access1 & SEC_FLAG_SYSTEM_SECURITY) || 2309 (cxd->cxd_access2 & SEC_FLAG_SYSTEM_SECURITY))) 2310 goto done; 2311 2312 if (cxd->cxd_flags & CXD_FLAGS_MAKE_BEFORE_CREATEX) { 2313 ret = make_func(tctx, cli->tree, mem_ctx, fname); 2314 if (!ret) { 2315 torture_result(tctx, TORTURE_FAIL, 2316 "Initial creation failed\n"); 2317 goto done; 2318 } 2319 } 2320 2321 /* Initialize. */ 2322 fill_func(&open_parms1, cxd->cxd_access1, cxd->cxd_sharemode1, fname); 2323 2324 if (cxd->cxd_test == CXD_TEST_CREATEX_SHAREMODE) { 2325 fill_func(&open_parms2, cxd->cxd_access2, cxd->cxd_sharemode2, 2326 fname); 2327 } 2328 2329 for (i = CXD_CREATEX + 1; i < CXD_MAX; i++) { 2330 result[i] = NT_STATUS_UNSUCCESSFUL; 2331 result2[i] = NT_STATUS_UNSUCCESSFUL; 2332 } 2333 2334 /* Perform open(s). */ 2335 result[CXD_CREATEX] = smb_raw_open(cli->tree, mem_ctx, &open_parms1); 2336 if (NT_STATUS_IS_OK(result[CXD_CREATEX])) { 2337 fnum = open_parms1.ntcreatex.out.file.fnum; 2338 ret = test_func(tctx, cli->tree, fnum, mem_ctx, result); 2339 smbcli_close(cli->tree, fnum); 2340 } 2341 2342 if (cxd->cxd_test == CXD_TEST_CREATEX_SHAREMODE) { 2343 result2[CXD_CREATEX] = smb_raw_open(cli2->tree, mem_ctx, 2344 &open_parms2); 2345 if (NT_STATUS_IS_OK(result2[CXD_CREATEX])) { 2346 fnum2 = open_parms2.ntcreatex.out.file.fnum; 2347 ret = test_func(tctx, cli2->tree, fnum2, mem_ctx, 2348 result2); 2349 smbcli_close(cli2->tree, fnum2); 2350 } 2351 } 2352 2353 if (data_file_fd >= 0) { 2354 found = true; 2355 res = write(data_file_fd, &cxd, sizeof(cxd)); 2356 if (res != sizeof(cxd)) { 2357 torture_result(tctx, TORTURE_FAIL, 2358 "(%s): write failed: %s!", 2359 __location__, strerror(errno)); 2360 ret = false; 2361 } 2362 } else if ((res = cxd_find_known(cxd)) >= 0) { 2363 found = true; 2364 for (i = 0; i < CXD_MAX; i++) { 2365 /* Note: COMPARE_STATUS will set the "failed" bool. */ 2366 COMPARE_STATUS(result[i], cxd_known[res].cxd_result[i]); 2367 if (i == 0 && !NT_STATUS_IS_OK(result[i])) 2368 break; 2369 2370 if (cxd->cxd_test == CXD_TEST_CREATEX_SHAREMODE) { 2371 COMPARE_STATUS(result2[i], 2372 cxd_known[res].cxd_result2[i]); 2373 if (i == 0 && !NT_STATUS_IS_OK(result2[i])) 2374 break; 2375 } 2376 } 2377 } 2378 2379 /* We print if its not in the "cxd_known" list or if we fail. */ 2380 if (!found || failed) { 2381 torture_comment(tctx, 2382 " { .cxd_test = %d, .cxd_flags = %#3x, " 2383 ".cxd_access1 = %#10x, .cxd_sharemode1=%1x, " 2384 ".cxd_access2=%#10x, .cxd_sharemode2=%1x, " 2385 ".cxd_result = { ", cxd->cxd_test, cxd->cxd_flags, 2386 cxd->cxd_access1, cxd->cxd_sharemode1, cxd->cxd_access2, 2387 cxd->cxd_sharemode2); 2388 for (i = 0; i < CXD_MAX; i++) { 2389 torture_comment(tctx, "%s, ", nt_errstr(result[i])); 2390 if (i == 0 && !NT_STATUS_IS_OK(result[i])) 2391 break; 2392 } 2393 torture_comment(tctx, "}"); 2394 if (cxd->cxd_test == CXD_TEST_CREATEX_SHAREMODE) { 2395 torture_comment(tctx, ", .cxd_result2 = { "); 2396 for (i = 0; i < CXD_MAX; i++) { 2397 torture_comment(tctx, "%s, ", 2398 nt_errstr(result2[i])); 2399 if (i == 0 && !NT_STATUS_IS_OK(result2[i])) 2400 break; 2401 } 2402 torture_comment(tctx, "}"); 2403 } 2404 torture_comment(tctx, "}, \n"); 2405 } else { 2406 createx_progress_bar(tctx, call_count, estimated_count, 2407 call_count - unskipped_call_count); 2408 } 2409 /* Count tests that we didn't skip. */ 2410 unskipped_call_count++; 2411 done: 2412 call_count++; 2413 2414 destroy_func(cli->tree, fname); 2415 return ret; 2416} 2417 2418uint32_t sec_access_bit_groups[] = { 2419 SEC_RIGHTS_FILE_READ, 2420 SEC_RIGHTS_FILE_WRITE, 2421 SEC_RIGHTS_FILE_EXECUTE 2422}; 2423#define NUM_ACCESS_GROUPS (sizeof(sec_access_bit_groups) / sizeof(uint32_t)) 2424#define ACCESS_GROUPS_COUNT ((1 << NUM_ACCESS_GROUPS)) 2425#define BITSINBYTE 8 2426 2427/* Note: See NTCREATEX_SHARE_ACCESS_{NONE,READ,WRITE,DELETE} for share mode 2428 * declarations. */ 2429#define NUM_SHAREMODE_PERMUTATIONS 8 2430 2431/** 2432 * NTCREATEX and SHARE MODE test. 2433 * 2434 * Open with combinations of (access_mode, share_mode). 2435 * - Check status 2436 * Open 2nd time with combination of (access_mode2, share_mode2). 2437 * - Check status 2438 * Perform operations to verify? 2439 * - Read 2440 * - Write 2441 * - Delete 2442 */ 2443bool torture_createx_sharemodes(struct torture_context *tctx, 2444 struct smbcli_state *cli, 2445 struct smbcli_state *cli2, 2446 bool dir, 2447 bool extended) 2448{ 2449 TALLOC_CTX *mem_ctx; 2450 bool ret = true; 2451 int i, j, est; 2452 int gp1, gp2; /* group permuters */ 2453 struct createx_data cxd = {0}; 2454 int num_access_bits1 = sizeof(cxd.cxd_access1) * BITSINBYTE; 2455 int num_access_bits2 = sizeof(cxd.cxd_access2) * BITSINBYTE; 2456 2457 mem_ctx = talloc_init("createx_sharemodes"); 2458 if (!mem_ctx) 2459 return false; 2460 2461 if (!torture_setting_bool(tctx, "sacl_support", true)) 2462 torture_warning(tctx, "Skipping SACL related tests!\n"); 2463 2464 cxd.cxd_test = extended ? CXD_TEST_CREATEX_SHAREMODE_EXTENDED : 2465 CXD_TEST_CREATEX_SHAREMODE; 2466 cxd.cxd_flags = dir ? CXD_FLAGS_DIRECTORY: 0; 2467 2468 /* HACK for progress bar: figure out estimated count. */ 2469 est = (NUM_SHAREMODE_PERMUTATIONS * NUM_SHAREMODE_PERMUTATIONS) * 2470 ((ACCESS_GROUPS_COUNT * ACCESS_GROUPS_COUNT) + 2471 (extended ? num_access_bits1 * num_access_bits2 : 0)); 2472 2473 /* Blank slate. */ 2474 smbcli_deltree(cli->tree, CREATEX_NAME); 2475 smbcli_unlink(cli->tree, CREATEX_NAME); 2476 2477 /* Choose 2 random share modes. */ 2478 for (cxd.cxd_sharemode1 = 0; 2479 cxd.cxd_sharemode1 < NUM_SHAREMODE_PERMUTATIONS; 2480 cxd.cxd_sharemode1++) { 2481 for (cxd.cxd_sharemode2 = 0; 2482 cxd.cxd_sharemode2 < NUM_SHAREMODE_PERMUTATIONS; 2483 cxd.cxd_sharemode2++) { 2484 2485 /* Permutate through our access_bit_groups. */ 2486 for (gp1 = 0; gp1 < ACCESS_GROUPS_COUNT; gp1++) { 2487 for (gp2 = 0; gp2 < ACCESS_GROUPS_COUNT; gp2++) 2488 { 2489 cxd.cxd_access1 = cxd.cxd_access2 = 0; 2490 2491 for (i = 0; i < NUM_ACCESS_GROUPS; i++) 2492 { 2493 cxd.cxd_access1 |= 2494 (gp1 & (1 << i)) ? 2495 sec_access_bit_groups[i]:0; 2496 cxd.cxd_access2 |= 2497 (gp2 & (1 << i)) ? 2498 sec_access_bit_groups[i]:0; 2499 } 2500 2501 torture_createx_specific(tctx, cli, 2502 cli2, mem_ctx, &cxd, est); 2503 } 2504 } 2505 2506 /* Only do the single access bits on an extended run. */ 2507 if (!extended) 2508 continue; 2509 2510 for (i = 0; i < num_access_bits1; i++) { 2511 for (j = 0; j < num_access_bits2; j++) { 2512 cxd.cxd_access1 = 1ull << i; 2513 cxd.cxd_access2 = 1ull << j; 2514 2515 torture_createx_specific(tctx, cli, 2516 cli2, mem_ctx, &cxd, est); 2517 } 2518 } 2519 } 2520 } 2521 torture_comment(tctx, "\n"); 2522 2523 talloc_free(mem_ctx); 2524 return ret; 2525} 2526 2527bool torture_createx_sharemodes_file(struct torture_context *tctx, 2528 struct smbcli_state *cli, struct smbcli_state *cli2) 2529{ 2530 return torture_createx_sharemodes(tctx, cli, cli2, false, false); 2531} 2532 2533bool torture_createx_sharemodes_dir(struct torture_context *tctx, 2534 struct smbcli_state *cli, struct smbcli_state *cli2) 2535{ 2536 return torture_createx_sharemodes(tctx, cli, cli2, true, false); 2537} 2538 2539bool torture_createx_access(struct torture_context *tctx, 2540 struct smbcli_state *cli) 2541{ 2542 TALLOC_CTX *mem_ctx; 2543 bool ret = true; 2544 uint32_t group_permuter; 2545 uint32_t i; 2546 struct createx_data cxd = {0}; 2547 int est; 2548 int num_access_bits = sizeof(cxd.cxd_access1) * BITSINBYTE; 2549 2550 mem_ctx = talloc_init("createx_dir"); 2551 if (!mem_ctx) 2552 return false; 2553 2554 if (!torture_setting_bool(tctx, "sacl_support", true)) 2555 torture_warning(tctx, "Skipping SACL related tests!\n"); 2556 2557 cxd.cxd_test = CXD_TEST_CREATEX_ACCESS; 2558 2559 /* HACK for progress bar: figure out estimated count. */ 2560 est = CXD_FLAGS_COUNT * (ACCESS_GROUPS_COUNT + (num_access_bits * 3)); 2561 2562 /* Blank slate. */ 2563 smbcli_deltree(cli->tree, CREATEX_NAME); 2564 smbcli_unlink(cli->tree, CREATEX_NAME); 2565 2566 for (cxd.cxd_flags = 0; cxd.cxd_flags <= CXD_FLAGS_MASK; 2567 cxd.cxd_flags++) { 2568 /** 2569 * This implements a basic permutation of all elements of 2570 * 'bit_group'. group_permuter is a bit field representing 2571 * which groups to turn on. 2572 */ 2573 for (group_permuter = 0; group_permuter < (1 << 2574 NUM_ACCESS_GROUPS); group_permuter++) { 2575 for (i = 0, cxd.cxd_access1 = 0; 2576 i < NUM_ACCESS_GROUPS; i++) { 2577 cxd.cxd_access1 |= (group_permuter & (1 << i)) 2578 ? sec_access_bit_groups[i] : 0; 2579 } 2580 2581 torture_createx_specific(tctx, cli, NULL, mem_ctx, 2582 &cxd, est); 2583 } 2584 2585 for (i = 0; i < num_access_bits; i++) { 2586 /* And now run through the single access bits. */ 2587 cxd.cxd_access1 = 1 << i; 2588 torture_createx_specific(tctx, cli, NULL, mem_ctx, 2589 &cxd, est); 2590 2591 /* Does SEC_FLAG_MAXIMUM_ALLOWED override? */ 2592 cxd.cxd_access1 |= SEC_FLAG_MAXIMUM_ALLOWED; 2593 torture_createx_specific(tctx, cli, NULL, mem_ctx, 2594 &cxd, est); 2595 2596 /* What about SEC_FLAG_SYSTEM_SECURITY? */ 2597 cxd.cxd_access1 |= SEC_FLAG_SYSTEM_SECURITY; 2598 torture_createx_specific(tctx, cli, NULL, mem_ctx, 2599 &cxd, est); 2600 } 2601 } 2602 2603 talloc_free(mem_ctx); 2604 return ret; 2605} 2606 2607#define ACCESS_KNOWN_MASK 0xF31F01FFull 2608 2609bool torture_createx_access_exhaustive(struct torture_context *tctx, 2610 struct smbcli_state *cli) 2611{ 2612 char *data_file; 2613 TALLOC_CTX *mem_ctx; 2614 bool ret = true, first; 2615 uint32_t i; 2616 struct createx_data cxd = {0}; 2617 2618 mem_ctx = talloc_init("createx_dir"); 2619 if (!mem_ctx) 2620 return false; 2621 2622 if (!torture_setting_bool(tctx, "sacl_support", true)) 2623 torture_warning(tctx, "Skipping SACL related tests!\n"); 2624 2625 data_file = getenv("CREATEX_DATA"); 2626 if (data_file) { 2627 data_file_fd = open(data_file, O_WRONLY|O_CREAT|O_TRUNC, 0666); 2628 if (data_file_fd < 0) { 2629 torture_result(tctx, TORTURE_FAIL, 2630 "(%s): data file open failedu: %s!", 2631 __location__, strerror(errno)); 2632 ret = false; 2633 goto done; 2634 } 2635 } 2636 2637 /* Blank slate. */ 2638 smbcli_deltree(cli->tree, CREATEX_NAME); 2639 smbcli_unlink(cli->tree, CREATEX_NAME); 2640 2641 cxd.cxd_test = CXD_TEST_CREATEX_ACCESS_EXHAUSTIVE; 2642 2643 for (cxd.cxd_flags = 0; cxd.cxd_flags <= CXD_FLAGS_MASK; 2644 cxd.cxd_flags++) { 2645 for (i = 0, first = true; (i != 0) || first; first = false, 2646 i = ((i | ~ACCESS_KNOWN_MASK) + 1) & ACCESS_KNOWN_MASK) { 2647 cxd.cxd_access1 = i; 2648 ret = torture_createx_specific(tctx, cli, NULL, 2649 mem_ctx, &cxd, 0); 2650 if (!ret) 2651 break; 2652 } 2653 } 2654 2655 close(data_file_fd); 2656 data_file_fd = -1; 2657 2658 done: 2659 talloc_free(mem_ctx); 2660 return ret; 2661} 2662 2663#define MAXIMUM_ALLOWED_FILE "torture_maximum_allowed" 2664bool torture_maximum_allowed(struct torture_context *tctx, 2665 struct smbcli_state *cli) 2666{ 2667 struct security_descriptor *sd, *sd_orig; 2668 union smb_open io = {}; 2669 static TALLOC_CTX *mem_ctx; 2670 int fnum, i; 2671 bool ret = true; 2672 NTSTATUS status; 2673 union smb_fileinfo q; 2674 const char *owner_sid; 2675 bool has_restore_privilege, has_backup_privilege; 2676 2677 mem_ctx = talloc_init("torture_maximum_allowed"); 2678 2679 if (!torture_setting_bool(tctx, "sacl_support", true)) 2680 torture_warning(tctx, "Skipping SACL related tests!\n"); 2681 2682 sd = security_descriptor_dacl_create(mem_ctx, 2683 0, NULL, NULL, 2684 SID_NT_AUTHENTICATED_USERS, 2685 SEC_ACE_TYPE_ACCESS_ALLOWED, 2686 SEC_RIGHTS_FILE_READ, 2687 0, NULL); 2688 2689 /* Blank slate */ 2690 smbcli_unlink(cli->tree, MAXIMUM_ALLOWED_FILE); 2691 2692 /* create initial file with restrictive SD */ 2693 io.generic.level = RAW_OPEN_NTTRANS_CREATE; 2694 io.ntcreatex.in.access_mask = SEC_RIGHTS_FILE_ALL; 2695 io.ntcreatex.in.file_attr = FILE_ATTRIBUTE_NORMAL; 2696 io.ntcreatex.in.open_disposition = NTCREATEX_DISP_CREATE; 2697 io.ntcreatex.in.impersonation = NTCREATEX_IMPERSONATION_ANONYMOUS; 2698 io.ntcreatex.in.fname = MAXIMUM_ALLOWED_FILE; 2699 io.ntcreatex.in.sec_desc = sd; 2700 2701 status = smb_raw_open(cli->tree, mem_ctx, &io); 2702 CHECK_STATUS(status, NT_STATUS_OK); 2703 fnum = io.ntcreatex.out.file.fnum; 2704 2705 /* the correct answers for this test depends on whether the 2706 user has restore privileges. To find that out we first need 2707 to know our SID - get it from the owner_sid of the file we 2708 just created */ 2709 q.query_secdesc.level = RAW_FILEINFO_SEC_DESC; 2710 q.query_secdesc.in.file.fnum = fnum; 2711 q.query_secdesc.in.secinfo_flags = SECINFO_DACL | SECINFO_OWNER; 2712 status = smb_raw_fileinfo(cli->tree, tctx, &q); 2713 CHECK_STATUS(status, NT_STATUS_OK); 2714 sd_orig = q.query_secdesc.out.sd; 2715 2716 owner_sid = dom_sid_string(tctx, sd_orig->owner_sid); 2717 2718 status = smblsa_sid_check_privilege(cli, 2719 owner_sid, 2720 sec_privilege_name(SEC_PRIV_RESTORE)); 2721 has_restore_privilege = NT_STATUS_IS_OK(status); 2722 torture_comment(tctx, "Checked SEC_PRIV_RESTORE - %s\n", has_restore_privilege?"Yes":"No"); 2723 2724 status = smblsa_sid_check_privilege(cli, 2725 owner_sid, 2726 sec_privilege_name(SEC_PRIV_BACKUP)); 2727 has_backup_privilege = NT_STATUS_IS_OK(status); 2728 torture_comment(tctx, "Checked SEC_PRIV_BACKUP - %s\n", has_backup_privilege?"Yes":"No"); 2729 2730 smbcli_close(cli->tree, fnum); 2731 2732 for (i = 0; i < 32; i++) { 2733 uint32_t mask = SEC_FLAG_MAXIMUM_ALLOWED | (1u << i); 2734 uint32_t ok_mask = SEC_RIGHTS_FILE_READ | SEC_GENERIC_READ | 2735 SEC_STD_DELETE | SEC_STD_WRITE_DAC; 2736 2737 if (has_restore_privilege) { 2738 ok_mask |= SEC_RIGHTS_PRIV_RESTORE; 2739 } 2740 if (has_backup_privilege) { 2741 ok_mask |= SEC_RIGHTS_PRIV_BACKUP; 2742 } 2743 2744 /* Skip all SACL related tests. */ 2745 if ((!torture_setting_bool(tctx, "sacl_support", true)) && 2746 (mask & SEC_FLAG_SYSTEM_SECURITY)) 2747 continue; 2748 2749 memset(&io, 0, sizeof(io)); 2750 io.generic.level = RAW_OPEN_NTTRANS_CREATE; 2751 io.ntcreatex.in.access_mask = mask; 2752 io.ntcreatex.in.file_attr = FILE_ATTRIBUTE_NORMAL; 2753 io.ntcreatex.in.open_disposition = NTCREATEX_DISP_OPEN; 2754 io.ntcreatex.in.impersonation = 2755 NTCREATEX_IMPERSONATION_ANONYMOUS; 2756 io.ntcreatex.in.fname = MAXIMUM_ALLOWED_FILE; 2757 2758 status = smb_raw_open(cli->tree, mem_ctx, &io); 2759 if (mask & ok_mask || 2760 mask == SEC_FLAG_MAXIMUM_ALLOWED) { 2761 CHECK_STATUS(status, NT_STATUS_OK); 2762 } else { 2763 if (mask & SEC_FLAG_SYSTEM_SECURITY) { 2764 CHECK_STATUS(status, NT_STATUS_PRIVILEGE_NOT_HELD); 2765 } else { 2766 CHECK_STATUS(status, NT_STATUS_ACCESS_DENIED); 2767 } 2768 } 2769 2770 fnum = io.ntcreatex.out.file.fnum; 2771 2772 smbcli_close(cli->tree, fnum); 2773 } 2774 2775 done: 2776 return ret; 2777} 2778