348
418
extern KSPIN_LOCK atomic_lock;
349
419
extern KSPIN_LOCK cancel_lock;
421
//#define DEBUG_IRQL 1
353
#define WRAPPER_TIMER_MAGIC 47697249
354
struct wrapper_timer {
355
struct list_head list;
356
426
struct timer_list timer;
427
struct nt_timer *nt_timer;
357
428
#ifdef DEBUG_TIMER
358
unsigned long wrapper_timer_magic;
429
unsigned long wrap_timer_magic;
362
struct ktimer *ktimer;
433
struct wrap_work_item {
367
441
typedef struct mdl ndis_buffer;
443
#define MAX_ALLOCATED_URBS 15
449
struct usb_device *udev;
450
struct usb_interface *intf;
452
struct nt_list wrap_urb_list;
458
#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,0)
459
/* until issues with threads hogging cpu are resolved, we don't want
460
* to use shared workqueue, lest the threads take keyboard etc down */
461
#define USE_OWN_WORKQUEUE 1
462
extern struct workqueue_struct *ndiswrapper_wq;
463
#define schedule_work(work_struct) queue_work(ndiswrapper_wq, (work_struct))
369
466
int ntoskernel_init(void);
370
467
void ntoskernel_exit(void);
468
int ntoskernel_init_device(struct wrapper_dev *wd);
469
void ntoskernel_exit_device(struct wrapper_dev *wd);
470
void *allocate_object(ULONG size, enum common_object_type type,
471
struct unicode_string *name);
472
void free_object(void *object);
474
struct driver_object *find_bus_driver(const char *name);
475
struct device_object *alloc_pdo(struct driver_object *drv_obj);
476
void free_pdo(struct device_object *drv_obj);
478
STDCALL void WRITE_PORT_UCHAR(ULONG_PTR port, UCHAR value);
479
STDCALL UCHAR READ_PORT_UCHAR(ULONG_PTR port);
371
481
STDCALL void *ExAllocatePoolWithTag(enum pool_type pool_type, SIZE_T size,
373
483
STDCALL void ExFreePool(void *p);
374
484
STDCALL ULONG MmSizeOfMdl(void *base, ULONG length);
375
STDCALL void KeInitializeEvent(struct kevent *kevent,
485
STDCALL void *MmMapIoSpace(PHYSICAL_ADDRESS phys_addr, SIZE_T size,
486
enum memory_caching_type cache);
487
STDCALL void MmUnmapIoSpace(void *addr, SIZE_T size);
488
STDCALL void KeInitializeEvent(struct nt_event *nt_event,
376
489
enum event_type type, BOOLEAN state);
377
STDCALL LONG KeSetEvent(struct kevent *kevent, KPRIORITY incr, BOOLEAN wait);
378
STDCALL LONG KeResetEvent(struct kevent *kevent);
490
STDCALL LONG KeSetEvent(struct nt_event *nt_event, KPRIORITY incr,
492
STDCALL LONG KeResetEvent(struct nt_event *nt_event);
493
STDCALL void KeClearEvent(struct nt_event *nt_event);
494
STDCALL void KeInitializeDpc(struct kdpc *kdpc, void *func, void *ctx);
495
STDCALL BOOLEAN KeInsertQueueDpc(struct kdpc *kdpc, void *arg1, void *arg2);
496
STDCALL BOOLEAN KeRemoveQueueDpc(struct kdpc *kdpc);
497
STDCALL void KeFlushQueuedDpcs(void);
379
498
STDCALL NTSTATUS KeWaitForSingleObject(void *object, KWAIT_REASON reason,
380
KPROCESSOR_MODE waitmode,
382
LARGE_INTEGER *timeout);
499
KPROCESSOR_MODE waitmode,
501
LARGE_INTEGER *timeout);
383
502
struct mdl *allocate_init_mdl(void *virt, ULONG length);
384
503
void free_mdl(struct mdl *mdl);
385
504
STDCALL struct mdl *IoAllocateMdl(void *virt, ULONG length, BOOLEAN second_buf,
386
505
BOOLEAN charge_quota, struct irp *irp);
506
STDCALL void MmBuildMdlForNonPagedPool(struct mdl *mdl);
387
507
STDCALL void IoFreeMdl(struct mdl *mdl);
388
508
STDCALL void NdisFreeBuffer(ndis_buffer *buffer);
389
ULONGLONG ticks_1601(void);
509
_FASTCALL LONG InterlockedDecrement(FASTCALL_DECL_1(LONG volatile *val));
510
_FASTCALL LONG InterlockedIncrement(FASTCALL_DECL_1(LONG volatile *val));
511
_FASTCALL struct nt_list *
512
ExInterlockedInsertHeadList(FASTCALL_DECL_3(struct nt_list *head,
513
struct nt_list *entry,
515
_FASTCALL struct nt_list *
516
ExInterlockedInsertTailList(FASTCALL_DECL_3(struct nt_list *head,
517
struct nt_list *entry,
519
_FASTCALL struct nt_list *
520
ExInterlockedRemoveHeadList(FASTCALL_DECL_2(struct nt_list *head,
522
STDCALL NTSTATUS IoCreateDevice(struct driver_object *driver,
523
ULONG dev_ext_length,
524
struct unicode_string *dev_name,
525
DEVICE_TYPE dev_type,
526
ULONG dev_chars, BOOLEAN exclusive,
527
struct device_object **dev_obj);
528
STDCALL NTSTATUS IoCreateSymbolicLink(struct unicode_string *link,
529
struct unicode_string *dev_name);
530
STDCALL void IoDeleteDevice(struct device_object *dev);
531
STDCALL void IoDetachDevice(struct device_object *topdev);
532
STDCALL struct device_object *IoGetAttachedDevice(struct device_object *dev);
534
IoAllocateDriverObjectExtension(struct driver_object *drv_obj,
535
void *client_id, ULONG extlen, void **ext);
536
STDCALL void *IoGetDriverObjectExtension(struct driver_object *drv,
538
STDCALL struct device_object *IoAttachDeviceToDeviceStack
539
(struct device_object *src, struct device_object *dst);
540
STDCALL void KeInitializeEvent(struct nt_event *nt_event, enum event_type type,
542
void free_custom_ext(struct driver_extension *drv_obj_ext);
543
STDCALL NTSTATUS AddDevice(struct driver_object *drv_obj,
544
struct device_object *pdo);
545
void DeleteDevice(struct device_object *pdo);
547
driver_dispatch_t IopInvalidDeviceRequest;
548
driver_dispatch_t IopPassIrpDown;
549
driver_dispatch_t pdoDispatchInternalDeviceControl;
550
driver_dispatch_t pdoDispatchDeviceControl;
551
driver_dispatch_t pdoDispatchPnp;
552
driver_dispatch_t pdoDispatchPower;
553
driver_dispatch_t IopPassIrpDownAndWait;
554
driver_dispatch_t fdoDispatchPnp;
556
STDCALL struct irp *IoAllocateIrp(char stack_size, BOOLEAN charge_quota);
557
STDCALL void IoFreeIrp(struct irp *irp);
558
STDCALL BOOLEAN IoCancelIrp(struct irp *irp);
559
_FASTCALL NTSTATUS IofCallDriver
560
(FASTCALL_DECL_2(struct device_object *dev_obj, struct irp *irp));
561
STDCALL struct irp *WRAP_EXPORT(IoBuildSynchronousFsdRequest)
562
(ULONG major_func, struct device_object *dev_obj, void *buf,
563
ULONG length, LARGE_INTEGER *offset, struct nt_event *event,
564
struct io_status_block *status);
565
STDCALL struct irp *WRAP_EXPORT(IoBuildAsynchronousFsdRequest)
566
(ULONG major_func, struct device_object *dev_obj, void *buf,
567
ULONG length, LARGE_INTEGER *offset,
568
struct io_status_block *status);
569
STDCALL NTSTATUS PoCallDriver(struct device_object *dev_obj, struct irp *irp);
571
struct nt_thread *wrap_create_thread(struct task_struct *task);
572
void wrap_remove_thread(struct nt_thread *thread);
573
u64 ticks_1601(void);
575
int schedule_wrap_work_item(void *func, void *arg1, void *arg2,
391
578
STDCALL KIRQL KeGetCurrentIrql(void);
392
579
STDCALL void KeInitializeSpinLock(KSPIN_LOCK *lock);
403
593
IofCompleteRequest(FASTCALL_DECL_2(struct irp *irp, CHAR prio_boost));
405
595
KefReleaseSpinLockFromDpcLevel(FASTCALL_DECL_1(KSPIN_LOCK *lock));
596
STDCALL void RtlCopyMemory(void *dst, const void *src, SIZE_T length);
406
597
STDCALL NTSTATUS RtlUnicodeStringToAnsiString(struct ansi_string *dst,
407
struct unicode_string *src,
598
const struct unicode_string *src,
409
600
STDCALL NTSTATUS RtlAnsiStringToUnicodeString(struct unicode_string *dst,
410
struct ansi_string *src,
601
const struct ansi_string *src,
412
STDCALL void RtlInitAnsiString(struct ansi_string *dst, CHAR *src);
413
STDCALL void RtlInitString(struct ansi_string *dst, CHAR *src);
603
STDCALL void RtlInitAnsiString(struct ansi_string *dst, const char *src);
604
STDCALL void RtlInitString(struct ansi_string *dst, const char *src);
605
STDCALL void RtlInitUnicodeString(struct unicode_string *dest,
414
607
STDCALL void RtlFreeUnicodeString(struct unicode_string *string);
415
608
STDCALL void RtlFreeAnsiString(struct ansi_string *string);
609
STDCALL LONG RtlCompareUnicodeString
610
(const struct unicode_string *s1, const struct unicode_string *s2,
611
BOOLEAN case_insensitive);
612
STDCALL void RtlCopyUnicodeString
613
(struct unicode_string *dst, struct unicode_string *src);
614
NOREGPARM SIZE_T _win_wcslen(const wchar_t *s);
616
void *wrap_kmalloc(size_t size);
617
void wrap_kfree(void *ptr);
618
void wrap_init_timer(struct nt_timer *nt_timer, enum timer_type type,
619
struct wrapper_dev *wd);
620
BOOLEAN wrap_set_timer(struct nt_timer *nt_timer, unsigned long expires_hz,
621
unsigned long repeat_hz, struct kdpc *kdpc);
623
STDCALL void KeInitializeTimer(struct nt_timer *nt_timer);
624
STDCALL void KeInitializeTimerEx(struct nt_timer *nt_timer,
625
enum timer_type type);
626
STDCALL BOOLEAN KeSetTimerEx(struct nt_timer *nt_timer,
627
LARGE_INTEGER duetime_ticks, LONG period_ms,
629
STDCALL BOOLEAN KeSetTimer(struct nt_timer *nt_timer,
630
LARGE_INTEGER duetime_ticks, struct kdpc *kdpc);
631
STDCALL BOOLEAN KeCancelTimer(struct nt_timer *nt_timer);
632
STDCALL void KeInitializeDpc(struct kdpc *kdpc, void *func, void *ctx);
417
634
unsigned long lin_to_win1(void *func, unsigned long);
418
635
unsigned long lin_to_win2(void *func, unsigned long, unsigned long);
470
712
* lock seems to be 0 (presumably in Windows value of unlocked
471
713
* spinlock is 0).
716
/* define CONFIG_DEBUG_SPINLOCK if a Windows driver is suspected of
717
* obtaining a lock while holding the same lock */
719
//#ifndef CONFIG_DEBUG_SPINLOCK
720
//#define CONFIG_DEBUG_SPINLOCK
723
#undef CONFIG_DEBUG_SPINLOCK
725
#ifdef CONFIG_DEBUG_SPINLOCK
726
#define KSPIN_LOCK_LOCKED ((ULONG_PTR)get_current())
728
#define KSPIN_LOCK_LOCKED 1
473
731
#define KSPIN_LOCK_UNLOCKED 0
474
#define KSPIN_LOCK_LOCKED 1
476
733
#define kspin_lock_init(lock) *(lock) = KSPIN_LOCK_UNLOCKED
478
735
#ifdef CONFIG_SMP
480
#ifdef __HAVE_ARCH_CMPXCHG
737
#define raw_kspin_lock(lock) \
738
while (cmpxchg((lock), KSPIN_LOCK_UNLOCKED, KSPIN_LOCK_LOCKED) != \
741
#ifdef CONFIG_DEBUG_SPINLOCK
742
#define raw_kspin_unlock(lock) \
743
__asm__ __volatile__("movw $0,%0" \
744
:"=m" (*(lock)) : : "memory")
745
#else // DEBUG_SPINLOCK
746
#define raw_kspin_unlock(lock) \
747
__asm__ __volatile__("movb $0,%0" \
748
:"=m" (*(lock)) : : "memory")
749
#endif // DEBUG_SPINLOCK
753
#define raw_kspin_lock(lock) *(lock) = KSPIN_LOCK_LOCKED
754
#define raw_kspin_unlock(lock) *(lock) = KSPIN_LOCK_UNLOCKED
758
#ifdef CONFIG_DEBUG_SPINLOCK
482
760
#define kspin_lock(lock) \
483
while (cmpxchg(lock, KSPIN_LOCK_UNLOCKED, KSPIN_LOCK_LOCKED) != \
488
extern spinlock_t spinlock_kspin_lock;
489
#define kspin_lock(lock) \
492
spin_lock(&spinlock_kspin_lock); \
493
if (*(lock) == KSPIN_LOCK_UNLOCKED) \
495
spin_unlock(&spinlock_kspin_lock); \
497
*(lock) = KSPIN_LOCK_LOCKED; \
498
spin_unlock(&spinlock_kspin_lock); \
501
#endif // __HAVE_ARCH_CMPXCHG
503
#define kspin_unlock(lock) xchg(lock, KSPIN_LOCK_UNLOCKED)
507
#define kspin_lock(lock) *(lock) = KSPIN_LOCK_LOCKED
508
#define kspin_unlock(lock) *(lock) = KSPIN_LOCK_UNLOCKED
512
/* raise IRQL to given (higher) IRQL if necessary after locking */
762
if (*(lock) == KSPIN_LOCK_LOCKED) \
763
ERROR("eeek: process %p already owns lock %p", \
764
get_current(), lock); \
766
raw_kspin_lock(lock); \
768
#define kspin_unlock(lock) \
770
if (*(lock) != KSPIN_LOCK_LOCKED) \
771
ERROR("kspin_lock %p not locked!", (lock)); \
772
raw_kspin_unlock(lock); \
775
#else // DEBUG_SPINLOCK
777
#define kspin_lock(lock) raw_kspin_lock(lock)
778
#define kspin_unlock(lock) raw_kspin_unlock(lock)
780
#endif // DEBUG_SPINLOCK
782
/* raise IRQL to given (higher) IRQL if necessary before locking */
513
783
#define kspin_lock_irql(lock, newirql) \
515
785
KIRQL _cur_irql_ = current_irql(); \
516
KSPIN_LOCK _val_ = *(lock); \
517
if (_val_ > KSPIN_LOCK_LOCKED) \
518
ERROR("illegal spinlock: %p(%lu)", lock, _val_); \
519
786
if (_cur_irql_ < DISPATCH_LEVEL && newirql == DISPATCH_LEVEL) { \
520
787
local_bh_disable(); \
521
788
preempt_disable(); \
606
853
#define DBG_BLOCK()
609
#if defined DEBUG && DEBUG >= 1
856
#if defined(DEBUG) && DEBUG >= 1
611
858
#define DBGTRACE1(fmt, ...) DBGTRACE(1, fmt , ## __VA_ARGS__)
614
#if defined DEBUG && DEBUG >= 2
861
#if defined(DEBUG) && DEBUG >= 2
616
863
#define DBGTRACE2(fmt, ...) DBGTRACE(2, fmt , ## __VA_ARGS__)
619
#if defined DEBUG && DEBUG >= 3
866
#if defined(DEBUG) && DEBUG >= 3
621
868
#define DBGTRACE3(fmt, ...) DBGTRACE(3, fmt , ## __VA_ARGS__)
624
#if defined DEBUG && DEBUG >= 4
871
#if defined(DEBUG) && DEBUG >= 4
626
873
#define DBGTRACE4(fmt, ...) DBGTRACE(4, fmt , ## __VA_ARGS__)
629
#if defined DEBUG && DEBUG >= 5
876
#if defined(DEBUG) && DEBUG >= 5
631
878
#define DBGTRACE5(fmt, ...) DBGTRACE(5, fmt , ## __VA_ARGS__)
881
#if defined(DEBUG) && DEBUG >= 6
883
#define DBGTRACE6(fmt, ...) DBGTRACE(6, fmt , ## __VA_ARGS__)
634
886
#define TRACEENTER(fmt, ...) DBGTRACE("Enter " fmt , ## __VA_ARGS__)
635
887
#define TRACEENTER1(fmt, ...) DBGTRACE1("Enter " fmt , ## __VA_ARGS__)
636
888
#define TRACEENTER2(fmt, ...) DBGTRACE2("Enter " fmt , ## __VA_ARGS__)
637
889
#define TRACEENTER3(fmt, ...) DBGTRACE3("Enter " fmt , ## __VA_ARGS__)
638
890
#define TRACEENTER4(fmt, ...) DBGTRACE4("Enter " fmt , ## __VA_ARGS__)
639
891
#define TRACEENTER5(fmt, ...) DBGTRACE5("Enter " fmt , ## __VA_ARGS__)
892
#define TRACEENTER6(fmt, ...) DBGTRACE6("Enter " fmt , ## __VA_ARGS__)
641
894
#define TRACEEXIT(stmt) do { DBGTRACE("Exit"); stmt; } while(0)
642
895
#define TRACEEXIT1(stmt) do { DBGTRACE1("Exit"); stmt; } while(0)
644
897
#define TRACEEXIT3(stmt) do { DBGTRACE3("Exit"); stmt; } while(0)
645
898
#define TRACEEXIT4(stmt) do { DBGTRACE4("Exit"); stmt; } while(0)
646
899
#define TRACEEXIT5(stmt) do { DBGTRACE5("Exit"); stmt; } while(0)
649
#define USBTRACE(fmt, ...) DBGTRACE1(fmt, ## __VA_ARGS__)
650
#define USBTRACEENTER(fmt, ...) TRACEENTER1(fmt, ## __VA_ARGS__)
651
#define USBTRACEEXIT(stmt) TRACEEXIT1(stmt)
900
#define TRACEEXIT6(stmt) do { DBGTRACE6("Exit"); stmt; } while(0)
902
//#define USB_DEBUG 1
903
//#define EVENT_DEBUG 1
906
#if defined(USB_DEBUG)
907
#define USBTRACE DBGTRACE1
908
#define USBENTER TRACEENTER1
909
#define USBEXIT TRACEEXIT1
653
911
#define USBTRACE(fmt, ...)
654
#define USBTRACEENTER(fmt, ...)
655
#define USBTRACEEXIT(stmt) stmt
912
#define USBENTER(fmt, ...)
913
#define USBEXIT(stmt) stmt
916
#if defined(EVENT_DEBUG)
917
#define EVENTTRACE DBGTRACE1
918
#define EVENTENTER TRACEENTER1
919
#define EVENTEXIT TRACEEXIT1
921
#define EVENTTRACE(fmt, ...)
922
#define EVENTENTER(fmt, ...)
923
#define EVENTEXIT(stmt) stmt
926
#if defined(IO_DEBUG)
927
#define IOTRACE DBGTRACE1
928
#define IOENTER TRACEENTER1
929
#define IOEXIT TRACEEXIT1
931
#define IOTRACE(fmt, ...)
932
#define IOENTER(fmt, ...)
933
#define IOEXIT(stmt) stmt
658
936
#if defined DEBUG
659
#define ASSERT(expr) do { \
661
ERROR("Assertion failed! %s", (#expr)); \
937
#define assert(expr) do { \
939
ERROR("assertion failed: %s", (#expr)); \
942
#define assert(expr) do { } while (0)
945
#if defined(IO_DEBUG)
946
#define DUMP_IRP(__irp) \
948
struct io_stack_location *_irp_sl; \
949
_irp_sl = IoGetCurrentIrpStackLocation(__irp); \
950
IOTRACE("irp: %p, stack size: %d, cl: %d, sl: %p, " \
951
"dev_obj: %p, mj_fn: %d, minor_fn: %d, " \
952
"nt_urb: %p, event: %p", \
953
__irp, __irp->stack_count, (__irp)->current_location, \
954
_irp_sl, _irp_sl->dev_obj, _irp_sl->major_fn, \
955
_irp_sl->minor_fn, URB_FROM_IRP(__irp), \
956
(__irp)->user_event); \
959
#define DUMP_IRP(__irp) do { } while (0)
962
#define sleep(nsec) \
964
set_current_state(TASK_INTERRUPTIBLE); \
965
schedule_timeout(nsec * HZ); \
668
968
#endif // _NTOSKERNEL_H_