1 /* 2 Unix SMB/Netbios implementation. 3 Version 1.9. 4 SMB parameters and setup 5 Copyright (C) Andrew Tridgell 1992-2000, 6 Copyright (C) Jean Francois Micouleau 1998-2000. 7 8 This program is free software; you can redistribute it and/or modify 9 it under the terms of the GNU General Public License as published by 10 the Free Software Foundation; either version 3 of the License, or 11 (at your option) any later version. 12 13 This program is distributed in the hope that it will be useful, 14 but WITHOUT ANY WARRANTY; without even the implied warranty of 15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 GNU General Public License for more details. 17 18 You should have received a copy of the GNU General Public License 19 along with this program. If not, see <http://www.gnu.org/licenses/>. 20 */ 21 22 #ifndef NT_PRINTING_H_ 23 #define NT_PRINTING_H_ 24 25 #include "client.h" 26 #include "../librpc/gen_ndr/spoolss.h" 27 28 #ifndef SAMBA_PRINTER_PORT_NAME 29 #define SAMBA_PRINTER_PORT_NAME "Samba Printer Port" 30 #endif 31 32 /* DOS header format */ 33 #define DOS_HEADER_SIZE 64 34 #define DOS_HEADER_MAGIC_OFFSET 0 35 #define DOS_HEADER_MAGIC 0x5A4D 36 #define DOS_HEADER_LFANEW_OFFSET 60 37 38 /* New Executable format (Win or OS/2 1.x segmented) */ 39 #define NE_HEADER_SIZE 64 40 #define NE_HEADER_SIGNATURE_OFFSET 0 41 #define NE_HEADER_SIGNATURE 0x454E 42 #define NE_HEADER_TARGET_OS_OFFSET 54 43 #define NE_HEADER_TARGOS_WIN 0x02 44 #define NE_HEADER_MINOR_VER_OFFSET 62 45 #define NE_HEADER_MAJOR_VER_OFFSET 63 46 47 /* Portable Executable format */ 48 #define PE_HEADER_SIZE 24 49 #define PE_HEADER_SIGNATURE_OFFSET 0 50 #define PE_HEADER_SIGNATURE 0x00004550 51 #define PE_HEADER_MACHINE_OFFSET 4 52 #define PE_HEADER_MACHINE_I386 0x14c 53 #define PE_HEADER_NUMBER_OF_SECTIONS 6 54 #define PE_HEADER_OPTIONAL_HEADER_SIZE 20 55 #define PE_HEADER_SECT_HEADER_SIZE 40 56 #define PE_HEADER_SECT_NAME_OFFSET 0 57 #define PE_HEADER_SECT_SIZE_DATA_OFFSET 16 58 #define PE_HEADER_SECT_PTR_DATA_OFFSET 20 59 60 /* Microsoft file version format */ 61 #define VS_SIGNATURE "VS_VERSION_INFO" 62 #define VS_MAGIC_VALUE 0xfeef04bd 63 #define VS_MAJOR_OFFSET 8 64 #define VS_MINOR_OFFSET 12 65 #define VS_VERSION_INFO_UNICODE_SIZE (sizeof(VS_SIGNATURE)*2+4+VS_MINOR_OFFSET+4) /* not true size! */ 66 #define VS_VERSION_INFO_SIZE (sizeof(VS_SIGNATURE)+4+VS_MINOR_OFFSET+4) /* not true size! */ 67 #define VS_NE_BUF_SIZE 4096 /* Must be > 2*VS_VERSION_INFO_SIZE */ 68 69 /* Notify spoolss clients that something has changed. The 70 notification data is either stored in two uint32_t values or a 71 variable length array. */ 72 73 #define SPOOLSS_NOTIFY_MSG_UNIX_JOBID 0x0001 /* Job id is unix */ 74 75 typedef struct spoolss_notify_msg { 76 fstring printer; /* Name of printer notified */ 77 uint32_t type; /* Printer or job notify */ 78 uint32_t field; /* Notify field changed */ 79 uint32_t id; /* Job id */ 80 uint32_t len; /* Length of data, 0 for two uint32_t value */ 81 uint32_t flags; 82 union { 83 uint32_t value[2]; 84 char *data; 85 } notify; 86 } SPOOLSS_NOTIFY_MSG; 87 88 typedef struct { 89 fstring printername; 90 uint32_t num_msgs; 91 SPOOLSS_NOTIFY_MSG *msgs; 92 } SPOOLSS_NOTIFY_MSG_GROUP; 93 94 typedef struct { 95 TALLOC_CTX *ctx; 96 uint32_t num_groups; 97 SPOOLSS_NOTIFY_MSG_GROUP *msg_groups; 98 } SPOOLSS_NOTIFY_MSG_CTR; 99 100 /* 101 * The printer attributes. 102 * I #defined all of them (grabbed form MSDN) 103 * I'm only using: 104 * ( SHARED | NETWORK | RAW_ONLY ) 105 * RAW_ONLY _MUST_ be present otherwise NT will send an EMF file 106 */ 107 108 #define PRINTER_ATTRIBUTE_SAMBA (PRINTER_ATTRIBUTE_RAW_ONLY|\ 109 PRINTER_ATTRIBUTE_SHARED|\ 110 PRINTER_ATTRIBUTE_LOCAL) 111 #define PRINTER_ATTRIBUTE_NOT_SAMBA (PRINTER_ATTRIBUTE_NETWORK) 112 113 #define DRIVER_ANY_VERSION 0xffffffff 114 #define DRIVER_MAX_VERSION 4 115 116 struct print_architecture_table_node { 117 const char *long_archi; 118 const char *short_archi; 119 int version; 120 }; 121 122 bool nt_printing_init(struct messaging_context *msg_ctx); 123 124 const char *get_short_archi(const char *long_archi); 125 126 WERROR print_access_check(const struct auth_session_info *server_info, 127 struct messaging_context *msg_ctx, int snum, 128 int access_type); 129 130 WERROR nt_printer_guid_retrieve(TALLOC_CTX *mem_ctx, const char *printer, 131 struct GUID *pguid); 132 133 WERROR nt_printer_guid_store(struct messaging_context *msg_ctx, 134 const char *printer, struct GUID guid); 135 136 WERROR nt_printer_guid_get(TALLOC_CTX *mem_ctx, 137 const struct auth_session_info *session_info, 138 struct messaging_context *msg_ctx, 139 const char *printer, struct GUID *guid); 140 141 WERROR nt_printer_publish(TALLOC_CTX *mem_ctx, 142 const struct auth_session_info *server_info, 143 struct messaging_context *msg_ctx, 144 struct spoolss_PrinterInfo2 *pinfo2, 145 int action); 146 147 bool is_printer_published(TALLOC_CTX *mem_ctx, 148 const struct auth_session_info *server_info, 149 struct messaging_context *msg_ctx, 150 const char *servername, 151 const char *printer, 152 struct spoolss_PrinterInfo2 **info2); 153 154 WERROR check_published_printers(struct messaging_context *msg_ctx); 155 156 struct dcerpc_binding_handle; 157 158 bool printer_driver_in_use(TALLOC_CTX *mem_ctx, 159 struct dcerpc_binding_handle *b, 160 const struct spoolss_DriverInfo8 *r); 161 bool printer_driver_files_in_use(TALLOC_CTX *mem_ctx, 162 struct dcerpc_binding_handle *b, 163 struct spoolss_DriverInfo8 *r); 164 bool delete_driver_files(const struct auth_session_info *server_info, 165 const struct spoolss_DriverInfo8 *r); 166 167 WERROR move_driver_to_download_area(const struct auth_session_info *session_info, 168 const struct spoolss_AddDriverInfoCtr *r, 169 const char *driver_directory); 170 171 WERROR clean_up_driver_struct(TALLOC_CTX *mem_ctx, 172 const struct auth_session_info *session_info, 173 const struct spoolss_AddDriverInfoCtr *r, 174 uint32_t flags, 175 const char **driver_directory); 176 177 void map_printer_permissions(struct security_descriptor *sd); 178 179 void map_job_permissions(struct security_descriptor *sd); 180 181 bool print_time_access_check(const struct auth_session_info *server_info, 182 struct messaging_context *msg_ctx, 183 const char *servicename); 184 185 void nt_printer_remove(TALLOC_CTX *mem_ctx, 186 const struct auth_session_info *server_info, 187 struct messaging_context *msg_ctx, 188 const char *printer); 189 void nt_printer_add(TALLOC_CTX *mem_ctx, 190 const struct auth_session_info *server_info, 191 struct messaging_context *msg_ctx, 192 const char *printer); 193 194 #endif /* NT_PRINTING_H_ */ 195