Home | History | Annotate | Download | only in SnpNt32Dxe
      1 /** @file
      2 
      3 Copyright (c) 2006 - 2007, Intel Corporation. All rights reserved.<BR>
      4 This program and the accompanying materials
      5 are licensed and made available under the terms and conditions of the BSD License
      6 which accompanies this distribution.  The full text of the license may be found at
      7 http://opensource.org/licenses/bsd-license.php
      8 
      9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     11 
     12 Module Name:
     13 
     14   SnpNt32.h
     15 
     16 Abstract:
     17 
     18 -**/
     19 
     20 #ifndef _SNP_NT32_H_
     21 #define _SNP_NT32_H_
     22 
     23 #include <Uefi.h>
     24 
     25 #include <Protocol/SimpleNetwork.h>
     26 #include <Protocol/DevicePath.h>
     27 #include <Protocol/WinNtThunk.h>
     28 
     29 #include <Library/BaseLib.h>
     30 #include <Library/DebugLib.h>
     31 #include <Library/BaseMemoryLib.h>
     32 #include <Library/UefiBootServicesTableLib.h>
     33 #include <Library/UefiLib.h>
     34 #include <Library/DevicePathLib.h>
     35 #include <Library/NetLib.h>
     36 #include <Library/MemoryAllocationLib.h>
     37 
     38 typedef struct _SNPNT32_GLOBAL_DATA  SNPNT32_GLOBAL_DATA;
     39 typedef struct _SNPNT32_INSTANCE_DATA SNPNT32_INSTANCE_DATA;
     40 
     41 #define NETWORK_LIBRARY_NAME_U          L"SnpNt32Io.dll"
     42 
     43 #define NETWORK_LIBRARY_INITIALIZE      "SnpInitialize"
     44 #define NETWORK_LIBRARY_FINALIZE        "SnpFinalize"
     45 #define NETWORK_LIBRARY_SET_RCV_FILTER  "SnpSetReceiveFilter"
     46 #define NETWORK_LIBRARY_RECEIVE         "SnpReceive"
     47 #define NETWORK_LIBRARY_TRANSMIT        "SnpTransmit"
     48 
     49 #pragma pack(1)
     50 typedef struct _NT_NET_INTERFACE_INFO {
     51   UINT32          InterfaceIndex;
     52   EFI_MAC_ADDRESS MacAddr;
     53 } NT_NET_INTERFACE_INFO;
     54 #pragma pack()
     55 
     56 #define NET_ETHER_HEADER_SIZE     14
     57 
     58 #define MAX_INTERFACE_INFO_NUMBER 16
     59 #define MAX_FILE_NAME_LENGTH      280
     60 
     61 //
     62 //  Functions in Net Library
     63 //
     64 typedef
     65 INT32
     66 (*NT_NET_INITIALIZE) (
     67   IN OUT  UINT32                *InterfaceCount,
     68   IN OUT  NT_NET_INTERFACE_INFO * InterfaceInfoBuffer
     69   );
     70 
     71 typedef
     72 INT32
     73 (*NT_NET_FINALIZE) (
     74   VOID
     75   );
     76 
     77 typedef
     78 INT32
     79 (*NT_NET_SET_RECEIVE_FILTER) (
     80   IN  UINT32                        Index,
     81   IN  UINT32                        EnableFilter,
     82   IN  UINT32                        MCastFilterCnt,
     83   IN  EFI_MAC_ADDRESS               * MCastFilter
     84   );
     85 
     86 typedef
     87 INT32
     88 (*NT_NET_RECEIVE) (
     89   IN      UINT32                        Index,
     90   IN OUT  UINT32                        *BufferSize,
     91   OUT     VOID                          *Buffer
     92   );
     93 
     94 typedef
     95 INT32
     96 (*NT_NET_TRANSMIT) (
     97   IN  UINT32                        Index,
     98   IN  UINT32                        HeaderSize,
     99   IN  UINT32                        BufferSize,
    100   IN  VOID                          *Buffer,
    101   IN  EFI_MAC_ADDRESS               * SrcAddr,
    102   IN  EFI_MAC_ADDRESS               * DestAddr,
    103   IN  UINT16                        *Protocol
    104   );
    105 
    106 typedef struct _NT_NET_UTILITY_TABLE {
    107   NT_NET_INITIALIZE         Initialize;
    108   NT_NET_FINALIZE           Finalize;
    109   NT_NET_SET_RECEIVE_FILTER SetReceiveFilter;
    110   NT_NET_RECEIVE            Receive;
    111   NT_NET_TRANSMIT           Transmit;
    112 } NT_NET_UTILITY_TABLE;
    113 
    114 //
    115 //  Private functions
    116 //
    117 typedef
    118 EFI_STATUS
    119 (*SNPNT32_INITIALIZE_GLOBAL_DATA) (
    120   IN SNPNT32_GLOBAL_DATA * This
    121   );
    122 
    123 typedef
    124 EFI_STATUS
    125 (*SNPNT32_INITIALIZE_INSTANCE_DATA) (
    126   IN SNPNT32_GLOBAL_DATA    * This,
    127   IN SNPNT32_INSTANCE_DATA  * Instance
    128   );
    129 
    130 typedef
    131 EFI_STATUS
    132 (*SNPNT32_CLOSE_INSTANCE) (
    133   IN SNPNT32_GLOBAL_DATA    * This,
    134   IN SNPNT32_INSTANCE_DATA  * Instance
    135   );
    136 
    137 //
    138 //  Global data for this driver
    139 //
    140 #define SNP_NT32_DRIVER_SIGNATURE SIGNATURE_32 ('W', 'S', 'N', 'P')
    141 
    142 struct _SNPNT32_GLOBAL_DATA {
    143   UINT32                            Signature;
    144 
    145   //
    146   //  List for all the fake SNP instance
    147   //
    148   LIST_ENTRY                        InstanceList;
    149 
    150   EFI_WIN_NT_THUNK_PROTOCOL         *WinNtThunk;
    151   HMODULE                           NetworkLibraryHandle;
    152 
    153   NT_NET_UTILITY_TABLE              NtNetUtilityTable;
    154 
    155   EFI_LOCK                          Lock;
    156 
    157   //
    158   //  Private functions
    159   //
    160   SNPNT32_INITIALIZE_GLOBAL_DATA    InitializeGlobalData;
    161   SNPNT32_INITIALIZE_INSTANCE_DATA  InitializeInstanceData;
    162   SNPNT32_CLOSE_INSTANCE            CloseInstance;
    163 };
    164 
    165 //
    166 //  Instance data for each fake SNP instance
    167 //
    168 #define SNP_NT32_INSTANCE_SIGNATURE SIGNATURE_32 ('w', 'S', 'N', 'P')
    169 
    170 struct _SNPNT32_INSTANCE_DATA {
    171   UINT32                      Signature;
    172 
    173   //
    174   //  List entry use for linking with other instance
    175   //
    176   LIST_ENTRY                  Entry;
    177 
    178   SNPNT32_GLOBAL_DATA         *GlobalData;
    179 
    180   EFI_HANDLE                  DeviceHandle;
    181   EFI_DEVICE_PATH_PROTOCOL    *DevicePath;
    182 
    183   EFI_SIMPLE_NETWORK_PROTOCOL Snp;
    184   EFI_SIMPLE_NETWORK_MODE     Mode;
    185 
    186   NT_NET_INTERFACE_INFO       InterfaceInfo;
    187 
    188   //
    189   //  Private functions
    190   //
    191 };
    192 
    193 #define SNP_NT32_INSTANCE_DATA_FROM_SNP_THIS(a) \
    194   CR ( \
    195   a, \
    196   SNPNT32_INSTANCE_DATA, \
    197   Snp, \
    198   SNP_NT32_INSTANCE_SIGNATURE \
    199   )
    200 
    201 extern EFI_DRIVER_BINDING_PROTOCOL    gSnpNt32DriverBinding;
    202 extern EFI_COMPONENT_NAME_PROTOCOL    gSnpNt32DriverComponentName;
    203 extern EFI_COMPONENT_NAME2_PROTOCOL   gSnpNt32DriverComponentName2;
    204 
    205 /**
    206   Test to see if this driver supports ControllerHandle. This service
    207   is called by the EFI boot service ConnectController(). In
    208   order to make drivers as small as possible, there are a few calling
    209   restrictions for this service. ConnectController() must
    210   follow these calling restrictions. If any other agent wishes to call
    211   Supported() it must also follow these calling restrictions.
    212 
    213   @param  This                Protocol instance pointer.
    214   @param  ControllerHandle    Handle of device to test
    215   @param  RemainingDevicePath Optional parameter use to pick a specific child
    216                               device to start.
    217 
    218   @retval EFI_SUCCESS         This driver supports this device
    219   @retval EFI_UNSUPPORTED     This driver does not support this device
    220 
    221 **/
    222 EFI_STATUS
    223 EFIAPI
    224 SnpNt32DriverBindingSupported (
    225   IN EFI_DRIVER_BINDING_PROTOCOL  * This,
    226   IN EFI_HANDLE                   ControllerHandle,
    227   IN EFI_DEVICE_PATH_PROTOCOL     * RemainingDevicePath OPTIONAL
    228   );
    229 
    230 /**
    231   Start this driver on ControllerHandle. This service is called by the
    232   EFI boot service ConnectController(). In order to make
    233   drivers as small as possible, there are a few calling restrictions for
    234   this service. ConnectController() must follow these
    235   calling restrictions. If any other agent wishes to call Start() it
    236   must also follow these calling restrictions.
    237 
    238   @param  This                 Protocol instance pointer.
    239   @param  ControllerHandle     Handle of device to bind driver to
    240   @param  RemainingDevicePath  Optional parameter use to pick a specific child
    241                                device to start.
    242 
    243   @retval EFI_SUCCESS          Always succeeds.
    244 
    245 **/
    246 EFI_STATUS
    247 EFIAPI
    248 SnpNt32DriverBindingStart (
    249   IN EFI_DRIVER_BINDING_PROTOCOL  * This,
    250   IN EFI_HANDLE                   ControllerHandle,
    251   IN EFI_DEVICE_PATH_PROTOCOL     * RemainingDevicePath OPTIONAL
    252   );
    253 
    254 /**
    255   Stop this driver on ControllerHandle. This service is called by the
    256   EFI boot service DisconnectController(). In order to
    257   make drivers as small as possible, there are a few calling
    258   restrictions for this service. DisconnectController()
    259   must follow these calling restrictions. If any other agent wishes
    260   to call Stop() it must also follow these calling restrictions.
    261 
    262   @param  This              Protocol instance pointer.
    263   @param  ControllerHandle  Handle of device to stop driver on
    264   @param  NumberOfChildren  Number of Handles in ChildHandleBuffer. If number of
    265                             children is zero stop the entire bus driver.
    266   @param  ChildHandleBuffer List of Child Handles to Stop.
    267 
    268   @retval EFI_SUCCESS       Always succeeds.
    269 
    270 **/
    271 EFI_STATUS
    272 EFIAPI
    273 SnpNt32DriverBindingStop (
    274   IN  EFI_DRIVER_BINDING_PROTOCOL  *This,
    275   IN  EFI_HANDLE                   ControllerHandle,
    276   IN  UINTN                        NumberOfChildren,
    277   IN  EFI_HANDLE                   *ChildHandleBuffer
    278   );
    279 
    280 /**
    281   Initialize the driver's global data.
    282 
    283   @param  This                  Pointer to the global context data.
    284 
    285   @retval EFI_SUCCESS           The global data is initialized.
    286   @retval EFI_NOT_FOUND         The required DLL is not found.
    287   @retval EFI_DEVICE_ERROR      Error initialize network utility library.
    288   @retval EFI_OUT_OF_RESOURCES  Out of resource.
    289   @retval other                 Other errors.
    290 
    291 **/
    292 EFI_STATUS
    293 SnpNt32InitializeGlobalData (
    294   IN OUT SNPNT32_GLOBAL_DATA *This
    295   );
    296 
    297 /**
    298   Initialize the snpnt32 driver instance.
    299 
    300   @param  This                  Pointer to the SnpNt32 global data.
    301   @param  Instance              Pointer to the instance context data.
    302 
    303   @retval EFI_SUCCESS           The driver instance is initialized.
    304   @retval other                 Initialization errors.
    305 
    306 **/
    307 EFI_STATUS
    308 SnpNt32InitializeInstanceData (
    309   IN SNPNT32_GLOBAL_DATA        *This,
    310   IN OUT SNPNT32_INSTANCE_DATA  *Instance
    311   );
    312 
    313 /**
    314   Close the SnpNt32 driver instance.
    315 
    316   @param  This                  Pointer to the SnpNt32 global data.
    317   @param  Instance              Pointer to the instance context data.
    318 
    319   @retval EFI_SUCCESS           The instance is closed.
    320 
    321 **/
    322 EFI_STATUS
    323 SnpNt32CloseInstance (
    324   IN SNPNT32_GLOBAL_DATA        *This,
    325   IN OUT SNPNT32_INSTANCE_DATA  *Instance
    326   );
    327 
    328 #endif
    329