winehq.org
Sign In
Sign Up
Sign In
Sign Up
Manage this list
×
Keyboard Shortcuts
Thread View
j
: Next unread message
k
: Previous unread message
j a
: Jump to all threads
j l
: Jump to MailingList overview
2025
July
June
May
April
March
February
January
2024
December
November
October
September
August
July
June
May
April
March
February
January
2023
December
November
October
September
August
July
June
May
April
March
February
January
2022
December
November
October
September
August
July
June
May
April
March
February
January
2021
December
November
October
September
August
July
June
May
April
March
February
January
2020
December
November
October
September
August
July
June
May
April
March
February
January
2019
December
November
October
September
August
July
June
May
April
March
February
January
2018
December
November
October
September
August
July
June
May
April
March
February
January
2017
December
November
October
September
August
July
June
May
April
March
February
January
2016
December
November
October
September
August
July
June
May
April
March
February
January
2015
December
November
October
September
August
July
June
May
April
March
February
January
2014
December
November
October
September
August
July
June
May
April
March
February
January
2013
December
November
October
September
August
July
June
May
April
March
February
January
2012
December
November
October
September
August
July
June
May
April
March
February
January
2011
December
November
October
September
August
July
June
May
April
March
February
January
2010
December
November
October
September
August
July
June
May
April
March
February
January
2009
December
November
October
September
August
July
June
May
April
March
February
January
2008
December
November
October
September
August
July
June
May
April
March
February
January
2007
December
November
October
September
August
July
June
May
April
March
February
January
2006
December
November
October
September
August
July
June
May
April
March
February
January
2005
December
November
October
September
August
July
June
May
April
March
February
January
2004
December
November
October
September
August
July
June
May
April
March
February
January
2003
December
November
October
September
August
July
June
May
April
March
February
January
2002
December
November
October
September
August
July
June
May
April
March
February
January
2001
December
November
October
September
August
July
June
May
April
March
February
List overview
wine-commits
July 2021
----- 2025 -----
July 2025
June 2025
May 2025
April 2025
March 2025
February 2025
January 2025
----- 2024 -----
December 2024
November 2024
October 2024
September 2024
August 2024
July 2024
June 2024
May 2024
April 2024
March 2024
February 2024
January 2024
----- 2023 -----
December 2023
November 2023
October 2023
September 2023
August 2023
July 2023
June 2023
May 2023
April 2023
March 2023
February 2023
January 2023
----- 2022 -----
December 2022
November 2022
October 2022
September 2022
August 2022
July 2022
June 2022
May 2022
April 2022
March 2022
February 2022
January 2022
----- 2021 -----
December 2021
November 2021
October 2021
September 2021
August 2021
July 2021
June 2021
May 2021
April 2021
March 2021
February 2021
January 2021
----- 2020 -----
December 2020
November 2020
October 2020
September 2020
August 2020
July 2020
June 2020
May 2020
April 2020
March 2020
February 2020
January 2020
----- 2019 -----
December 2019
November 2019
October 2019
September 2019
August 2019
July 2019
June 2019
May 2019
April 2019
March 2019
February 2019
January 2019
----- 2018 -----
December 2018
November 2018
October 2018
September 2018
August 2018
July 2018
June 2018
May 2018
April 2018
March 2018
February 2018
January 2018
----- 2017 -----
December 2017
November 2017
October 2017
September 2017
August 2017
July 2017
June 2017
May 2017
April 2017
March 2017
February 2017
January 2017
----- 2016 -----
December 2016
November 2016
October 2016
September 2016
August 2016
July 2016
June 2016
May 2016
April 2016
March 2016
February 2016
January 2016
----- 2015 -----
December 2015
November 2015
October 2015
September 2015
August 2015
July 2015
June 2015
May 2015
April 2015
March 2015
February 2015
January 2015
----- 2014 -----
December 2014
November 2014
October 2014
September 2014
August 2014
July 2014
June 2014
May 2014
April 2014
March 2014
February 2014
January 2014
----- 2013 -----
December 2013
November 2013
October 2013
September 2013
August 2013
July 2013
June 2013
May 2013
April 2013
March 2013
February 2013
January 2013
----- 2012 -----
December 2012
November 2012
October 2012
September 2012
August 2012
July 2012
June 2012
May 2012
April 2012
March 2012
February 2012
January 2012
----- 2011 -----
December 2011
November 2011
October 2011
September 2011
August 2011
July 2011
June 2011
May 2011
April 2011
March 2011
February 2011
January 2011
----- 2010 -----
December 2010
November 2010
October 2010
September 2010
August 2010
July 2010
June 2010
May 2010
April 2010
March 2010
February 2010
January 2010
----- 2009 -----
December 2009
November 2009
October 2009
September 2009
August 2009
July 2009
June 2009
May 2009
April 2009
March 2009
February 2009
January 2009
----- 2008 -----
December 2008
November 2008
October 2008
September 2008
August 2008
July 2008
June 2008
May 2008
April 2008
March 2008
February 2008
January 2008
----- 2007 -----
December 2007
November 2007
October 2007
September 2007
August 2007
July 2007
June 2007
May 2007
April 2007
March 2007
February 2007
January 2007
----- 2006 -----
December 2006
November 2006
October 2006
September 2006
August 2006
July 2006
June 2006
May 2006
April 2006
March 2006
February 2006
January 2006
----- 2005 -----
December 2005
November 2005
October 2005
September 2005
August 2005
July 2005
June 2005
May 2005
April 2005
March 2005
February 2005
January 2005
----- 2004 -----
December 2004
November 2004
October 2004
September 2004
August 2004
July 2004
June 2004
May 2004
April 2004
March 2004
February 2004
January 2004
----- 2003 -----
December 2003
November 2003
October 2003
September 2003
August 2003
July 2003
June 2003
May 2003
April 2003
March 2003
February 2003
January 2003
----- 2002 -----
December 2002
November 2002
October 2002
September 2002
August 2002
July 2002
June 2002
May 2002
April 2002
March 2002
February 2002
January 2002
----- 2001 -----
December 2001
November 2001
October 2001
September 2001
August 2001
July 2001
June 2001
May 2001
April 2001
March 2001
February 2001
wine-commits@winehq.org
1 participants
728 discussions
Start a n
N
ew thread
Zebediah Figura : d3d11: Forbid map types other than DISCARD and NOOVERWRITE on a deferred context.
by Alexandre Julliard
01 Jul '21
01 Jul '21
Module: wine Branch: master Commit: 1e9c094aa66e1eb9c2b6b891dfbec99816b67d7a URL:
https://source.winehq.org/git/wine.git/?a=commit;h=1e9c094aa66e1eb9c2b6b891…
Author: Zebediah Figura <z.figura12(a)gmail.com> Date: Wed Jun 30 17:38:32 2021 -0500 d3d11: Forbid map types other than DISCARD and NOOVERWRITE on a deferred context. Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com> Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/d3d11/device.c | 4 ++++ dlls/d3d11/tests/d3d11.c | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/dlls/d3d11/device.c b/dlls/d3d11/device.c index 56f34c70ea1..d043af7051a 100644 --- a/dlls/d3d11/device.c +++ b/dlls/d3d11/device.c @@ -744,6 +744,10 @@ static HRESULT STDMETHODCALLTYPE d3d11_device_context_Map(ID3D11DeviceContext1 * if (map_flags) FIXME("Ignoring map_flags %#x.\n", map_flags); + if (context->type != D3D11_DEVICE_CONTEXT_IMMEDIATE + && map_type != D3D11_MAP_WRITE_DISCARD && map_type != D3D11_MAP_WRITE_NO_OVERWRITE) + return E_INVALIDARG; + wined3d_resource = wined3d_resource_from_d3d11_resource(resource); wined3d_mutex_lock(); diff --git a/dlls/d3d11/tests/d3d11.c b/dlls/d3d11/tests/d3d11.c index a2858ed0155..6d5141ea90d 100644 --- a/dlls/d3d11/tests/d3d11.c +++ b/dlls/d3d11/tests/d3d11.c @@ -33046,7 +33046,7 @@ static void test_deferred_context_map(void) ok(hr == E_INVALIDARG, "Got unexpected hr %#x.\n", hr); hr = ID3D11DeviceContext_Map(deferred, (ID3D11Resource *)buffer, 0, D3D11_MAP_WRITE, 0, &map_desc); - todo_wine ok(hr == E_INVALIDARG, "Got unexpected hr %#x.\n", hr); + ok(hr == E_INVALIDARG, "Got unexpected hr %#x.\n", hr); hr = ID3D11DeviceContext_Map(deferred, (ID3D11Resource *)buffer, 0, D3D11_MAP_WRITE_NO_OVERWRITE, 0, &map_desc); todo_wine ok(hr == D3D11_ERROR_DEFERRED_CONTEXT_MAP_WITHOUT_INITIAL_DISCARD, "Got unexpected hr %#x.\n", hr);
1
0
0
0
Zebediah Figura : wined3d: Implement wined3d_deferred_context_prepare_upload_bo().
by Alexandre Julliard
01 Jul '21
01 Jul '21
Module: wine Branch: master Commit: 75928a6a88ef6337946cc0f23619fcd844e009db URL:
https://source.winehq.org/git/wine.git/?a=commit;h=75928a6a88ef6337946cc0f2…
Author: Zebediah Figura <z.figura12(a)gmail.com> Date: Wed Jun 30 17:38:31 2021 -0500 wined3d: Implement wined3d_deferred_context_prepare_upload_bo(). Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com> Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/wined3d/cs.c | 65 ++++++++++++++++++++++++++++++++++++++++-- dlls/wined3d/wined3d_private.h | 5 ++++ 2 files changed, 67 insertions(+), 3 deletions(-) diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c index 700ff17ee96..ed6bd6e0aaf 100644 --- a/dlls/wined3d/cs.c +++ b/dlls/wined3d/cs.c @@ -26,6 +26,13 @@ WINE_DECLARE_DEBUG_CHANNEL(fps); #define WINED3D_INITIAL_CS_SIZE 4096 +struct wined3d_deferred_upload +{ + struct wined3d_resource *resource; + unsigned int sub_resource_idx; + uint8_t *sysmem; +}; + struct wined3d_command_list { LONG refcount; @@ -38,6 +45,9 @@ struct wined3d_command_list SIZE_T resource_count; struct wined3d_resource **resources; + SIZE_T upload_count; + struct wined3d_deferred_upload *uploads; + /* List of command lists queued for execution on this command list. We might * be the only thing holding a pointer to another command list, so we need * to hold a reference here (and in wined3d_deferred_context) as well. */ @@ -48,9 +58,13 @@ struct wined3d_command_list static void wined3d_command_list_destroy_object(void *object) { struct wined3d_command_list *list = object; + SIZE_T i; TRACE("list %p.\n", list); + for (i = 0; i < list->upload_count; ++i) + heap_free(list->uploads[i].sysmem); + heap_free(list->resources); heap_free(list->data); heap_free(list); @@ -3343,6 +3357,9 @@ struct wined3d_deferred_context SIZE_T resource_count, resources_capacity; struct wined3d_resource **resources; + SIZE_T upload_count, uploads_capacity; + struct wined3d_deferred_upload *uploads; + /* List of command lists queued for execution on this context. A command * list can be the only thing holding a pointer to another command list, so * we need to hold a reference here and in wined3d_command_list as well. */ @@ -3401,9 +3418,45 @@ static void *wined3d_deferred_context_prepare_upload_bo(struct wined3d_device_co struct wined3d_resource *resource, unsigned int sub_resource_idx, const struct wined3d_box *box, unsigned int row_pitch, unsigned int slice_pitch, uint32_t flags, struct wined3d_const_bo_address *address) { - FIXME("context %p, resource %p, sub_resource_idx %u, box %p, flags %#x, address %p, stub!\n", - context, resource, sub_resource_idx, box, flags, address); - return NULL; + struct wined3d_deferred_context *deferred = wined3d_deferred_context_from_context(context); + const struct wined3d_format *format = resource->format; + struct wined3d_deferred_upload *upload; + uint8_t *sysmem, *map_ptr; + size_t size; + + size = (box->back - box->front - 1) * slice_pitch + + ((box->bottom - box->top - 1) / format->block_height) * row_pitch + + ((box->right - box->left + format->block_width - 1) / format->block_width) * format->block_byte_count; + + if (!(flags & WINED3D_MAP_WRITE)) + { + WARN("Flags %#x are not valid on a deferred context.\n", flags); + return NULL; + } + + if (flags & ~(WINED3D_MAP_WRITE | WINED3D_MAP_DISCARD)) + { + FIXME("Unhandled flags %#x.\n", flags); + return NULL; + } + + if (!wined3d_array_reserve((void **)&deferred->uploads, &deferred->uploads_capacity, + deferred->upload_count + 1, sizeof(*deferred->uploads))) + return NULL; + + if (!(sysmem = heap_alloc(size + RESOURCE_ALIGNMENT - 1))) + return NULL; + + upload = &deferred->uploads[deferred->upload_count++]; + upload->resource = resource; + wined3d_resource_incref(resource); + upload->sub_resource_idx = sub_resource_idx; + upload->sysmem = sysmem; + + address->buffer_object = 0; + map_ptr = (uint8_t *)align((size_t)sysmem, RESOURCE_ALIGNMENT); + address->addr = map_ptr; + return map_ptr; } static HRESULT wined3d_deferred_context_map(struct wined3d_device_context *context, struct wined3d_resource *resource, @@ -3527,6 +3580,12 @@ void CDECL wined3d_deferred_context_destroy(struct wined3d_device_context *conte for (i = 0; i < deferred->resource_count; ++i) wined3d_resource_decref(deferred->resources[i]); + + for (i = 0; i < deferred->upload_count; ++i) + { + wined3d_resource_decref(deferred->uploads[i].resource); + heap_free(deferred->uploads[i].sysmem); + } heap_free(deferred->resources); wined3d_state_destroy(deferred->c.state); diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 83a0a48471b..491445a4f00 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -63,6 +63,11 @@ #include "wine/rbtree.h" #include "wine/wgl_driver.h" +static inline size_t align(size_t addr, size_t alignment) +{ + return (addr + (alignment - 1)) & ~(alignment - 1); +} + #define MAKEDWORD_VERSION(maj, min) (((maj & 0xffffu) << 16) | (min & 0xffffu)) /* Driver quirks */
1
0
0
0
Zebediah Figura : wined3d: Introduce a prepare_upload_bo device context operation and use it to upload sub-resource data.
by Alexandre Julliard
01 Jul '21
01 Jul '21
Module: wine Branch: master Commit: cf55fc493c43bddd02383b10060981f18854b50d URL:
https://source.winehq.org/git/wine.git/?a=commit;h=cf55fc493c43bddd02383b10…
Author: Zebediah Figura <z.figura12(a)gmail.com> Date: Wed Jun 30 17:38:30 2021 -0500 wined3d: Introduce a prepare_upload_bo device context operation and use it to upload sub-resource data. Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com> Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/wined3d/buffer.c | 2 +- dlls/wined3d/cs.c | 54 ++++++++++++++++++++++++++++++++++++++++++ dlls/wined3d/device.c | 3 ++- dlls/wined3d/texture.c | 2 +- dlls/wined3d/wined3d_private.h | 6 +++++ 5 files changed, 64 insertions(+), 3 deletions(-) diff --git a/dlls/wined3d/buffer.c b/dlls/wined3d/buffer.c index 9d22a909fb6..4c5e2054fe0 100644 --- a/dlls/wined3d/buffer.c +++ b/dlls/wined3d/buffer.c @@ -1063,7 +1063,7 @@ static void wined3d_buffer_init_data(struct wined3d_buffer *buffer, if (buffer->flags & WINED3D_BUFFER_USE_BO) { wined3d_box_set(&box, 0, 0, resource->size, 1, 0, 1); - device->cs->c.ops->update_sub_resource(&device->cs->c, resource, + wined3d_device_context_emit_update_sub_resource(&device->cs->c, resource, 0, &box, data->data, data->row_pitch, data->slice_pitch); } else diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c index 47bc36d4cc0..700ff17ee96 100644 --- a/dlls/wined3d/cs.c +++ b/dlls/wined3d/cs.c @@ -2649,6 +2649,40 @@ done: wined3d_resource_release(resource); } +void wined3d_device_context_emit_update_sub_resource(struct wined3d_device_context *context, + struct wined3d_resource *resource, unsigned int sub_resource_idx, const struct wined3d_box *box, + const void *data, unsigned int row_pitch, unsigned int slice_pitch) +{ + struct wined3d_const_bo_address src_addr; + void *map_ptr; + + if ((map_ptr = context->ops->prepare_upload_bo(context, resource, sub_resource_idx, box, + row_pitch, slice_pitch, WINED3D_MAP_WRITE, &src_addr))) + { + struct wined3d_cs_update_sub_resource *op; + + wined3d_format_copy_data(resource->format, data, row_pitch, slice_pitch, map_ptr, row_pitch, slice_pitch, + box->right - box->left, box->bottom - box->top, box->back - box->front); + + op = wined3d_device_context_require_space(context, sizeof(*op), WINED3D_CS_QUEUE_DEFAULT); + op->opcode = WINED3D_CS_OP_UPDATE_SUB_RESOURCE; + op->resource = resource; + op->sub_resource_idx = sub_resource_idx; + op->box = *box; + op->addr = src_addr; + op->row_pitch = row_pitch; + op->slice_pitch = slice_pitch; + + wined3d_device_context_acquire_resource(context, resource); + + wined3d_device_context_submit(context, WINED3D_CS_QUEUE_DEFAULT); + } + else + { + context->ops->update_sub_resource(context, resource, sub_resource_idx, box, data, row_pitch, slice_pitch); + } +} + static void wined3d_cs_update_sub_resource(struct wined3d_device_context *context, struct wined3d_resource *resource, unsigned int sub_resource_idx, const struct wined3d_box *box, const void *data, unsigned int row_pitch, unsigned int slice_pitch) @@ -2946,12 +2980,21 @@ static void wined3d_cs_st_finish(struct wined3d_device_context *context, enum wi { } +static void *wined3d_cs_prepare_upload_bo(struct wined3d_device_context *context, struct wined3d_resource *resource, + unsigned int sub_resource_idx, const struct wined3d_box *box, unsigned int row_pitch, + unsigned int slice_pitch, uint32_t flags, struct wined3d_const_bo_address *address) +{ + /* FIXME: We would like to return mapped or newly allocated memory here. */ + return NULL; +} + static const struct wined3d_device_context_ops wined3d_cs_st_ops = { wined3d_cs_st_require_space, wined3d_cs_st_submit, wined3d_cs_st_finish, wined3d_cs_st_push_constants, + wined3d_cs_prepare_upload_bo, wined3d_cs_map, wined3d_cs_unmap, wined3d_cs_update_sub_resource, @@ -3080,6 +3123,7 @@ static const struct wined3d_device_context_ops wined3d_cs_mt_ops = wined3d_cs_mt_submit, wined3d_cs_mt_finish, wined3d_cs_mt_push_constants, + wined3d_cs_prepare_upload_bo, wined3d_cs_map, wined3d_cs_unmap, wined3d_cs_update_sub_resource, @@ -3353,6 +3397,15 @@ static void wined3d_deferred_context_push_constants(struct wined3d_device_contex FIXME("context %p, p %#x, start_idx %u, count %u, constants %p, stub!\n", context, p, start_idx, count, constants); } +static void *wined3d_deferred_context_prepare_upload_bo(struct wined3d_device_context *context, + struct wined3d_resource *resource, unsigned int sub_resource_idx, const struct wined3d_box *box, + unsigned int row_pitch, unsigned int slice_pitch, uint32_t flags, struct wined3d_const_bo_address *address) +{ + FIXME("context %p, resource %p, sub_resource_idx %u, box %p, flags %#x, address %p, stub!\n", + context, resource, sub_resource_idx, box, flags, address); + return NULL; +} + static HRESULT wined3d_deferred_context_map(struct wined3d_device_context *context, struct wined3d_resource *resource, unsigned int sub_resource_idx, void **map_ptr, const struct wined3d_box *box, unsigned int flags) { @@ -3430,6 +3483,7 @@ static const struct wined3d_device_context_ops wined3d_deferred_context_ops = wined3d_deferred_context_submit, wined3d_deferred_context_finish, wined3d_deferred_context_push_constants, + wined3d_deferred_context_prepare_upload_bo, wined3d_deferred_context_map, wined3d_deferred_context_unmap, wined3d_deferred_context_update_sub_resource, diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index 701041962e5..ce618b594de 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -4681,7 +4681,8 @@ void CDECL wined3d_device_context_update_sub_resource(struct wined3d_device_cont return; } - context->ops->update_sub_resource(context, resource, sub_resource_idx, box, data, row_pitch, depth_pitch); + wined3d_device_context_emit_update_sub_resource(context, resource, + sub_resource_idx, box, data, row_pitch, depth_pitch); } void CDECL wined3d_device_context_resolve_sub_resource(struct wined3d_device_context *context, diff --git a/dlls/wined3d/texture.c b/dlls/wined3d/texture.c index 62f38a1d592..c1247fbc56b 100644 --- a/dlls/wined3d/texture.c +++ b/dlls/wined3d/texture.c @@ -4350,7 +4350,7 @@ HRESULT CDECL wined3d_texture_create(struct wined3d_device *device, const struct for (i = 0; i < sub_count; ++i) { wined3d_texture_get_level_box(*texture, i % (*texture)->level_count, &box); - device->cs->c.ops->update_sub_resource(&device->cs->c, &(*texture)->resource, + wined3d_device_context_emit_update_sub_resource(&device->cs->c, &(*texture)->resource, i, &box, data[i].data, data[i].row_pitch, data[i].slice_pitch); } } diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index c70b0f7c338..83a0a48471b 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -4704,6 +4704,9 @@ struct wined3d_device_context_ops void (*finish)(struct wined3d_device_context *context, enum wined3d_cs_queue_id queue_id); void (*push_constants)(struct wined3d_device_context *context, enum wined3d_push_constants p, unsigned int start_idx, unsigned int count, const void *constants); + void *(*prepare_upload_bo)(struct wined3d_device_context *context, struct wined3d_resource *resource, + unsigned int sub_resource_idx, const struct wined3d_box *box, unsigned int row_pitch, + unsigned int slice_pitch, uint32_t flags, struct wined3d_const_bo_address *address); HRESULT (*map)(struct wined3d_device_context *context, struct wined3d_resource *resource, unsigned int sub_resource_idx, void **map_ptr, const struct wined3d_box *box, unsigned int flags); HRESULT (*unmap)(struct wined3d_device_context *context, struct wined3d_resource *resource, @@ -4855,6 +4858,9 @@ void wined3d_device_context_emit_set_vertex_declaration(struct wined3d_device_co struct wined3d_vertex_declaration *declaration) DECLSPEC_HIDDEN; void wined3d_device_context_emit_set_viewports(struct wined3d_device_context *context, unsigned int viewport_count, const struct wined3d_viewport *viewports) DECLSPEC_HIDDEN; +void wined3d_device_context_emit_update_sub_resource(struct wined3d_device_context *context, + struct wined3d_resource *resource, unsigned int sub_resource_idx, const struct wined3d_box *box, + const void *data, unsigned int row_pitch, unsigned int slice_pitch) DECLSPEC_HIDDEN; static inline void wined3d_resource_wait_idle(struct wined3d_resource *resource) {
1
0
0
0
Eric Pouech : winedbg: Accept hex values in command line.
by Alexandre Julliard
01 Jul '21
01 Jul '21
Module: wine Branch: master Commit: 8600ba293449023f463ee807b7091f99c6c9f0fe URL:
https://source.winehq.org/git/wine.git/?a=commit;h=8600ba293449023f463ee807…
Author: Eric Pouech <eric.pouech(a)gmail.com> Date: Thu Jul 1 16:33:44 2021 +0200 winedbg: Accept hex values in command line. Signed-off-by: Eric Pouech <eric.pouech(a)gmail.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- programs/winedbg/tgt_active.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/programs/winedbg/tgt_active.c b/programs/winedbg/tgt_active.c index c9072d5b81c..508e1c58040 100644 --- a/programs/winedbg/tgt_active.c +++ b/programs/winedbg/tgt_active.c @@ -667,7 +667,7 @@ static BOOL str2int(const char* str, DWORD_PTR* val) { char* ptr; - *val = strtol(str, &ptr, 10); + *val = strtol(str, &ptr, 0); return str < ptr && !*ptr; }
1
0
0
0
Gijs Vermeulen : amstream: Handle AMMSF_RENDERALLSTREAMS in IAMMultiMediaStream::OpenFile().
by Alexandre Julliard
01 Jul '21
01 Jul '21
Module: wine Branch: master Commit: 3319526fda6cb7955df617c50766820caa807eaa URL:
https://source.winehq.org/git/wine.git/?a=commit;h=3319526fda6cb7955df617c5…
Author: Gijs Vermeulen <gijsvrm(a)gmail.com> Date: Thu Jul 1 12:42:30 2021 +0200 amstream: Handle AMMSF_RENDERALLSTREAMS in IAMMultiMediaStream::OpenFile(). Signed-off-by: Gijs Vermeulen <gijsvrm(a)gmail.com> Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/amstream/multimedia.c | 5 ++++- dlls/amstream/tests/amstream.c | 44 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/dlls/amstream/multimedia.c b/dlls/amstream/multimedia.c index 6bac95a243b..98ffc95a54a 100644 --- a/dlls/amstream/multimedia.c +++ b/dlls/amstream/multimedia.c @@ -471,9 +471,12 @@ static HRESULT WINAPI multimedia_stream_OpenFile(IAMMultiMediaStream *iface, if (SUCCEEDED(ret = IGraphBuilder_QueryInterface(This->graph, &IID_IFilterGraph2, (void **)&graph))) { - ret = IFilterGraph2_RenderEx(graph, This->ipin, AM_RENDEREX_RENDERTOEXISTINGRENDERERS, NULL); + DWORD renderflags = (flags & AMMSF_RENDERALLSTREAMS) ? 0 : AM_RENDEREX_RENDERTOEXISTINGRENDERERS; + + ret = IFilterGraph2_RenderEx(graph, This->ipin, renderflags, NULL); if (ret == VFW_E_CANNOT_RENDER) ret = VFW_E_CANNOT_CONNECT; else if (ret == VFW_S_PARTIAL_RENDER) ret = S_OK; + IFilterGraph2_Release(graph); } else diff --git a/dlls/amstream/tests/amstream.c b/dlls/amstream/tests/amstream.c index 1480f723a1c..a43eec77ec2 100644 --- a/dlls/amstream/tests/amstream.c +++ b/dlls/amstream/tests/amstream.c @@ -451,6 +451,50 @@ static void test_openfile(const WCHAR *test_avi_path) ref = IAMMultiMediaStream_Release(mmstream); ok(!ref, "Got outstanding refcount %d.\n", ref); + mmstream = create_ammultimediastream(); + + hr = IAMMultiMediaStream_GetFilterGraph(mmstream, &graph); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(!graph, "Expected NULL graph.\n"); + + hr = IAMMultiMediaStream_GetFilter(mmstream, &filter); + ok(!!filter, "Expected non-NULL filter.\n"); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + check_interface(filter, &IID_IMediaSeeking, FALSE); + + hr = IAMMultiMediaStream_OpenFile(mmstream, test_avi_path, AMMSF_RENDERALLSTREAMS); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + check_interface(filter, &IID_IMediaSeeking, FALSE); + + hr = IAMMultiMediaStream_GetFilterGraph(mmstream, &graph); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(!!graph, "Expected non-NULL graph.\n"); + + hr = IGraphBuilder_QueryInterface(graph, &IID_IMediaFilter, (void **)&media_filter); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IAMMultiMediaStream_SetState(mmstream, STREAMSTATE_RUN); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + clock = NULL; + IMediaFilter_GetSyncSource(media_filter, &clock); + ok(!!clock, "Expected non-NULL clock.\n"); + + hr = IAMMultiMediaStream_SetState(mmstream, STREAMSTATE_STOP); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + ref = IAMMultiMediaStream_Release(mmstream); + ok(!ref, "Got outstanding refcount %d.\n", ref); + IMediaFilter_Release(media_filter); + ref = IGraphBuilder_Release(graph); + ok(!ref, "Got outstanding refcount %d.\n", ref); + ref = IMediaStreamFilter_Release(filter); + ok(!ref, "Got outstanding refcount %d.\n", ref); + ref = IReferenceClock_Release(clock); + ok(!ref, "Got outstanding refcount %d.\n", ref); + mmstream = create_ammultimediastream(); hr = IAMMultiMediaStream_GetFilterGraph(mmstream, &graph); ok(hr == S_OK, "Got hr %#x.\n", hr);
1
0
0
0
Gijs Vermeulen : amstream/tests: Clarify flags passed to IAMMultiMediaStream::OpenFile().
by Alexandre Julliard
01 Jul '21
01 Jul '21
Module: wine Branch: master Commit: 5514dbc29325a10a882d0459cd2c13365950bac7 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=5514dbc29325a10a882d0459…
Author: Gijs Vermeulen <gijsvrm(a)gmail.com> Date: Thu Jul 1 12:42:29 2021 +0200 amstream/tests: Clarify flags passed to IAMMultiMediaStream::OpenFile(). Signed-off-by: Gijs Vermeulen <gijsvrm(a)gmail.com> Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/amstream/tests/amstream.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/dlls/amstream/tests/amstream.c b/dlls/amstream/tests/amstream.c index db2d6e977ca..1480f723a1c 100644 --- a/dlls/amstream/tests/amstream.c +++ b/dlls/amstream/tests/amstream.c @@ -462,7 +462,7 @@ static void test_openfile(const WCHAR *test_avi_path) check_interface(filter, &IID_IMediaSeeking, FALSE); - hr = IAMMultiMediaStream_OpenFile(mmstream, test_avi_path, 0); + hr = IAMMultiMediaStream_OpenFile(mmstream, test_avi_path, AMMSF_RENDERTOEXISTING); ok(hr == VFW_E_CANNOT_CONNECT, "Got hr %#x.\n", hr); check_interface(filter, &IID_IMediaSeeking, FALSE); @@ -489,7 +489,7 @@ static void test_openfile(const WCHAR *test_avi_path) check_interface(filter, &IID_IMediaSeeking, FALSE); - hr = IAMMultiMediaStream_OpenFile(mmstream, test_avi_path, 0); + hr = IAMMultiMediaStream_OpenFile(mmstream, test_avi_path, AMMSF_RENDERTOEXISTING); ok(hr == S_OK, "Got hr %#x.\n", hr); check_interface(filter, &IID_IMediaSeeking, TRUE); @@ -585,7 +585,7 @@ static void test_mmstream_get_duration(const WCHAR *test_avi_path) ok(hr == S_OK || hr == VFW_E_NO_AUDIO_HARDWARE, "Got hr %#x.\n", hr); audio_hr = hr; - hr = IAMMultiMediaStream_OpenFile(mmstream, test_avi_path, 0); + hr = IAMMultiMediaStream_OpenFile(mmstream, test_avi_path, AMMSF_RENDERTOEXISTING); ok(hr == S_OK, "Got hr %#x.\n", hr); duration = 0xdeadbeefdeadbeefULL; @@ -618,7 +618,7 @@ static void test_mmstream_get_duration(const WCHAR *test_avi_path) mmstream = create_ammultimediastream(); - hr = IAMMultiMediaStream_OpenFile(mmstream, test_avi_path, 0); + hr = IAMMultiMediaStream_OpenFile(mmstream, test_avi_path, AMMSF_RENDERTOEXISTING); ok(hr == VFW_E_CANNOT_CONNECT, "Got hr %#x.\n", hr); duration = 0xdeadbeefdeadbeefULL; @@ -1778,7 +1778,7 @@ static void test_media_streams(void) } /* Test open file with no filename */ - hr = IAMMultiMediaStream_OpenFile(pams, NULL, 0); + hr = IAMMultiMediaStream_OpenFile(pams, NULL, AMMSF_RENDERTOEXISTING); ok(hr == E_POINTER, "IAMMultiMediaStream_OpenFile returned %x instead of %x\n", hr, E_POINTER); if (video_stream)
1
0
0
0
Rémi Bernon : hidclass.sys: Stop accepting IRPs after device removal.
by Alexandre Julliard
01 Jul '21
01 Jul '21
Module: wine Branch: master Commit: fb7a5e660e354c9a87b4f32a4779cf65adc5bb50 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=fb7a5e660e354c9a87b4f32a…
Author: Rémi Bernon <rbernon(a)codeweavers.com> Date: Thu Jul 1 18:53:25 2021 +0200 hidclass.sys: Stop accepting IRPs after device removal. Handle IRP_MN_SURPRISE_REMOVAL and notify device thread to stop it, but only wait for it in IRP_MN_REMOVE_DEVICE, as it's probably waiting for an IRP sent to the lower driver, which needs to be notified of removal too first. Signed-off-by: Rémi Bernon <rbernon(a)codeweavers.com> Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/hidclass.sys/device.c | 39 +++++++++++++++++++++++++++++++++++++++ dlls/hidclass.sys/hid.h | 3 +++ dlls/hidclass.sys/pnp.c | 31 ++++++++++++++++++++++--------- 3 files changed, 64 insertions(+), 9 deletions(-) diff --git a/dlls/hidclass.sys/device.c b/dlls/hidclass.sys/device.c index 82366ad1888..d3f5fa90fc7 100644 --- a/dlls/hidclass.sys/device.c +++ b/dlls/hidclass.sys/device.c @@ -431,11 +431,24 @@ NTSTATUS WINAPI pdo_ioctl(DEVICE_OBJECT *device, IRP *irp) NTSTATUS rc = STATUS_SUCCESS; IO_STACK_LOCATION *irpsp = IoGetCurrentIrpStackLocation( irp ); BASE_DEVICE_EXTENSION *ext = device->DeviceExtension; + BOOL removed; + KIRQL irql; irp->IoStatus.Information = 0; TRACE("device %p ioctl(%x)\n", device, irpsp->Parameters.DeviceIoControl.IoControlCode); + KeAcquireSpinLock(&ext->u.pdo.lock, &irql); + removed = ext->u.pdo.removed; + KeReleaseSpinLock(&ext->u.pdo.lock, irql); + + if (removed) + { + irp->IoStatus.Status = STATUS_DELETE_PENDING; + IoCompleteRequest(irp, IO_NO_INCREMENT); + return STATUS_DELETE_PENDING; + } + switch (irpsp->Parameters.DeviceIoControl.IoControlCode) { case IOCTL_HID_GET_POLL_FREQUENCY_MSEC: @@ -588,6 +601,19 @@ NTSTATUS WINAPI pdo_read(DEVICE_OBJECT *device, IRP *irp) NTSTATUS rc = STATUS_SUCCESS; IO_STACK_LOCATION *irpsp = IoGetCurrentIrpStackLocation(irp); int ptr = -1; + BOOL removed; + KIRQL irql; + + KeAcquireSpinLock(&ext->u.pdo.lock, &irql); + removed = ext->u.pdo.removed; + KeReleaseSpinLock(&ext->u.pdo.lock, irql); + + if (removed) + { + irp->IoStatus.Status = STATUS_DELETE_PENDING; + IoCompleteRequest(irp, IO_NO_INCREMENT); + return STATUS_DELETE_PENDING; + } packet = malloc(buffer_size); ptr = PtrToUlong( irp->Tail.Overlay.OriginalFileObject->FsContext ); @@ -662,7 +688,20 @@ NTSTATUS WINAPI pdo_write(DEVICE_OBJECT *device, IRP *irp) const WINE_HIDP_PREPARSED_DATA *data = ext->u.pdo.preparsed_data; HID_XFER_PACKET packet; ULONG max_len; + BOOL removed; NTSTATUS rc; + KIRQL irql; + + KeAcquireSpinLock(&ext->u.pdo.lock, &irql); + removed = ext->u.pdo.removed; + KeReleaseSpinLock(&ext->u.pdo.lock, irql); + + if (removed) + { + irp->IoStatus.Status = STATUS_DELETE_PENDING; + IoCompleteRequest(irp, IO_NO_INCREMENT); + return STATUS_DELETE_PENDING; + } irp->IoStatus.Information = 0; diff --git a/dlls/hidclass.sys/hid.h b/dlls/hidclass.sys/hid.h index 5a502840691..19ac7091065 100644 --- a/dlls/hidclass.sys/hid.h +++ b/dlls/hidclass.sys/hid.h @@ -67,6 +67,9 @@ typedef struct _BASE_DEVICE_EXTENSION KSPIN_LOCK irp_queue_lock; LIST_ENTRY irp_queue; + KSPIN_LOCK lock; + BOOL removed; + BOOL is_mouse; UNICODE_STRING mouse_link_name; BOOL is_keyboard; diff --git a/dlls/hidclass.sys/pnp.c b/dlls/hidclass.sys/pnp.c index 5f59257cdf7..2f5fe5de4eb 100644 --- a/dlls/hidclass.sys/pnp.c +++ b/dlls/hidclass.sys/pnp.c @@ -359,11 +359,23 @@ static NTSTATUS fdo_pnp(DEVICE_OBJECT *device, IRP *irp) } } +static void remove_pending_irps(BASE_DEVICE_EXTENSION *ext) +{ + IRP *irp; + + while ((irp = pop_irp_from_queue(ext))) + { + irp->IoStatus.Status = STATUS_DELETE_PENDING; + IoCompleteRequest(irp, IO_NO_INCREMENT); + } +} + static NTSTATUS pdo_pnp(DEVICE_OBJECT *device, IRP *irp) { IO_STACK_LOCATION *irpsp = IoGetCurrentIrpStackLocation(irp); BASE_DEVICE_EXTENSION *ext = device->DeviceExtension; NTSTATUS status = irp->IoStatus.Status; + KIRQL irql; TRACE("irp %p, minor function %#x.\n", irp, irpsp->MinorFunction); @@ -453,12 +465,13 @@ static NTSTATUS pdo_pnp(DEVICE_OBJECT *device, IRP *irp) IoSetDeviceInterfaceState(&ext->u.pdo.mouse_link_name, TRUE); if (ext->u.pdo.is_keyboard) IoSetDeviceInterfaceState(&ext->u.pdo.keyboard_link_name, TRUE); + + ext->u.pdo.removed = FALSE; status = STATUS_SUCCESS; break; case IRP_MN_REMOVE_DEVICE: - { - IRP *queued_irp; + remove_pending_irps(ext); send_wm_input_device_change(ext, GIDC_REMOVAL); @@ -479,21 +492,21 @@ static NTSTATUS pdo_pnp(DEVICE_OBJECT *device, IRP *irp) if (ext->u.pdo.ring_buffer) RingBuffer_Destroy(ext->u.pdo.ring_buffer); - while ((queued_irp = pop_irp_from_queue(ext))) - { - queued_irp->IoStatus.Status = STATUS_DEVICE_REMOVED; - IoCompleteRequest(queued_irp, IO_NO_INCREMENT); - } - RtlFreeUnicodeString(&ext->u.pdo.link_name); irp->IoStatus.Status = STATUS_SUCCESS; IoCompleteRequest(irp, IO_NO_INCREMENT); IoDeleteDevice(device); return STATUS_SUCCESS; - } case IRP_MN_SURPRISE_REMOVAL: + KeAcquireSpinLock(&ext->u.pdo.lock, &irql); + ext->u.pdo.removed = TRUE; + KeReleaseSpinLock(&ext->u.pdo.lock, irql); + + remove_pending_irps(ext); + + SetEvent(ext->u.pdo.halt_event); status = STATUS_SUCCESS; break;
1
0
0
0
Rémi Bernon : wineusb.sys: Return STATUS_DELETE_PENDING when device is removed.
by Alexandre Julliard
01 Jul '21
01 Jul '21
Module: wine Branch: master Commit: 0b9d1d9ffbec57fa0642d33c06a4ff6a5bf54f8e URL:
https://source.winehq.org/git/wine.git/?a=commit;h=0b9d1d9ffbec57fa0642d33c…
Author: Rémi Bernon <rbernon(a)codeweavers.com> Date: Thu Jul 1 09:51:24 2021 +0200 wineusb.sys: Return STATUS_DELETE_PENDING when device is removed. Signed-off-by: Rémi Bernon <rbernon(a)codeweavers.com> Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/wineusb.sys/wineusb.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/dlls/wineusb.sys/wineusb.c b/dlls/wineusb.sys/wineusb.c index a72095409ff..fae297915fc 100644 --- a/dlls/wineusb.sys/wineusb.c +++ b/dlls/wineusb.sys/wineusb.c @@ -726,9 +726,21 @@ static NTSTATUS WINAPI driver_internal_ioctl(DEVICE_OBJECT *device_obj, IRP *irp ULONG code = stack->Parameters.DeviceIoControl.IoControlCode; struct usb_device *device = device_obj->DeviceExtension; NTSTATUS status = STATUS_NOT_IMPLEMENTED; + BOOL removed; TRACE("device_obj %p, irp %p, code %#x.\n", device_obj, irp, code); + EnterCriticalSection(&wineusb_cs); + removed = device->removed; + LeaveCriticalSection(&wineusb_cs); + + if (removed) + { + irp->IoStatus.Status = STATUS_DELETE_PENDING; + IoCompleteRequest(irp, IO_NO_INCREMENT); + return STATUS_DELETE_PENDING; + } + switch (code) { case IOCTL_INTERNAL_USB_SUBMIT_URB:
1
0
0
0
Rémi Bernon : wineusb.sys: Handle IRP_MN_SURPRISE_REMOVAL and set removed flag.
by Alexandre Julliard
01 Jul '21
01 Jul '21
Module: wine Branch: master Commit: 84c9206ca75a71622d061c63215230dd37673761 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=84c9206ca75a71622d061c63…
Author: Rémi Bernon <rbernon(a)codeweavers.com> Date: Thu Jul 1 09:51:23 2021 +0200 wineusb.sys: Handle IRP_MN_SURPRISE_REMOVAL and set removed flag. Signed-off-by: Rémi Bernon <rbernon(a)codeweavers.com> Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/wineusb.sys/wineusb.c | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/dlls/wineusb.sys/wineusb.c b/dlls/wineusb.sys/wineusb.c index 8fb1d75f121..a72095409ff 100644 --- a/dlls/wineusb.sys/wineusb.c +++ b/dlls/wineusb.sys/wineusb.c @@ -145,7 +145,6 @@ static void remove_usb_device(libusb_device *libusb_device) if (device->libusb_device == libusb_device) { list_remove(&device->entry); - device->removed = TRUE; break; } } @@ -402,26 +401,24 @@ static NTSTATUS pdo_pnp(DEVICE_OBJECT *device_obj, IRP *irp) } case IRP_MN_START_DEVICE: - case IRP_MN_SURPRISE_REMOVAL: ret = STATUS_SUCCESS; break; - case IRP_MN_REMOVE_DEVICE: + case IRP_MN_SURPRISE_REMOVAL: EnterCriticalSection(&wineusb_cs); remove_pending_irps(device); + device->removed = TRUE; LeaveCriticalSection(&wineusb_cs); + ret = STATUS_SUCCESS; + break; - if (device->removed) - { - libusb_unref_device(device->libusb_device); - libusb_close(device->handle); + case IRP_MN_REMOVE_DEVICE: + remove_pending_irps(device); - irp->IoStatus.Status = STATUS_SUCCESS; - IoCompleteRequest(irp, IO_NO_INCREMENT); - IoDeleteDevice(device->device_obj); - return STATUS_SUCCESS; - } + libusb_unref_device(device->libusb_device); + libusb_close(device->handle); + IoDeleteDevice(device->device_obj); ret = STATUS_SUCCESS; break;
1
0
0
0
Rémi Bernon : wineusb.sys: Introduce new remove_pending_irps helper.
by Alexandre Julliard
01 Jul '21
01 Jul '21
Module: wine Branch: master Commit: b38db8a69c1921b0d97da4b56ff222e5998a8f40 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=b38db8a69c1921b0d97da4b5…
Author: Rémi Bernon <rbernon(a)codeweavers.com> Date: Thu Jul 1 09:51:22 2021 +0200 wineusb.sys: Introduce new remove_pending_irps helper. Signed-off-by: Rémi Bernon <rbernon(a)codeweavers.com> Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/wineusb.sys/wineusb.c | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/dlls/wineusb.sys/wineusb.c b/dlls/wineusb.sys/wineusb.c index b8cefdaff5e..8fb1d75f121 100644 --- a/dlls/wineusb.sys/wineusb.c +++ b/dlls/wineusb.sys/wineusb.c @@ -363,6 +363,20 @@ static NTSTATUS query_id(const struct usb_device *device, IRP *irp, BUS_QUERY_ID return STATUS_SUCCESS; } +static void remove_pending_irps(struct usb_device *device) +{ + LIST_ENTRY *entry; + IRP *irp; + + while ((entry = RemoveHeadList(&device->irp_list)) != &device->irp_list) + { + irp = CONTAINING_RECORD(entry, IRP, Tail.Overlay.ListEntry); + irp->IoStatus.Status = STATUS_DELETE_PENDING; + irp->IoStatus.Information = 0; + IoCompleteRequest(irp, IO_NO_INCREMENT); + } +} + static NTSTATUS pdo_pnp(DEVICE_OBJECT *device_obj, IRP *irp) { IO_STACK_LOCATION *stack = IoGetCurrentIrpStackLocation(irp); @@ -393,17 +407,8 @@ static NTSTATUS pdo_pnp(DEVICE_OBJECT *device_obj, IRP *irp) break; case IRP_MN_REMOVE_DEVICE: - { - LIST_ENTRY *entry; - EnterCriticalSection(&wineusb_cs); - while ((entry = RemoveHeadList(&device->irp_list)) != &device->irp_list) - { - irp = CONTAINING_RECORD(entry, IRP, Tail.Overlay.ListEntry); - irp->IoStatus.Status = STATUS_DELETE_PENDING; - irp->IoStatus.Information = 0; - IoCompleteRequest(irp, IO_NO_INCREMENT); - } + remove_pending_irps(device); LeaveCriticalSection(&wineusb_cs); if (device->removed) @@ -419,7 +424,6 @@ static NTSTATUS pdo_pnp(DEVICE_OBJECT *device_obj, IRP *irp) ret = STATUS_SUCCESS; break; - } default: FIXME("Unhandled minor function %#x.\n", stack->MinorFunction);
1
0
0
0
← Newer
1
...
65
66
67
68
69
70
71
72
73
Older →
Jump to page:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
Results per page:
10
25
50
100
200