mirror of
git://source.winehq.org/git/wine.git
synced 2024-07-21 09:44:10 +00:00
msv1_0: Implement Wow64 entry points in the Unix library.
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
1307d44f43
commit
78cdb254dd
|
@ -51,9 +51,7 @@ static NTSTATUS ntlm_check_version(void)
|
||||||
|
|
||||||
static void ntlm_cleanup( struct ntlm_ctx *ctx )
|
static void ntlm_cleanup( struct ntlm_ctx *ctx )
|
||||||
{
|
{
|
||||||
struct cleanup_params params = { ctx };
|
__wine_unix_call( ntlm_handle, unix_cleanup, ctx );
|
||||||
|
|
||||||
__wine_unix_call( ntlm_handle, unix_cleanup, ¶ms );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static NTSTATUS ntlm_chat( struct ntlm_ctx *ctx, char *buf, unsigned int buflen, unsigned int *retlen )
|
static NTSTATUS ntlm_chat( struct ntlm_ctx *ctx, char *buf, unsigned int buflen, unsigned int *retlen )
|
||||||
|
|
|
@ -54,7 +54,7 @@ struct com_buf
|
||||||
static SECURITY_STATUS read_line( struct ntlm_ctx *ctx, unsigned int *offset )
|
static SECURITY_STATUS read_line( struct ntlm_ctx *ctx, unsigned int *offset )
|
||||||
{
|
{
|
||||||
char *newline;
|
char *newline;
|
||||||
struct com_buf *com_buf = ctx->com_buf;
|
struct com_buf *com_buf = (struct com_buf *)(ULONG_PTR)ctx->com_buf;
|
||||||
|
|
||||||
if (!com_buf)
|
if (!com_buf)
|
||||||
{
|
{
|
||||||
|
@ -66,7 +66,7 @@ static SECURITY_STATUS read_line( struct ntlm_ctx *ctx, unsigned int *offset )
|
||||||
}
|
}
|
||||||
com_buf->size = INITIAL_BUFFER_SIZE;
|
com_buf->size = INITIAL_BUFFER_SIZE;
|
||||||
com_buf->offset = 0;
|
com_buf->offset = 0;
|
||||||
ctx->com_buf = com_buf;
|
ctx->com_buf = (ULONG_PTR)com_buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
do
|
do
|
||||||
|
@ -97,7 +97,7 @@ static SECURITY_STATUS read_line( struct ntlm_ctx *ctx, unsigned int *offset )
|
||||||
|
|
||||||
static NTSTATUS ntlm_chat( void *args )
|
static NTSTATUS ntlm_chat( void *args )
|
||||||
{
|
{
|
||||||
struct chat_params *params = args;
|
const struct chat_params *params = args;
|
||||||
struct ntlm_ctx *ctx = params->ctx;
|
struct ntlm_ctx *ctx = params->ctx;
|
||||||
struct com_buf *com_buf;
|
struct com_buf *com_buf;
|
||||||
SECURITY_STATUS status = SEC_E_OK;
|
SECURITY_STATUS status = SEC_E_OK;
|
||||||
|
@ -107,7 +107,7 @@ static NTSTATUS ntlm_chat( void *args )
|
||||||
write( ctx->pipe_out, "\n", 1 );
|
write( ctx->pipe_out, "\n", 1 );
|
||||||
|
|
||||||
if ((status = read_line( ctx, &offset )) != SEC_E_OK) return status;
|
if ((status = read_line( ctx, &offset )) != SEC_E_OK) return status;
|
||||||
com_buf = ctx->com_buf;
|
com_buf = (struct com_buf *)(ULONG_PTR)ctx->com_buf;
|
||||||
*params->retlen = strlen( com_buf->buffer );
|
*params->retlen = strlen( com_buf->buffer );
|
||||||
|
|
||||||
if (*params->retlen > params->buflen) return SEC_E_BUFFER_TOO_SMALL;
|
if (*params->retlen > params->buflen) return SEC_E_BUFFER_TOO_SMALL;
|
||||||
|
@ -128,9 +128,8 @@ static NTSTATUS ntlm_chat( void *args )
|
||||||
|
|
||||||
static NTSTATUS ntlm_cleanup( void *args )
|
static NTSTATUS ntlm_cleanup( void *args )
|
||||||
{
|
{
|
||||||
struct cleanup_params *params = args;
|
struct ntlm_ctx *ctx = args;
|
||||||
struct ntlm_ctx *ctx = params->ctx;
|
struct com_buf *com_buf = (struct com_buf *)(ULONG_PTR)ctx->com_buf;
|
||||||
struct com_buf *com_buf = ctx->com_buf;
|
|
||||||
|
|
||||||
if (!ctx || (ctx->mode != MODE_CLIENT && ctx->mode != MODE_SERVER)) return STATUS_INVALID_HANDLE;
|
if (!ctx || (ctx->mode != MODE_CLIENT && ctx->mode != MODE_SERVER)) return STATUS_INVALID_HANDLE;
|
||||||
ctx->mode = MODE_INVALID;
|
ctx->mode = MODE_INVALID;
|
||||||
|
@ -154,7 +153,7 @@ static NTSTATUS ntlm_cleanup( void *args )
|
||||||
|
|
||||||
static NTSTATUS ntlm_fork( void *args )
|
static NTSTATUS ntlm_fork( void *args )
|
||||||
{
|
{
|
||||||
struct fork_params *params = args;
|
const struct fork_params *params = args;
|
||||||
struct ntlm_ctx *ctx = params->ctx;
|
struct ntlm_ctx *ctx = params->ctx;
|
||||||
int pipe_in[2], pipe_out[2];
|
int pipe_in[2], pipe_out[2];
|
||||||
|
|
||||||
|
@ -216,7 +215,6 @@ static NTSTATUS ntlm_check_version( void *args )
|
||||||
char *argv[3], buf[80];
|
char *argv[3], buf[80];
|
||||||
NTSTATUS status = STATUS_DLL_NOT_FOUND;
|
NTSTATUS status = STATUS_DLL_NOT_FOUND;
|
||||||
struct fork_params params = { &ctx, argv };
|
struct fork_params params = { &ctx, argv };
|
||||||
struct cleanup_params cleanup_params = { &ctx };
|
|
||||||
int len;
|
int len;
|
||||||
|
|
||||||
argv[0] = (char *)"ntlm_auth";
|
argv[0] = (char *)"ntlm_auth";
|
||||||
|
@ -249,7 +247,7 @@ static NTSTATUS ntlm_check_version( void *args )
|
||||||
"Make sure that ntlm_auth >= %d.%d.%d is in your path. "
|
"Make sure that ntlm_auth >= %d.%d.%d is in your path. "
|
||||||
"Usually, you can find it in the winbind package of your distribution.\n",
|
"Usually, you can find it in the winbind package of your distribution.\n",
|
||||||
NTLM_AUTH_MAJOR_VERSION, NTLM_AUTH_MINOR_VERSION, NTLM_AUTH_MICRO_VERSION );
|
NTLM_AUTH_MAJOR_VERSION, NTLM_AUTH_MINOR_VERSION, NTLM_AUTH_MICRO_VERSION );
|
||||||
ntlm_cleanup( &cleanup_params );
|
ntlm_cleanup( &ctx );
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -260,3 +258,63 @@ const unixlib_entry_t __wine_unix_call_funcs[] =
|
||||||
ntlm_fork,
|
ntlm_fork,
|
||||||
ntlm_check_version,
|
ntlm_check_version,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#ifdef _WIN64
|
||||||
|
|
||||||
|
typedef ULONG PTR32;
|
||||||
|
|
||||||
|
static NTSTATUS wow64_ntlm_chat( void *args )
|
||||||
|
{
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
PTR32 ctx;
|
||||||
|
PTR32 buf;
|
||||||
|
UINT buflen;
|
||||||
|
PTR32 retlen;
|
||||||
|
} const *params32 = args;
|
||||||
|
|
||||||
|
struct chat_params params =
|
||||||
|
{
|
||||||
|
ULongToPtr(params32->ctx),
|
||||||
|
ULongToPtr(params32->buf),
|
||||||
|
params32->buflen,
|
||||||
|
ULongToPtr(params32->retlen)
|
||||||
|
};
|
||||||
|
|
||||||
|
return ntlm_chat( ¶ms );
|
||||||
|
}
|
||||||
|
|
||||||
|
static NTSTATUS wow64_ntlm_fork( void *args )
|
||||||
|
{
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
PTR32 ctx;
|
||||||
|
PTR32 argv;
|
||||||
|
} const *params32 = args;
|
||||||
|
|
||||||
|
struct fork_params params;
|
||||||
|
PTR32 *argv32 = ULongToPtr(params32->argv);
|
||||||
|
char **argv;
|
||||||
|
NTSTATUS ret;
|
||||||
|
int i, argc = 0;
|
||||||
|
|
||||||
|
while (argv32[argc]) argc++;
|
||||||
|
argv = malloc( (argc + 1) * sizeof(*argv) );
|
||||||
|
for (i = 0; i <= argc; i++) argv[i] = ULongToPtr( argv32[i] );
|
||||||
|
|
||||||
|
params.ctx = ULongToPtr(params32->ctx);
|
||||||
|
params.argv = argv;
|
||||||
|
ret = ntlm_fork( ¶ms );
|
||||||
|
free( argv );
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
const unixlib_entry_t __wine_unix_call_wow64_funcs[] =
|
||||||
|
{
|
||||||
|
wow64_ntlm_chat,
|
||||||
|
ntlm_cleanup,
|
||||||
|
wow64_ntlm_fork,
|
||||||
|
ntlm_check_version,
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* _WIN64 */
|
||||||
|
|
|
@ -57,7 +57,7 @@ struct arc4_info
|
||||||
#define FLAG_NEGOTIATE_NTLM2 0x00080000
|
#define FLAG_NEGOTIATE_NTLM2 0x00080000
|
||||||
#define FLAG_NEGOTIATE_KEY_EXCHANGE 0x40000000
|
#define FLAG_NEGOTIATE_KEY_EXCHANGE 0x40000000
|
||||||
|
|
||||||
struct com_buf;
|
typedef UINT64 com_buf_ptr;
|
||||||
|
|
||||||
struct ntlm_ctx
|
struct ntlm_ctx
|
||||||
{
|
{
|
||||||
|
@ -68,7 +68,7 @@ struct ntlm_ctx
|
||||||
int pipe_out;
|
int pipe_out;
|
||||||
char session_key[16];
|
char session_key[16];
|
||||||
unsigned int flags;
|
unsigned int flags;
|
||||||
struct com_buf *com_buf;
|
com_buf_ptr com_buf;
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
struct
|
struct
|
||||||
|
@ -99,11 +99,6 @@ struct chat_params
|
||||||
unsigned int *retlen;
|
unsigned int *retlen;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct cleanup_params
|
|
||||||
{
|
|
||||||
struct ntlm_ctx *ctx;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct fork_params
|
struct fork_params
|
||||||
{
|
{
|
||||||
struct ntlm_ctx *ctx;
|
struct ntlm_ctx *ctx;
|
||||||
|
|
Loading…
Reference in a new issue