diff --git a/dlls/ntdll/reg.c b/dlls/ntdll/reg.c index 8aba3aea9cc..178d5efa6be 100644 --- a/dlls/ntdll/reg.c +++ b/dlls/ntdll/reg.c @@ -68,7 +68,6 @@ NTSTATUS WINAPI NtCreateKey( PHANDLE retkey, ACCESS_MASK access, const OBJECT_AT req->access = access; req->attributes = attr->Attributes; req->options = options; - req->modif = 0; req->namelen = attr->ObjectName->Length; wine_server_add_data( req, attr->ObjectName->Buffer, attr->ObjectName->Length ); if (class) wine_server_add_data( req, class->Buffer, class->Length ); @@ -232,17 +231,13 @@ static NTSTATUS enumerate_key( HANDLE handle, int index, KEY_INFORMATION_CLASS i if (length > fixed_size) wine_server_set_reply( req, data_ptr, length - fixed_size ); if (!(ret = wine_server_call( req ))) { - LARGE_INTEGER modif; - - RtlSecondsSince1970ToTime( reply->modif, &modif ); - switch(info_class) { case KeyBasicInformation: { KEY_BASIC_INFORMATION keyinfo; fixed_size = (char *)keyinfo.Name - (char *)&keyinfo; - keyinfo.LastWriteTime = modif; + keyinfo.LastWriteTime.QuadPart = reply->modif; keyinfo.TitleIndex = 0; keyinfo.NameLength = reply->namelen; memcpy( info, &keyinfo, min( length, fixed_size ) ); @@ -252,7 +247,7 @@ static NTSTATUS enumerate_key( HANDLE handle, int index, KEY_INFORMATION_CLASS i { KEY_FULL_INFORMATION keyinfo; fixed_size = (char *)keyinfo.Class - (char *)&keyinfo; - keyinfo.LastWriteTime = modif; + keyinfo.LastWriteTime.QuadPart = reply->modif; keyinfo.TitleIndex = 0; keyinfo.ClassLength = wine_server_reply_size(reply); keyinfo.ClassOffset = keyinfo.ClassLength ? fixed_size : -1; @@ -269,7 +264,7 @@ static NTSTATUS enumerate_key( HANDLE handle, int index, KEY_INFORMATION_CLASS i { KEY_NODE_INFORMATION keyinfo; fixed_size = (char *)keyinfo.Name - (char *)&keyinfo; - keyinfo.LastWriteTime = modif; + keyinfo.LastWriteTime.QuadPart = reply->modif; keyinfo.TitleIndex = 0; if (reply->namelen < wine_server_reply_size(reply)) { diff --git a/include/wine/server_protocol.h b/include/wine/server_protocol.h index 63fadecd973..41c3fd9d276 100644 --- a/include/wine/server_protocol.h +++ b/include/wine/server_protocol.h @@ -1981,7 +1981,6 @@ struct create_key_request unsigned int access; unsigned int attributes; unsigned int options; - time_t modif; data_size_t namelen; /* VARARG(name,unicode_str,namelen); */ /* VARARG(class,unicode_str); */ @@ -2050,7 +2049,7 @@ struct enum_key_reply int values; int max_value; int max_data; - time_t modif; + timeout_t modif; data_size_t total; data_size_t namelen; /* VARARG(name,unicode_str,namelen); */ @@ -5072,6 +5071,6 @@ union generic_reply struct set_window_layered_info_reply set_window_layered_info_reply; }; -#define SERVER_PROTOCOL_VERSION 346 +#define SERVER_PROTOCOL_VERSION 347 #endif /* __WINE_WINE_SERVER_PROTOCOL_H */ diff --git a/server/protocol.def b/server/protocol.def index e0537bfa7b7..5061b547f5a 100644 --- a/server/protocol.def +++ b/server/protocol.def @@ -1525,7 +1525,6 @@ enum char_info_mode unsigned int access; /* desired access rights */ unsigned int attributes; /* object attributes */ unsigned int options; /* creation options */ - time_t modif; /* last modification time */ data_size_t namelen; /* length of key name in bytes */ VARARG(name,unicode_str,namelen); /* key name */ VARARG(class,unicode_str); /* class name */ @@ -1569,7 +1568,7 @@ enum char_info_mode int values; /* number of values */ int max_value; /* longest value name */ int max_data; /* longest value data */ - time_t modif; /* last modification time */ + timeout_t modif; /* last modification time */ data_size_t total; /* total length needed for full name and class */ data_size_t namelen; /* length of key name in bytes */ VARARG(name,unicode_str,namelen); /* key name */ diff --git a/server/registry.c b/server/registry.c index d2c0b23dcf8..d83486b8d1b 100644 --- a/server/registry.c +++ b/server/registry.c @@ -75,7 +75,7 @@ struct key int nb_values; /* count of allocated values in array */ struct key_value *values; /* values array */ unsigned int flags; /* flags */ - time_t modif; /* last modification time */ + timeout_t modif; /* last modification time */ struct list notify_list; /* list of notifications */ }; @@ -103,6 +103,7 @@ struct key_value /* the root of the registry tree */ static struct key *root_key; +static const timeout_t ticks_1601_to_1970 = (timeout_t)86400 * (369 * 365 + 89) * TICKS_PER_SEC; static const timeout_t save_period = 30 * -TICKS_PER_SEC; /* delay between periodic saves */ static struct timeout_user *save_timeout_user; /* saving timer */ @@ -245,7 +246,7 @@ static void save_subkeys( const struct key *key, const struct key *base, FILE *f { fprintf( f, "\n[" ); if (key != base) dump_path( key, base, f ); - fprintf( f, "] %ld\n", (long)key->modif ); + fprintf( f, "] %u\n", (unsigned int)((key->modif - ticks_1601_to_1970) / TICKS_PER_SEC) ); for (i = 0; i <= key->last_value; i++) dump_value( &key->values[i], f ); } for (i = 0; i <= key->last_subkey; i++) save_subkeys( key->subkeys[i], base, f ); @@ -391,7 +392,7 @@ static struct unicode_str *get_path_token( const struct unicode_str *path, struc } /* allocate a key object */ -static struct key *alloc_key( const struct unicode_str *name, time_t modif ) +static struct key *alloc_key( const struct unicode_str *name, timeout_t modif ) { struct key *key; if ((key = alloc_object( &key_ops ))) @@ -459,7 +460,7 @@ static void touch_key( struct key *key, unsigned int change ) { struct key *k; - key->modif = time(NULL); + key->modif = current_time; make_dirty( key ); /* do notifications */ @@ -495,7 +496,7 @@ static int grow_subkeys( struct key *key ) /* allocate a subkey for a given key, and return its index */ static struct key *alloc_subkey( struct key *parent, const struct unicode_str *name, - int index, time_t modif ) + int index, timeout_t modif ) { struct key *key; int i; @@ -600,7 +601,7 @@ static struct key *open_key( struct key *key, const struct unicode_str *name ) /* create a subkey */ static struct key *create_key( struct key *key, const struct unicode_str *name, - const struct unicode_str *class, int flags, time_t modif, int *created ) + const struct unicode_str *class, int flags, timeout_t modif, int *created ) { struct key *base; int index; @@ -616,7 +617,6 @@ static struct key *create_key( struct key *key, const struct unicode_str *name, set_error( STATUS_CHILD_MUST_BE_VOLATILE ); return NULL; } - if (!modif) modif = time(NULL); token.str = NULL; if (!get_path_token( name, &token )) return NULL; @@ -1105,12 +1105,13 @@ static int get_data_type( const char *buffer, int *type, int *parse_type ) /* load and create a key from the input file */ static struct key *load_key( struct key *base, const char *buffer, int flags, - int prefix_len, struct file_load_info *info, - int default_modif ) + int prefix_len, struct file_load_info *info ) { WCHAR *p; struct unicode_str name; - int res, modif; + int res; + unsigned int mod; + timeout_t modif = current_time; data_size_t len; if (!get_file_tmp_space( info, strlen(buffer) * sizeof(WCHAR) )) return NULL; @@ -1121,7 +1122,8 @@ static struct key *load_key( struct key *base, const char *buffer, int flags, file_read_error( "Malformed key", info ); return NULL; } - if (sscanf( buffer + res, " %d", &modif ) != 1) modif = default_modif; + if (sscanf( buffer + res, " %u", &mod ) == 1) + modif = (timeout_t)mod * TICKS_PER_SEC + ticks_1601_to_1970; p = info->tmp; while (prefix_len && *p) { if (*p++ == '\\') prefix_len--; } @@ -1302,7 +1304,6 @@ static void load_keys( struct key *key, const char *filename, FILE *f, int prefi struct key *subkey = NULL; struct file_load_info info; char *p; - int default_modif = time(NULL); int flags = (key->flags & KEY_VOLATILE) ? KEY_VOLATILE : KEY_DIRTY; info.filename = filename; @@ -1333,7 +1334,7 @@ static void load_keys( struct key *key, const char *filename, FILE *f, int prefi case '[': /* new key */ if (subkey) release_object( subkey ); if (prefix_len == -1) prefix_len = get_prefix_len( key, p + 1, &info ); - if (!(subkey = load_key( key, p + 1, flags, prefix_len, &info, default_modif ))) + if (!(subkey = load_key( key, p + 1, flags, prefix_len, &info ))) file_read_error( "Error creating key", &info ); break; case '@': /* default value */ @@ -1444,13 +1445,13 @@ void init_registry(void) if (fchdir( config_dir_fd ) == -1) fatal_perror( "chdir to config dir" ); /* create the root key */ - root_key = alloc_key( &root_name, time(NULL) ); + root_key = alloc_key( &root_name, current_time ); assert( root_key ); make_object_static( &root_key->obj ); /* load system.reg into Registry\Machine */ - if (!(key = create_key( root_key, &HKLM_name, NULL, 0, time(NULL), &dummy ))) + if (!(key = create_key( root_key, &HKLM_name, NULL, 0, current_time, &dummy ))) fatal_error( "could not create Machine registry key\n" ); load_init_registry_from_file( "system.reg", key ); @@ -1458,7 +1459,7 @@ void init_registry(void) /* load userdef.reg into Registry\User\.Default */ - if (!(key = create_key( root_key, &HKU_name, NULL, 0, time(NULL), &dummy ))) + if (!(key = create_key( root_key, &HKU_name, NULL, 0, current_time, &dummy ))) fatal_error( "could not create User\\.Default registry key\n" ); load_init_registry_from_file( "userdef.reg", key ); @@ -1469,7 +1470,7 @@ void init_registry(void) /* FIXME: match default user in token.c. should get from process token instead */ current_user_path = format_user_registry_path( security_interactive_sid, ¤t_user_str ); if (!current_user_path || - !(key = create_key( root_key, ¤t_user_str, NULL, 0, time(NULL), &dummy ))) + !(key = create_key( root_key, ¤t_user_str, NULL, 0, current_time, &dummy ))) fatal_error( "could not create HKEY_CURRENT_USER registry key\n" ); free( current_user_path ); load_init_registry_from_file( "user.reg", key ); @@ -1664,7 +1665,7 @@ DECL_HANDLER(create_key) { int flags = (req->options & REG_OPTION_VOLATILE) ? KEY_VOLATILE : KEY_DIRTY; - if ((key = create_key( parent, &name, &class, flags, req->modif, &reply->created ))) + if ((key = create_key( parent, &name, &class, flags, current_time, &reply->created ))) { reply->hkey = alloc_handle( current->process, key, access, req->attributes ); release_object( key ); @@ -1819,7 +1820,7 @@ DECL_HANDLER(load_registry) { int dummy; get_req_path( &name, !req->hkey ); - if ((key = create_key( parent, &name, NULL, KEY_DIRTY, time(NULL), &dummy ))) + if ((key = create_key( parent, &name, NULL, KEY_DIRTY, current_time, &dummy ))) { load_registry( key, req->file ); release_object( key ); diff --git a/server/trace.c b/server/trace.c index edb5440cedd..c13f1ac7764 100644 --- a/server/trace.c +++ b/server/trace.c @@ -1970,7 +1970,6 @@ static void dump_create_key_request( const struct create_key_request *req ) fprintf( stderr, " access=%08x,", req->access ); fprintf( stderr, " attributes=%08x,", req->attributes ); fprintf( stderr, " options=%08x,", req->options ); - fprintf( stderr, " modif=%ld,", (long)req->modif ); fprintf( stderr, " namelen=%u,", req->namelen ); fprintf( stderr, " name=" ); dump_varargs_unicode_str( min(cur_size,req->namelen) ); @@ -2024,7 +2023,9 @@ static void dump_enum_key_reply( const struct enum_key_reply *req ) fprintf( stderr, " values=%d,", req->values ); fprintf( stderr, " max_value=%d,", req->max_value ); fprintf( stderr, " max_data=%d,", req->max_data ); - fprintf( stderr, " modif=%ld,", (long)req->modif ); + fprintf( stderr, " modif=" ); + dump_timeout( &req->modif ); + fprintf( stderr, "," ); fprintf( stderr, " total=%u,", req->total ); fprintf( stderr, " namelen=%u,", req->namelen ); fprintf( stderr, " name=" ); diff --git a/tools/make_requests b/tools/make_requests index 8dd21a1ee0e..b4702fe4847 100755 --- a/tools/make_requests +++ b/tools/make_requests @@ -31,7 +31,6 @@ my %formats = "unsigned int" => "%08x", "unsigned long" => "%lx", "void*" => "%p", - "time_t" => "%ld (long)", "size_t" => "%lu (unsigned long)", "data_size_t" => "%u", "obj_handle_t" => "%p",